单击“确定”后,Tkinter TkMessageBox未关闭

时间:2013-07-10 16:03:25

标签: python python-2.7 tkinter xfce

我在Python中创建了一个脚本,它在给定的事件中通知我。 我使用以下函数来生成警告窗口:

def window_warn():
    '''
    This function will throw up a window with some text
    '''
    #These two lines get rid of tk root window
    root = Tkinter.Tk()
    root.withdraw()
    #tkMessageBox.deiconify() 
    TkMessageBox.showwarning("New Case", "You have a new case\n Please restart pycheck")
    return

窗口绘制正常,但是当我单击确定时,窗口会在按下按钮的情况下保持原位。我正在使用xfce。 无论如何在点击确定后让窗口关闭?

评论表明这可能与周围的代码有关,所以为了完整性:

print "Just started newcase check"
while True:
    if "Uncommitted" in webpage:
        print "oh look, 'Uncommitted' is in the url returned from the last function"
        #If this hits we call a notification window
        window_warn()
        print "sleeping"
        time.sleep(10)

        webpage = scrape_page()
    else:
        print "nothing"
        time.sleep(20)
        webpage = scrape_page()

5 个答案:

答案 0 :(得分:6)

在从函数返回之前尝试调用root.update()。这将处理所有未决的Tk / X窗口事件。

(理想情况下,您在显示窗口之前建立一个主事件循环,但这假设您的整个程序是事件驱动的,这可能并不总是有效。)

答案 1 :(得分:0)

您必须致电root.mainloop()以启用程序以响应事件。

答案 2 :(得分:0)

代码的一个问题是,每次调用函数window_warn时都会创建一个新的Tk元素。这可能不是您的问题的原因,但创建多个Tk元素是一种应该避免的不良做法。例如,在开头初始化根元素,只留下对showwarning

的调用
root = Tkinter.Tk()
root.withdraw()

def window_warn():
    '''This function will throw up a window with some text'''
    tkMessageBox.showwarning("New Case", "You have a new case\n Please restart pycheck")
    return

print "Just started newcase check"
while True:
    # ...

答案 3 :(得分:0)

我这样做了:

import Tkinter as tk
import tkMessageBox
root = tk.Tk()
root.withdraw()
t = tkMessageBox.askyesno ('Title','Are you sure?')
if t:
    print("Great!!!")
    root.update()
else:
    print("Why?")
    root.update()

答案 4 :(得分:0)

另一个解决方案是跟踪tk.messagebox是否已经发生,以及是否刚刚中断/继续/传递以跳过重新发生的tk.messagebox

Flag = False
if Flag: 
    messagebox.showerror("Error", "Your massage here.")
    Flag = True
else:
    break

我提出这个问题是因为我在StackOverflow上提出的其他解决方案存在问题,因为我没有专门的root.mainloop()但只有self.mainloop()中的Root()

我的root看起来像这样,按摩事件是在一些内部类中生成的,我无法访问self.root:

    class Root(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            ....
            class 1..
            class 2..
            self.mainloop()