(старенькая вопрос, но он заслуживает ответа)
Хотя pmoleri дал приемлемый ответ (который, как я первоначально обрабатывается этот случай), я считаю, что это своего рода разочарование, чтобы добавить функцию обратного вызова, потому что запутывает программный поток. Неплохо иметь окно, которое действует как gtk.Dialog, где вы можете вызвать window.run(), и он будет блокироваться там, пока вы не получите ответ, но графический интерфейс все равно будет работать. Вы можете сделать эту функциональность себя gtk.main():
import gtk
class BlockingWindow(gtk.Window):
def __init__(self,checkmark_values):
gtk.Window.__init__(self)
self.checkmarks = {}
# Create check marks here, put them in a dictionary
# relating their name to their widget
# Also create ok button
ok_button.connect("clicked",self.on_ok_button_clicked)
def on_ok_button_clicked(self,button):
gtk.main_quit()
def run(self):
self.show_all()
gtk.main()
self.destroy()
return dict((x,self.checkmarks[x].get_active()) for x in self.checkmarks)
blocking_window = BlockingWindow(["option1","option2"])
values = blocking_window.run()
print "option1 is {}".format(values["option1"])
print "option2 is {}".format(values["option2"])
gtk.main могут быть вложенными, так что эта модель будет работать даже внутри другого окна графического интерфейса, например, делать то же самое из вашего главного окна (очевидно, имя «запустить» не является особенным, вы можете переименовать его в нечто более подходящее, например «get_values» или что-то еще).
Что касается диалогового окна, вы можете сделать это, чтобы добавить виджеты в диалоговое окно, вы можете ссылаться на атрибут «vbox» диалогового окна, то есть self.vbox.pack_start(my_checkbox)
. Обычно я использую диалог в сочетании с этой техникой, поэтому мне не нужно создавать кнопки самостоятельно. В этом случае вместо подключения к clicked
по адресу ok_button
вы можете подключиться к response
в диалоговом окне (self
) и прочитать код ответа, чтобы узнать, что вы хотите вернуть, обычно устанавливая переменную объекта на значение ответа и обрабатывая ее обратно запустить, например return None
, если вы обнаружите, что пользователь нажал кнопку cancel.
Редактировать: Следует также упомянуть, что это работает не только для других окон, но и для любых действий, которые вы хотите заблокировать свой код, но не замерзаете графический интерфейс. Например, я использовал этот шаблон в сочетании с gobject.timeout_add
, чтобы анимировать индикатор выполнения, представляющий git cloning. Используя это, я смог создать единую функцию, которая клонировала бы репозитории n
, используя одиночный цикл for, вместо того, чтобы навязывать их вместе с обратными вызовами. На самом деле это очень мощный образец.
Большое спасибо. Очень полезно. – WiData