【问题标题】:How do I execute commands after a tkinter window closes in a function?如何在函数中关闭 tkinter 窗口后执行命令?
【发布时间】:2018-08-21 04:06:59
【问题描述】:

我有一个带有按钮的窗口,我希望该按钮创建一个带有新按钮的新窗口。新按钮将破坏新窗口,因此代码应该继续并打印“hi”。

from tkinter import *

root1 = Tk()

def create():
    root2 = Tk()
    Button(root2,
            text="2",
            command=lambda: root2.destroy()).grid()
    root2.mainloop()
    print("hi")

Button(root1,
        text="1",
        command=lambda: create()).grid()

root1.mainloop()

我发现 root2 的创建和销毁都很好,但是“print(“hi”)”行仅在 root1 关闭后运行。我希望在单击显示“2”的按钮后立即执行“print("hi") 行。任何想法将不胜感激。非常感谢!

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    您可以在一个辅助函数中提取 root2 的破坏,该函数还将执行您想要的 print('hi')

    • 您可能不需要 lambda:在这种情况下,使用命名的函数可能会更好。
    • 您也可能最好使用Toplevel 而不是再次调用Tk()
    • 最好使用import tkinter as tk 而不是星号导入

    可能是这样的:

    import tkinter as tk                  # avoid star imports
    
    def create_root2():
        def terminate():                  # helper to destroy root2 and print 'hi'
            print("hi", flush=True)
            root2.destroy()
        root2 = tk.Toplevel(root1)        # use tk.Toplevel i/o another call to tk.Tk()
        tk.Button(root2,
                text="-----2-----",
                command=terminate).grid() # call terminate w/o lambda (lambda is not useful here)
    
    root1 = tk.Tk()
    tk.Button(root1,
            text="-----1-----",
            command=create_root2).grid()  # call create_root2 w/o lambda (lambda is not useful here)
    
    root1.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2011-07-30
      相关资源
      最近更新 更多