我想设置一个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