Уничтожение окна Toplevel не позволяет приложению выйти из основного цикла

Я новичок в Tkinter. Я пытаюсь уничтожить окно Toplevel, и оно прекрасно разрушается, но после этого ничего не происходит. Курсор продолжает мигать в оболочке Python, как это происходит во время выполнения бесконечного цикла.

Вот мой код:

def error_msg(msg) :
    root1 = Tk.Toplevel()
    root1.attributes("-topmost", True)
    root1.title("Error")
    w1 = 230
    h1 = 100
    ws1 = root1.winfo_screenwidth()
    hs1 = root1.winfo_screenheight()
    x1 = (ws1/2) - (w1/2)
    y1 = (hs1/2) - (h1/2)
    root1.geometry('%dx%d+%d+%d' % (w1, h1, x1, y1))
    can1 = Tk.Canvas(root1,width = 230,height=100)
    can1.pack()
    im1 = Image.open("img.png")
    tkimage1 = ImageTk.PhotoImage(im1)
    Canvas_Image1 = can1.create_image(0,0, image=tkimage, anchor="nw")

    canvas_id1 = can1.create_text(15, 10, anchor="nw")
    can1.itemconfig(canvas_id1, text=msg)
    Tk.Button(root1, text='OK', command =root1.destroy).place(x=110,y=70)
    root1.mainloop()
    root1.quit()
    print 'lol'
    return None

error_msg("This is an error")
    print 'Help'

До этого у меня уже есть Tk() окно открыто, поэтому я использую Toplevel() окно.

При запуске я получаю окно, которое открывается и показывает сообщение. Я нажимаю на ОК, и все просто останавливается. 'lol' не печатает в оболочке и функция никогда не заканчивается (так как оператор return не достигается), следовательно, 'Help' также не печатается

Любая идея, почему это происходит??

Спасибо,

1 ответ

Решение

Для диалогового окна вместо создания нового mainloop, вы должны использовать wait_window(), Это ожидает, пока окно Toplevel не будет закрыто, а затем продолжит выполнение следующих строк.

Таким образом, вы должны заменить

root1.mainloop()
root1.quit()

с

root1.wait_window()

Дополнительные советы по созданию диалогового окна см. В этой статье на effbot.org.

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