彼らはただつのスレッドとあなたのコードのdoesntの仕事からのTkを使用するのTcl/Tkのスレッドモデルに違反するとして、あなたがメインを占めていたので、スレッドとTkは、よく混ぜていない(唯一無二)糸!
>>> print('**** Active threads: %d ****' % threading.active_count())
**** Active threads: 1 ****
をだからあなたが本当にちょうど別のものを作成している必要なもの:GUIはそのためunresponsibleであり、あなたがあなたのコード内の別のprint
で簡単にそれを確認することができます - あなたの印刷機能ながら
は、印刷を続けます!
try:
import tkinter as tk
from tkinter import messagebox as msgbox
except ImportError:
import Tkinter as tk
import TkMessageBox as msgbox
import threading
def setInterval(func,time,args):
e = threading.Event()
while not e.wait(time):
print('**** Active threads: %d ****' % threading.active_count())
func(args)
def foo(data):
print(data)
aa("what")
def aa(a):
print(a)
root = tk.Tk()
print('**** Active threads: %d ****' % threading.active_count())
thread = threading.Thread(target=setInterval, args=(foo, 5, "fsrty"))
msgbox.showinfo("Regret", "nope")
thread.start()
root.mainloop()
しかし、ここでは別の問題だ - (あなたがmainloop
をエスケープする場合)のスレッドがあなたの近くにGUIの後でも実行し続けます!あなたが何か簡単なものを達成しようとしているなら - .after()
はオプションです(すばやく小さな代替)。
スレッドオブジェクトのカスタムサブクラスを作成(オーバーライド)することで、この問題を執拗に、または本当に必要とする場合は、フローを柔軟に制御できます。
try:
import tkinter as tk
from tkinter import messagebox as msgbox
except ImportError:
import Tkinter as tk
import TkMessageBox as msgbox
import threading
class Thread(threading.Thread):
def __init__(self):
super(Thread, self).__init__()
self.running = False
self.function_to_execute = None
self._stop = threading.Event()
def start_thread(self, func, *args, **kwargs):
self.function_to_execute = (func, args, kwargs)
self.running = True
self.start()
def run(self):
print('### STARTED ###')
while self.running:
try:
print('### RUNNING ###')
function, args, kwargs = self.function_to_execute
function(*args, **kwargs)
except:
self.stop()
def stop(self):
print('### STOPPING ###')
self.running = False
self._stop.set()
def setInterval(func, time, args):
e = threading.Event()
e.wait(time)
print('**** Active threads: %d ****' % threading.active_count())
func(args)
def foo(data):
print(data)
aa('what')
def aa(a):
print(a)
def clear():
thread.stop()
while True:
try:
thread.is_alive()
except TypeError:
root.destroy()
print('### STOPPED ###')
print('**** Active threads: %d ****' % threading.active_count())
break
root = tk.Tk()
thread = Thread()
print('**** Active threads: %d ****' % threading.active_count())
msgbox.showinfo("Regret", "nope")
thread.start_thread(setInterval, foo, 5, 'fsrty')
root.protocol('WM_DELETE_WINDOW', clear)
root.mainloop()
ご覧のとおり、終了する前に削除しようとすると操作が複雑になりますが、機能しています。
結論:シンプルなもののために
- から
.after()
は良いオプションです!
- 複雑で長く実行されるものについて -
threading
はあなたの選択です!
リンク:
それが役立つたくさんありがとう私のたくさん –