python + twisted + gtk: KeyboardInterrupt вызывает свободную переменную? - PullRequest
0 голосов
/ 26 августа 2010

Я использую Twisted с GTK, и следующий код запускается, когда не удается установить соединение:

def connectionFailed(self, reason):
    #show a "connect failed" dialog
    dlg = gtk.MessageDialog(
        type=gtk.MESSAGE_ERROR,
        buttons=gtk.BUTTONS_CLOSE,
        message_format="Could not connect to server:\n%s" % (
            reason.getErrorMessage()))
    responseDF = defer.Deferred()
    dlg.set_title("Connection Error")
    def response(dialog, rid):
        dlg.hide_all()
        responseDF.callback(rid)
    dlg.connect("response", response)
    dlg.show_all()

    self.shutdownDeferreds.append(responseDF)

self.shutdownDeferreds - это список отсрочек, который настроен так, что реактор не останавливается, пока все они не будут вызваны.

Теперь я случайно нажал CTRL+C в то время, когда не удалось установить соединение. Диалог всплыл, но когда я нажимаю Close, я получаю:

Traceback (most recent call last):
  File "C:\Users\DrClaud\bumhunter\gui\controller.py", line 82, in response
    dlg.hide_all()
NameError: free variable 'dlg' referenced before assignment in enclosing scope
Traceback (most recent call last):
  File "C:\Users\DrClaud\bumhunter\gui\controller.py", line 82, in response
    dlg.hide_all()
NameError: free variable 'dlg' referenced before assignment in enclosing scope

Есть идеи, почему это может произойти?

1 Ответ

1 голос
/ 26 августа 2010

Разве это не должно быть:

def response(dialog, rid):
    dialog.hide_all()
    responseDF.callback(rid)

или действительно, для ясности,

def response(self, rid):
    self.hide_all()
    responseDF.callback(rid)

(Возможно, я ошибаюсь, я почти не использовал GTK.) Если это так, проблема в том, что вы ссылаетесь на dlg в функции, которая делает ее закрытием (она захватывает dlg из своего окружающая сфера). KeyboardInterrupt вызовет странное и чудесное поведение, потому что оно может разрушить эту область.

...