Принудительное размещение виджета внизу вертикального поляPython

Программы на Python
Ответить
Anonymous
 Принудительное размещение виджета внизу вертикального поля

Сообщение Anonymous »

Я делаю небольшую программу на Python/Gtk4. Компоновка относительно проста: есть верхняя зона с входами и кнопкой «добавить», затем ColumnView, отображающий добавленные элементы, и, наконец, ряд кнопок для выполнения операций над элементами. Я бы хотел, чтобы кнопки всегда находились в нижней части окна, независимо от размера окна и среднего ColumnView.
Я пытался использовать set_valign(Gtk.Align.FILL) для ComumnView и прокручиваемого окна, которое его содержит, и использовать set_valign(Gtk.Align.END) для горизонтального блока, содержащего кнопки, но set_valign, похоже, не работает иметь какой-либо эффект.
Вот как это сейчас выглядит для небольшой демо-версии:
как это выглядит сейчас
И вот как это должно выглядеть:
как это должно выглядеть
Вот код для урезанной демо-версии, в которой наблюдается та же проблема:
#!/usr/bin/python3

import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk, Gio, GObject, GLib

class TestItem(GObject.Object):
__gtype_name__ = "TestItem"
name = GObject.Property(type=str)
value = GObject.Property(type=int)

def __init__(self, name: str, value: int):
super().__init__()
self.name = name
self.value = value

def make_table_column(title, field):
"""
Make a column for a field
"""
template = b"""





GtkListItem






""" % (field.encode('ascii'),)
template = GLib.Bytes.new(template)
factory = Gtk.BuilderListItemFactory.new_from_bytes(None, template)
col = Gtk.ColumnViewColumn(title = title, factory = factory,
resizable = True)
return col

class Test(Gtk.ApplicationWindow):
def __init__(self, **kargs):
super().__init__(**kargs, title="Test")

vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)

control = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5)
control.append(Gtk.Label(label = "Name:"))
self.name = Gtk.Entry()
control.append(self.name)
control.append(Gtk.Label(label = "Value:"))
self.value = Gtk.SpinButton.new_with_range(1, 100, 1)
control.append(self.value)
button = Gtk.Button.new_from_icon_name('list-add')
button.connect("clicked", self.add)
control.append(button)
vbox.append(control)

self.model = Gio.ListStore(item_type = TestItem)
view = Gtk.ColumnView()
self.selection = Gtk.NoSelection(model = self.model)
view.set_model(self.selection)

view.append_column(make_table_column("Item name", 'name'))
view.append_column(make_table_column("Value", 'value'))

scroll = Gtk.ScrolledWindow()
scroll.set_child(view)
scroll.set_propagate_natural_width(True)
scroll.set_propagate_natural_height(True)
scroll.set_valign(Gtk.Align.FILL)
vbox.append(scroll)

buttons = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5)
buttons.set_valign(Gtk.Align.END)
clear = Gtk.Button.new_from_icon_name('edit-clear')
clear.connect("clicked", self.clear)
clear = Gtk.Button.new_from_icon_name('list-add')
clear.connect("clicked", self.increase)
buttons.append(clear)
vbox.append(buttons)
vbox.set_valign(Gtk.Align.FILL)

self.set_child(vbox)
self.set_default_size(600, 400)

def add(self, _widget):
name = self.name.get_buffer().get_text()
value = int(self.value.get_value())
item = TestItem(name, value)
self.model.insert(0, item)

def increase(self, _widget):
for item in self.model:
item.value += 1

def clear(self, _widget):
self.model.remove_all()

def on_activate(app):
win = Test(application=app)
win.present()

app = Gtk.Application(application_id='org.kilobug.test')
app.connect('activate', on_activate)
app.run(None)


Подробнее здесь: https://stackoverflow.com/questions/798 ... rtical-box
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»