2013-05-20 3 views
0

Я использую PyGTK в другом приложении для ввода данных пользователя. Я создаю окно с множеством кнопок проверки, и в соответствии с ответом мне нужно идти вперед.Использование окна GTK и ожидание ответа

Проблема в том, что в python, когда я вызываю функцию окна и его работу, программа не ждет ответа из окна? Как заставить его ждать ответа из окна?

Я также не знаю, могу ли я использовать диалог вместо окна, потому что я попытался добавить кнопки проверки в диалог, и это не сработало. Если использование окна не подходит, может ли кто-нибудь помочь мне с диалогом?

Благодарим за помощь.

ответ

0

В этом ответе у вас есть пример использования функции обратного вызова: How can I pass variables between two classes/windows in PyGtk?

После подтверждения вызываемого окна, вы выполнить функцию обратного вызова окна вызывающего абонента/объекта.

+0

Большое спасибо. Очень полезно. – WiData

3

(старенькая вопрос, но он заслуживает ответа)

Хотя 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, вместо того, чтобы навязывать их вместе с обратными вызовами. На самом деле это очень мощный образец.

Смежные вопросы