Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tk().draw()是否适合从线程运行?_Python_Python 2.7_Tkinter_Tkmessagebox - Fatal编程技术网

Python Tk().draw()是否适合从线程运行?

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的主空白窗口将出现在显示的对话框旁边,用户的最后一个选择似乎会在以后被记住(这是不需要的) 考

我正在python应用程序中实现剪贴板监视器。如果复制的文本满足某些要求,我想向用户显示一个对话框。如果用户单击“是”,我想触发一个函数-在这种情况下
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和队列的答案,但目的不同: