всплывающее окно pygtk выполняется не в порядке - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть меню pygtk, в котором функция вызывается при щелчке по пункту меню, в этой функции я показываю всплывающее окно для пользователя, говорящее «подождите» при проверке интернет-соединения, а затем вызываю функцию, которая проверяет интернет-соединение,

Моя проблема в том, что мои программы сначала вызывают функцию проверки интернет-соединения, а затем, после завершения вызова функции, показывают всплывающее окно,

Я пытался положить,

 while gtk.events_pending():     
      gtk.main_iteration_do(False)

Показывает всплывающее окно размытия, которое зависает до тех пор, пока мой вызов функции не будет завершен, а затем очищается.

мой код выглядит примерно так:

dialog = gtk.MessageDialog(
        parent         = None,
        flags          = gtk.DIALOG_DESTROY_WITH_PARENT,
        type           = gtk.MESSAGE_INFO,
        buttons        = gtk.BUTTONS_NONE,
        message_format = None)
        dialog.set_markup("Please wait while checking internet connectivity")
        dialog.set_title('Checking internet')
        dialog.set_position(gtk.WIN_POS_CENTER)
        dialog.connect('response', self.show_hide, dialog )
        dialog.show()
        gobject.timeout_add(5, self.show_hide, dialog)
 try :
        netStatus = check_network()
 except Exception, excp:
        print excp

Может кто-нибудь сказать мне, что не так ?? Заранее спасибо ...

Ответы [ 2 ]

0 голосов
/ 30 сентября 2011

Вам необходимо провести рефакторинг check_network (), чтобы сделать его неблокирующим.

Вместо того, чтобы делать блокирующий вызов для какого-либо сокета, используйте gobject.io_add_watch () , чтобы зарегистрировать обратный вызов, о котором будет сообщено, как только данные будут готовы для сокета. В этом обратном вызове вы можете обновить или уничтожить всплывающее окно.

В Linux GTK, скорее всего, будет использовать системный вызов select за сценой, который может ожидать любое количество событий дескриптора файла с таймаутом, включая сокеты и FIFO (в случае, если вы порождаете подпроцесс ).

Эта концепция называется "программированием на основе событий". У вас есть только один поток выполнения. Почти каждый графический интерфейс работает таким образом. Идея заключается в том, что вы никогда не будете делать ничего, что может занять больше нескольких миллисекунд. Это отличная концепция, потому что она позволяет избежать всех проблем, возникающих при синхронизации действительно параллельных потоков.

0 голосов
/ 29 сентября 2011

Основной цикл вызывает ваш обработчик для пункта меню и ждет его возврата, прежде чем он сделает что-либо еще, включая закрытие меню, чтобы ваш диалог мог получить фокус.

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

...