Могу ли я добавить элемент в код, чтобы я мог получить его позже через Gtk.Builder()?

Я использую Python 3+PyGObjects+Gtk.Builder У меня есть окно, которое я создаю из поляны:

builder = Gtk.Builder()
builder.add_from_file("main.ui")

Я создаю некоторые виджеты и добавляю их (я вижу это в окне):

switch = Gtk.Switch()
switch.set_name('test')

hBox = Gtk.HBox()
hBox.pack_start(switch, True, True, 10)

window = builder.get_object("MainWindow")
window.add(hBox)

В другой части программы у меня нет доступа к "переключателю", но есть "строитель". Я попробую:

switch = builder.get_object('test')
switch_active = switch.get_active()

Но получите ошибку:

AttributeError: 'NoneType' object has no attribute 'get_active'

Как я могу получить это от "строителя"?

2 ответа

Решение

Ты не можешь Builder может предоставлять только объекты, определенные в файле пользовательского интерфейса.

Вы должны изменить свою программу так, чтобы у вас был доступ к switch в той части, которая должна получить активное значение.

Другой вариант - назвать ваш контейнер в файле пользовательского интерфейса, извлечь контейнер в коде с помощью get_object и установить новый виджет в качестве его дочернего элемента. Затем найдите контейнер и попросите его дочерний элемент.

Еще один вариант: если вам требуется изменить один атрибут виджета во время выполнения (довольно часто, например, для полей со списком и древовидных представлений), вместо того, чтобы создавать его в коде и добавлять позже, вам лучше извлечь его из измененного пользовательского интерфейса. Это. В частности, вы можете изменить атрибут видимости, чтобы он мог отображаться в зависимости от контекста.

В заключение очень редко приходится создавать виджеты в коде при использовании GtkBuilder. Даже для добавленных виджетов вы можете создать каталог. Вы также можете иметь много GtkBuilders, если не хотите загружать все свои экраны одновременно.

Другие вопросы по тегам