【问题标题】:Destroying Toplevel window doesn't let the application come out of the main loop销毁顶层窗口不会让应用程序退出主循环
【发布时间】:2015-06-04 11:32:39
【问题描述】:

我是 Tkinter 的新手。我正在尝试破坏 Toplevel 窗口,它被完美地破坏,但之后没有任何运行。光标在 python shell 中一直闪烁,因为它在运行无限循环时发生。

这是我的代码:

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' 不会在 shell 中打印并且函数永远不会结束(因为没有到达 return 语句),因此也不会打印 'Help'

知道为什么会这样吗??

谢谢,

【问题讨论】:

  • destroy 不会退出主循环,它只会拆除顶部窗口。要退出循环,您需要在单击按钮时使用root1.quit()root1.destroy()

标签: python tkinter tkinter-canvas


【解决方案1】:

对于对话窗口,您应该使用wait_window(),而不是创建新的mainloop。这会等到 Toplevel 窗口关闭,然后继续执行以下行。

所以你应该替换

root1.mainloop()
root1.quit()

root1.wait_window()

有关创建对话窗口的更多提示,请参阅this article on effbot.org

【讨论】:

  • 另外我想知道如何在命令按钮上添加多个功能我在网上找不到任何网站。
  • 你不能。如果您希望在单击按钮时运行多个函数,则必须定义一个新函数,该函数调用您要运行的所有函数并将命令设置为该函数。另见this questionthis question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多