我正在使用 tkinter,我的目标是每当我单击第 2 页时在类内打印列表 L。Page2(Page)目前,如果您运行代码,您会看到一旦您进入第 1 页,字母 A 和 B 就会打印在控制台中,这意味着 tkinter 已经经历了那个 for 循环。我如何更改此代码以仅在单击第 2 页时才执行该 for 循环?仅供参考,我从使用 Tkinter 中的按钮导航到应用程序的不同页面?的答案中借用了代码。
Page2(Page)
import tkinter as tk class Page(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) def show(self): self.lift() class Page1(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is page 1") label.pack(side="top", fill="both", expand=True) class Page2(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) L=[] for x in ["A","B"]: print(x) L.append(x) label = tk.Label(self, text=L) label.pack(side="top", fill="both", expand=True) class Page3(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is page 3") label.pack(side="top", fill="both", expand=True) class MainView(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) p1 = Page1(self) p2 = Page2(self) p3 = Page3(self) buttonframe = tk.Frame(self) container = tk.Frame(self) buttonframe.pack(side="top", fill="x", expand=False) container.pack(side="top", fill="both", expand=True) p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1) p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1) p3.place(in_=container, x=0, y=0, relwidth=1, relheight=1) b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift) b2 = tk.Button(buttonframe, text="Page 2", command=p2.lift) b3 = tk.Button(buttonframe, text="Page 3", command=p3.lift) b1.pack(side="left") b2.pack(side="left") b3.pack(side="left") p1.show() if __name__ == "__main__": root = tk.Tk() main = MainView(root) main.pack(side="top", fill="both", expand=True) root.wm_geometry("400x400") root.mainloop()
它正在打印列表,因为这是在类Page2可见之前(如果有的话)创建的类实例的一部分 - 这只是您“借用”的答案中的代码架构的产物。
Page2
以下是修复问题的一种方法。首先更改Button回调command=选项,MainView.__init__()以便show()调用该方法而不是lift():
Button
command=
MainView.__init__()
show()
lift()
b1 = tk.Button(buttonframe, text="Page 1", command=p1.show) b2 = tk.Button(buttonframe, text="Page 2", command=p2.show) b3 = tk.Button(buttonframe, text="Page 3", command=p3.show)
这意味着每当单击其中一个时,每个Page子类的show()方法都会被调用,默认情况下只调用其基类的方法,因此这样做只是添加了一个间接级别 - 从而可以轻松地在子类中覆盖/扩展它,使它们执行可能需要的任何专门处理。Button``lift()``Page2
Page
Button``lift()``Page2
请注意,我还创建了子类实例的属性L(而不是将其作为方法中的局部变量),以便在该类的其他方法中轻松引用它。__init__()
L
__init__()
class Page2(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) self.L = [] for x in ["A","B"]: self.L.append(x) label = tk.Label(self, text=self.L) label.pack(side="top", fill="both", expand=True) def show(self): print(f'in class {type(self).__name__}.show()') super().show() # Call superclass' method. for x in self.L: print(x)