2009-12-11 3 views
1

Мое намерение состояло в том, чтобы использовать основной цикл pyGTK для создания функции, которая блокируется, пока она ждет ввода пользователя. Проблема я столкнулся лучше всего объясняется в коде:Блокировка основного контура PyGTK

#! /usr/bin/python 

import gtk 

def test(): 
    retval = True 
    def cb(widget): 
     retval = False 
     gtk.main_quit() 

    window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
    button = gtk.Button("Test") 
    button.connect("clicked", cb) 
    button.show() 
    window.add(button) 
    window.show() 

    gtk.main() 
    return retval 

if __name__ == "__main__": 
    print test() # prints True when the button is clicked 

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

Есть ли способ обойти это, или это просто плохой дизайн с моей стороны?

ответ

2

Что происходит, когда python видит foo = bar в качестве первой ссылки на foo в функции, она предполагает, что это локальная переменная. В python3k вы можете обойти это, используя ключевое слово nonlocal. Для 2.x вы можете обернуть свой retval в список, чтобы вы не напрямую его назначали.

retval = [True] 
def cb(widget): 
    retval[0] = False 
    gtk.main_quit() 
... 
return retval[0] 

не очень элегантное решение, следовательно, добавление нелокальна в 3.х (PEP)

+0

hmm .. Что делать, если я использую 2.6? – int3

+0

Действительно, исправил это, спасибо! PEP, к которому вы привязаны, также предоставляет другое решение (используя класс «Namespace»). Я должен решить, что менее уродливо: P – int3

2

Это диалог шаблон. Используйте gtk.Dialog. Dialog.run() блокирует именно то, как вам это нужно, и возвращает код возврата диалогового окна.

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