Tkinter TkMessageBox не закрывается после нажатия OK
Я создал скрипт на 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 ответов
Попробуйте позвонить root.update()
прежде чем вернуться из функции. Это обработает все ожидающие события окна Tk/X.
(в идеале вы должны установить основной цикл событий перед отображением окна, но это предполагает, что вся ваша программа управляется событиями, что может не всегда работать.)
Я сделал это так:
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()
Другое решение состоит в том, чтобы отслеживать, если tk.messagebox
произошло, и если он просто сломал / продолжить / пройти, чтобы пропустить повторное возникновение tk.messagebox
:
Flag = False
if Flag:
messagebox.showerror("Error", "Your massage here.")
Flag = True
else:
break
Я предлагаю это, потому что у меня были проблемы с другими решениями, предложенными в Stackru, так как у меня нет выделенного root.mainloop()
но есть только self.mainloop()
в классе Root()
Мой корень выглядит так, и событие массажа создается в некоторых внутренних классах, где у меня нет доступа к self.root:
class Root(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
....
class 1..
class 2..
self.mainloop()
Одна проблема в вашем коде заключается в том, что вы создаете новый элемент Tk каждый раз, когда вызываете функцию window_warn
, Это может не быть причиной вашей проблемы, но создание нескольких элементов 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:
# ...
Вы должны позвонить root.mainloop()
чтобы позволить программе реагировать на события.