我有代碼應該顯示tkinter小部件(注意:尚未實現)和另一個線程之間的通信。由於這兩者之間的溝通,我選擇了Python隊列。要查看實際發生的情況,在控制檯中會顯示print,這不是我所期望的。tkinter線程通信
可以看出在睡眠時間後的控制檯輸出generate_text
從process
輸出顯示。我期望的是,因爲generate_text
比較慢,所以process
我會看到很多process is called
,然後Item x
,但是這沒有發生。
import tkinter as tk
import threading
import queue
import time
def generate_text(storage):
count = 0
while True:
message = "Item {}".format(count)
storage.put(message)
print(message)
count +=1
time.sleep(3000/1000)
def process(storage):
print("process is called")
try:
storage.get()
except queue.Empty:
print("queue empty")
# register awake function
root.after(500, process, message)
# init variables
message = queue.Queue()
root = tk.Tk()
t = threading.Thread(target=generate_text, args=(message,))
t.setDaemon(True)
t.start()
root.after(500, process, message)
root.mainloop()
輸出:
項0
過程稱爲
過程稱爲
第1個
過程稱爲
第2個
過程稱爲
第3項
過程被稱爲...
希望的輸出: 項0
過程稱爲
過程稱爲
過程稱爲
過程稱爲
過程稱爲
過程稱爲
第1項
不應該'root.after'函數調用(你'process'函數內部)使用'storage',而不是'message'? – Himal
@即使使用'storage'變量而不是'message',日常行爲也是一樣的 – flebas