在 tkinter 中清除帧

Clearing frames in tkinter

在没有任何正规培训和对 Python 3.3 非常基本的了解的情况下,我正在努力理解 tkinter 以制作基本的 gui。我已经阅读了这个方法:

这让我难以理解。我从复制和粘贴代码中学得不是很好。我的问题是:

如果我想制作一个具有多个 windows 的图形用户界面,我通过简单地破坏一个框架并在使用 class 时用另一个框架替换它来实现,我想我只是不明白为什么这么难。我今天玩了一会儿,我不明白为什么下面的代码不起作用。我无法绕过的是为什么它能正确地翻转到新的window,但不能return到主window。两者按钮针对各自的用途进行了相同的编码,但一个有效,一个无效。

from tkinter import *

class Application:
    def __init__(self, master):
        self.master = master
        self.new_switch_on = False
        self.main_switch_on = False
        self.main_frame()

    def main_frame(self):
        if self.new_switch_on == True:
            self.new_frame.destroy()
        self.new_switch_on = False
        self.main_switch_on = True
        self.main_frame = Frame(self.master, width = 200, height = 100)
        Label(self.main_frame, text = 'Main Frame').pack()
        Button(self.main_frame, text = 'Next', command = self.new_frame).pack()
        self.main_frame.pack()

    def new_frame(self):
        if self.main_switch_on == True:
            self.main_frame.destroy()
        self.main_switch_on = False
        self.new_switch_on = True
        self.new_frame = Frame(self.master, width = 400, height = 200)
        Label(self.new_frame, text = 'New Frame').pack()
        Button(self.new_frame, text = 'Back', command = self.main_frame).pack()
        self.new_frame.pack()

root = Tk()
root.geometry('-1+1')

app = Application(root)

root.mainloop()

我知道我可以按照前面提到的 link 来获得想要的结果,但我只是不明白为什么像这样的东西,或者其他对新手来说更简单的东西不能'达不到同样的效果。

问题是因为您对方法 main_frame(self, ...) 和框架 self.main_frame = Frame(...) 使用了相同的名称。

当您将框架分配给变量 self.main_frame = Frame(...) 时,您将失去对方法 self.main_frame() 的访问权限,并且您的 Button(self.new_frame, text = 'Back', command=self.main_frame) 无法调用方法 self.main_frame.

为方法使用不同的名称 main_frame - 例如 create_main_frame

同样的问题是 new_frame(self, ...)self.new_frame = Frame(...)

(ps。我在代码中添加空行以使其更具可读性)

from tkinter import *

class Application:

    def __init__(self, master):
        self.master = master

        self.new_switch_on = False
        self.main_switch_on = False

        self.create_main_frame()

    def create_main_frame(self): # new name
        if self.new_switch_on == True:
            self.new_frame.destroy()

        self.new_switch_on = False
        self.main_switch_on = True

        self.main_frame = Frame(self.master, width = 200, height = 100)

        Label(self.main_frame, text = 'Main Frame').pack()
        Button(self.main_frame, text = 'Next', command = self.create_new_frame).pack()  # new name

        self.main_frame.pack()

    def create_new_frame(self): # new name
        if self.main_switch_on == True:
            self.main_frame.destroy()

        self.main_switch_on = False
        self.new_switch_on = True

        self.new_frame = Frame(self.master, width = 400, height = 200)

        Label(self.new_frame, text='New Frame').pack()
        Button(self.new_frame, text='Back', command=self.create_main_frame).pack()  # new name

        self.new_frame.pack()


root = Tk()
root.geometry('-1+1')

app = Application(root)

root.mainloop()