我想設置一個tkinter窗口,我可以使用隊列與主循環外部進行交互。當我用spyder解釋這個時,它工作正常。在啓動()之後,我的Tk窗口出現,並且我仍然有控制檯訪問權限,允許我change_titre('whatever')來更改窗口的標題。使用線程在tkinter中保持控制檯控制
但是,關閉窗口是一個問題。它關閉正常,檢查mythread表明線程確實停止。但是,再次調用launch()將不會執行任何操作並阻止解釋器。我然後被迫重新啓動蟒蛇:(
有什麼需要清潔,防止我創建一個新的線程?從我在這裏看到的東西,tkinter不喜歡不在主要運行,這是什麼我在這裏做的,但爲什麼第一個實例工作呢?
我想能夠編寫一些像下面的change_titre這樣的低級函數(例如繪製基本的東西),然後允許用戶如果全部失敗,是否還有其他方法?
import tkinter as tk
from threading import Thread
#import threading
import queue
request_queue = None
master = None
mythread = None
def submit_to_tkinter(callable, *args, **kwargs):
request_queue.put((callable, args, kwargs))
return
def threadmain():
global master
master = tk.Tk()
master.title("stuff")
drawzone = tk.Canvas(master, width=300, height = 300, bg='white')
drawzone.pack()
def queueloop():
try:
callable, args, kwargs = request_queue.get_nowait()
except queue.Empty:
pass
else:
callable(*args, **kwargs)
master.after(500, queueloop)
queueloop()
master.mainloop()
def change_titre(text):
submit_to_tkinter(master.title,text)
return
def launch():
global mythread,request_queue
request_queue = queue.Queue()
mythread = Thread(target=threadmain, args=())
mythread.daemon=True
mythread.start()
第一個實例不適用於我,並導致python直接段錯誤。正如你所說,你不應該在主線程中的任何線程中運行Tkinter。這段代碼的目的是什麼,你想要它做什麼? – ebarr 2014-09-29 12:21:26
這是用於教學目的:我試圖讓學生使用我給他們的低級函數創建自己的函數。 – imj 2014-09-30 19:29:04