"RuntimeError: main thread is not in main loop"
Zaten bazı googling yaptık hatayı olsun, ancak bir yapıyorum Bir şekilde hata ... Birisi bana yardım edebilir mi?
Tam hatası:
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
Sınıflar: Sen ana iş parçacığı dışında dizisindeki ana GUI döngü koşuyoruz
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
Geri izlemenizden, "workerGuiThread" işlevini, yürütme işleminin ana yerine başka bir yerde oluşturduğunuz bir iş parçacığından çalıştırıyormuşsunuz gibi görünüyor. TK uzmanı değilim, ama hataya izin verilmediğini gösteriyor gibi görünüyor (ana dizgeyi kullanmak için TK işlevlerini çağırmak zorundasınız, 'sonra' gibi). – Blckknght
[Bu soru] bölümüne bakın (http://stackoverflow.com/questions/3567238/i-need-a-little-help-with-python-tkinter-and-threading), [bu yanıt] (http: // stackoverflow TkInter'ın çok iş parçacıklı bir programda kullanılmasıyla ilgili bazı ayrıntılar için .com/a/10556698/908494) vb. Ama kısa versiyon: Sadece ana thread, period'ta kullanın. – abarnert
Hey Blckknght. Bu yüzden mtTkinter kullanıyorum. – user2040823