【问题标题】:How to only close TopLevel window in Python Tkinter?如何仅在 Python Tkinter 中关闭 TopLevel 窗口?
【发布时间】:2019-06-12 04:32:49
【问题描述】:

使用Python Tkinter,创建一个子面板(TopLevel)来显示一些东西并获取用户输入,用户输入后,点击“退出”发现整个GUI(主面板)也被破坏了。 如何只关闭顶层窗口?

from tkinter import *

lay=[]
root = Tk()
root.geometry('300x400+100+50')

def exit_btn():
    top = lay[0]
    top.quit()
    top.destroy()

def create():
    top = Toplevel()
    lay.append(top)

    top.title("Main Panel")
    top.geometry('500x500+100+450')
    msg = Message(top, text="Show on Sub-panel",width=100)
    msg.pack()

    btn = Button(top,text='EXIT',command=exit_btn)
    btn.pack()

Button(root, text="Click me,Create a sub-panel", command=create).pack()
mainloop()

【问题讨论】:

标签: python user-interface tkinter tk


【解决方案1】:

在我的例子中,我从父类传递了一个回调函数,一旦点击提交按钮,回调函数就会传递返回值。

回调函数会调用顶层对象的destroy方法,这样你就可以关闭框架并获得返回值。

【讨论】:

    【解决方案2】:

    您可以将 lambda 函数与命令一起使用,它比普通函数更适合您的工作

    例如)

    btn = Button(top,text='EXIT',command=exit_btn)

    exit_btn 更改为 lambda :top.destroy()

    【讨论】:

      【解决方案3】:

      这似乎对我有用:

      from tkinter import *
      
      lay=[]
      root = Tk()
      root.geometry('300x400+100+50')
      
      def create():
      
          top = Toplevel()
          lay.append(top)
      
          top.title("Main Panel")
          top.geometry('500x500+100+450')
          msg = Message(top, text="Show on Sub-panel",width=100)
          msg.pack()
      
          def exit_btn():
      
              top.destroy()
              top.update()
      
          btn = Button(top,text='EXIT',command=exit_btn)
          btn.pack()
      
      
      Button(root, text="Click me,Create a sub-panel", command=create).pack()
      mainloop()
      

      【讨论】:

        【解决方案4】:

        您唯一的错误是您在调用top.destroy() 之外还调用了top.quit()。您只需致电top.destroy()top.quit() 会杀死 mainloop,导致程序退出。

        【讨论】:

          【解决方案5】:

          你不能关闭根窗口。当您关闭根窗口时,它是关闭所有窗口。因为所有子窗口都连接到根窗口。

          您可以隐藏根窗口。

          隐藏方法名为withdraw()deiconify()可以使用show方法

          # Hide/Unvisible
          root.withdraw()
          
          # Show/Visible
          root.deiconify()
          

          【讨论】:

          • 非常感谢您分享解决方案,我可以在其他情况下使用它。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多