2009-11-12 11 views
1

Je lance une application utilisant twisted et tkinter qui envoie le résultat au serveur, attend que le serveur renvoie une confirmation, puis quitte. Ainsi, la fonction que j'utilise pour la sortie est la suivante:Le programme Twisted/tkinter se bloque à la sortie

def term(): 
    '''To end the program''' 
    reactor.stop() 
    root.quit() 
    root.destroy() 

Il est ensuite réglé en usine et a appelé dans la fonction dataReceived du protocole. Je le lance, et le programme fonctionne bien et envoie même les données nécessaires et ferme, mais il me donne aussi le rapport d'erreur suivant:

Unhandled error in Deferred: 
Traceback (most recent call last): 
    File "D:\Python25\Lib\site-packages\twisted\internet\base.py", line 1128, in run 
    self.mainLoop() 
    File "D:\Python25\Lib\site-packages\twisted\internet\base.py", line 1137, in mainLoop 
    self.runUntilCurrent() 
    File "D:\Python25\Lib\site-packages\twisted\internet\base.py", line 757, in runUntilCurrent 
    call.func(*call.args, **call.kw) 
    File "D:\Python25\Lib\site-packages\twisted\internet\task.py", line 114, in __call__ 
    d = defer.maybeDeferred(self.f, *self.a, **self.kw) 
--- <exception caught here> --- 
    File "D:\Python25\Lib\site-packages\twisted\internet\defer.py", line 106, in maybeDeferred 
    result = f(*args, **kw) 
    File "D:\Python25\lib\lib-tk\Tkinter.py", line 917, in update 
    self.tk.call('update') 
_tkinter.TclError: can't invoke "update" command: application has been destroyed 

Est-ce que quelqu'un sait pourquoi?

Répondre

1

Vous devez seulement appeler reactor.stop pour quitter: les appels root.quit() et root.destroy() sont superflus. Considérez ce court exemple qui court Twisted et Tk pendant trois secondes, puis quitte:

import Tkinter 
from twisted.internet import tksupport 

root = Tkinter.Tk() 
tksupport.install(root) 

from twisted.internet import reactor 
reactor.callLater(3, reactor.stop) 
reactor.run() 
+0

Cela ne me pose plus de problèmes, merci. – Nikwin