繁体   English   中英

Python Tkinter 和 GUI

[英]Python Tkinter and GUI

我正在尝试创建一个具有一个操作按钮的程序/窗口。 单击此按钮时,应打开第二个程序/窗口并关闭前一个程序。 第二个程序应该有一个操作按钮,可以打开第一个程序并关闭第二个程序。

我从另一个用户那里找到了这个脚本,它的工作方式与我希望代码运行的方式相同。 但是,在创建 otherframe 时,根窗口只是被 deconify() 隐藏了。

创建otherframe时销毁根窗口的最佳方法是什么并且仍然能够循环返回。

希望这是有道理的,并提前致谢。

import Tkinter as Tk

########################################################################
class OtherFrame(Tk.Toplevel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        Tk.Toplevel.__init__(self)
        self.geometry("100x100")
        self.title("otherFrame")

    ########################################################################
    class MyApp(object):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        self.root = parent
        self.root.title("Main frame")
        self.frame = Tk.Frame(parent)
        self.frame.pack()

        btn = Tk.Button(self.frame, text="Open Frame", command=self.openFrame)
        btn.pack()

    #----------------------------------------------------------------------
    def hide(self):
        """"""
        self.root.withdraw()

    #----------------------------------------------------------------------
    def openFrame(self):
        """"""
        self.hide()
        subFrame = OtherFrame()
        handler = lambda: self.onCloseOtherFrame(subFrame)
        btn = Tk.Button(subFrame, text="Close", command=handler)
        btn.pack()

    #----------------------------------------------------------------------
    def onCloseOtherFrame(self, otherFrame):
        """"""
        otherFrame.destroy()
        self.show()

    #----------------------------------------------------------------------
    def show(self):
        """"""
        self.root.update()
        self.root.deiconify()


#----------------------------------------------------------------------
if __name__ == "__main__":
    root = Tk.Tk()
    root.geometry("800x600")
    app = MyApp(root)
    root.mainloop()

没有最好的方法来销毁根窗口然后再把它找回来。 只有一种方法可以销毁它,即调用destroy()方法。 当你这样做时,所有子窗口都将被销毁, mainloop将退出。

虽然可以销毁和重新创建根窗口,但这不是 tkinter 的设计方式,它不会像您期望的那样运行。 例如, StringVar等的所有实例都将被销毁。 另一方面,您必须有一个根窗口,因此通过销毁根窗口,您将销毁其所有子窗口,包括Toplevel

到目前为止,最常见的情况是简单地隐藏根窗口。 如果您真的想销毁每个窗口,请不要在根窗口中放置任何内容并将其隐藏。 然后,您可以使用Toplevel实例,您可以轻松地随意销毁和重新创建这些实例。

简短的回答......你做不到。 您已经拥有的脚本是最好的选择。

尝试这个:

import tkinter
class abc:
    def __init__(self):
        self.root = tkinter.Tk()
        tkinter.Button(self.root, text="Click Me", command=lambda:abc.com(self)).pack()
    def com(self):
        self.root.destroy()
        some = abc()

q = abc()

这实际上并没有在两者之间跳转,而是每次都会创建一个新的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM