我在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()
答案 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()