RuntimeError: thread principal n'est pas dans la boucle principale

Quand je l'appelle

self.client = ThreadedClient() 

dans mon programme en Python, j'obtiens l'erreur

"RuntimeError: thread principal n'est pas dans la boucle principale"

J'ai déjà fait quelques recherches sur google, mais je fais une erreur quelque sorte ... quelqu'un Peut-il m'aider?

D'erreur complet:

Exception in thread Thread-1:
    Traceback (most recent call last):
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 530, in __bootstrap_inner
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 483, in run
    File "/Users/Wim/Bird Swarm/bird_swarm.py", line 156, in workerGuiThread
    self.root.after(200, self.workerGuiThread)
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 501, in after
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1098, in _register
    RuntimeError: main thread is not in main loop

Classes:

class ThreadedClient(object):
def __init__(self):
self.queue = Queue.Queue( )
self.gui = GuiPart(self.queue, self.endApplication)
self.root = self.gui.getRoot()
self.running = True
self.GuiThread = threading.Thread(target=self.workerGuiThread) 
self.GuiThread.start()
def workerGuiThread(self):
while self.running:
self.root.after(200, self.workerGuiThread)
self.gui.processIncoming( )     
def endApplication(self): 
self.running = False
def tc_TekenVogel(self,vogel):
self.queue.put(vogel)
class GuiPart(object):
def __init__(self, queue, endCommand): 
self.queue = queue
self.root = Tkinter.Tk()
Tkinter.Canvas(self.root,width=g_groottescherm,height=g_groottescherm).pack()
Tkinter.Button(self.root, text="Move 1 tick", command=self.doSomething).pack()
self.vogelcords = {} #register of bird and their corresponding coordinates 
def getRoot(self):
return self.root
def doSomething():
pass #button action
def processIncoming(self):
while self.queue.qsize( ):
try:
msg = self.queue.get(0)
try:
vogel = msg
l = vogel.geeflocatie()
if self.vogelcords.has_key(vogel):
cirkel = self.vogelcords[vogel]
self.gcanvas.coords(cirkel,l.geefx()-g_groottevogel,l.geefy()-g_groottevogel,l.geefx()+g_groottevogel,l.geefy()+g_groottevogel)            
else:
cirkel = self.gcanvas.create_oval(l.geefx()-g_groottevogel,l.geefy()-g_groottevogel,l.geefx()+g_groottevogel,l.geefy()+g_groottevogel,fill='red',outline='black',width=1)
self.vogelcords[vogel] = cirkel 
self.gcanvas.update()
except:
print('Failed, was van het type %' % type(msg))
except Queue.Empty:
pass
À partir de votre traceback, on dirait que vous êtes l'exécution de la workerGuiThread à partir d'un thread que vous êtes la création d'ailleurs, au lieu de le thread principal d'exécution. Je ne suis pas un TK expert, mais l'erreur semble suggérer que ce n'est pas autorisé (vous devez utiliser le thread principal pour appeler les SAVOIRS traditionnels fonctions, comme after).
Voir cette question, cette réponse, etc. pour plus de détails sur l'utilisation de TkInter dans un programme multithread. Mais la version courte est: à utiliser Uniquement dans le thread principal, période.
Hey Blckknght. À cet effet, je suis en utilisant mtTkinter.

OriginalL'auteur user2040823 | 2013-02-04