是Tk()。withdraw()适合从一个线程运行?

时间:2013-05-06 12:31:30

标签: python python-2.7 tkinter tkmessagebox

我正在我的python应用程序中实现剪贴板监视器。如果复制的文本符合某些要求,我想向用户显示一个对话框。如果用户点击“是”,我想触发一个功能 - 在这种情况下webui.app.add_internal(cb)。如果用户选择“否”,我想继续以3秒的间隔检查剪贴板的更改。

一切似乎都运行良好,但是这段代码并没有像我期望的那样反复不间断地运行。稍微调查一下,Tk().withdraw()似乎是有问题的路线。虽然没有它,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();

有什么建议可以做得更好吗?我正在考虑如何在不需要撤销方法的情况下显示对话框,或者更安全的方式将其与线程一起使用。任何帮助

1 个答案:

答案 0 :(得分:2)

不,你不能从主线程以外的其他线程调用withdraw()