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() чтобы позволить программе реагировать на события.

Другие вопросы по тегам