"RuntimeError: main thread is not in main loop"
は、私はすでにいくつかのグーグルを行っているエラーを取得しますが、私は作っていますどういうわけか...誰かが私を助けてくれますか?
全エラー:
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
クラス:
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
トレースバックからは、実行のメインスレッドからではなく、他の場所に作成しているスレッドから 'workerGuiThread'を実行しているようです。私はTKのエキスパートではありませんが、エラーはこれが許可されていないことを示唆しているようです(メインスレッドを使って 'after'のようなTK関数を呼び出す必要があります)。 – Blckknght
[この質問](http://stackoverflow.com/questions/3567238/i-need-a-little-help-with-python-tkinter-and-threading)、[この回答](http:// stackoverflow .com/a/10556698/908494)など、マルチスレッドプログラムでのTkInterの使用に関するいくつかの詳細については、こちらをご覧ください。しかし、短いバージョンです:メインスレッドでのみ、期間を使用します。 – abarnert
Hey Blckknght。そのため私はmtTkinterを使用しています。 – user2040823