Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
384 views
in Technique[技术] by (71.8m points)

python - mtTkinter doesn't terminate threads

I need to run some simple function in multi-threading with a Tkinter GUI, so I've tried mtTkinter.

Everything works fine except for a particular: even if I just start the GUI and then I close it without touching nothing some thread keeps running.

In other words; I have this code:

from Tkinter import *
root = Tk()

#simple GUI code with buttons, labels, text and scrollbars widget
...
...    
root.mainloop()

If I run this code the GUI appears and when I close it this python script ends successfully.

Now if I replace Tkinter with mtTkinter

from mtTkinter import *
root = Tk()

#simple GUI code with buttons, labels, text and scrollbars widget
...
...    
root.mainloop()

the GUI appears once again, but if I close it there is still some thread from mtTkinter that keeps running!

Any help would be apprecied, thank you in advance and sorry for my bad english!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I ran into a similar problem for my application (https://github.com/joecole889/spam-filter). After some investigation, I realized that when I close my application Tkinter (or possibly Matplotlib) uses a threading._DummyThread instance to delete one of the widgets. I have a Matplotlib graph in a Tkinter canvas widget in my application. In any case, it looks like an “image delete” event is added to the event queue and mtTkinter blocks waiting for a response on the responseQueue that never comes.

I was able to fix the problem by allowing events from instances of threading._DummyThread to run without going through the queue infrastructure of mtTkinter. That is, I changed:

if threading.currentThread() == self._tk._creationThread:

to

if (threading.currentThread() == self._tk._creationThread) or 
   isinstance(threading.currentThread(), threading._DummyThread) :

Things seem to be working for me now...hope this helps!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...