Python Tk().draw()是否适合从线程运行?
我正在python应用程序中实现剪贴板监视器。如果复制的文本满足某些要求,我想向用户显示一个对话框。如果用户单击“是”,我想触发一个函数-在这种情况下Python Tk().draw()是否适合从线程运行?,python,python-2.7,tkinter,tkmessagebox,Python,Python 2.7,Tkinter,Tkmessagebox,我正在python应用程序中实现剪贴板监视器。如果复制的文本满足某些要求,我想向用户显示一个对话框。如果用户单击“是”,我想触发一个函数-在这种情况下webui.app.add\u internal(cb)。如果用户选择“否”,我只想每隔3秒检查剪贴板上的更改 一切似乎都很正常,但这段代码并不像我预期的那样不间断地重复运行。稍微调查一下就会发现,Tk().draw()似乎是有问题的一行。尽管没有它,Tk的主空白窗口将出现在显示的对话框旁边,用户的最后一个选择似乎会在以后被记住(这是不需要的) 考
webui.app.add\u internal(cb)
。如果用户选择“否”,我只想每隔3秒检查剪贴板上的更改
一切似乎都很正常,但这段代码并不像我预期的那样不间断地重复运行。稍微调查一下就会发现,Tk().draw()
似乎是有问题的一行。尽管没有它,Tk的主空白窗口将出现在显示的对话框旁边,用户的最后一个选择似乎会在以后被记住(这是不需要的)
考虑以下代码:
import pyperclip
import tkMessageBox, Tkinter
import threading
cbOld = "notAurl"
def catchClipboardChange():
global cbOld
cb = pyperclip.paste()
Tkinter.Tk().withdraw()
if (cb != cbOld):
#Change in clipboard detected. Analize!
if (urlValidation(cb) and isDownloadExt(cb) and tkMessageBox.askyesno("Start downloading?","Do you want to start downloading {}".format(cb))):
webui.app.add_internal(cb)
cbOld = cb # Old clipboard update
threading.Timer(3.0,catchClipboardChange).start()
catchClipboardChange();
有什么建议可以做得更好吗?我在考虑如何在不需要提取方法的情况下显示对话框,或者更安全地将其与线程一起使用。通知任何帮助否,您不能从主线程以外的其他线程调用
draw()
。为什么?那么你建议怎么做呢?@user1555863:为什么?这就是它的设计方式;您只能在创建小部件的同一线程中调用该小部件的函数。您需要设置一个线程安全队列,在这里您可以发布主线程的请求,然后从主线程轮询队列并执行请求。谢谢。你能提供一个例子来说明这是如何在某处完成的吗?@user1555863:这个网站上有几个例子,只需进行一点搜索。这里有一个使用Tkinter和队列的答案,但目的不同: