tkinter点击按钮切换页面时如何仅在进入Page2时执行循环打印列表
问题原因
所有页面实例在MainView初始化阶段就会被统一创建,Page2类的__init__方法会在此时执行,因此for循环逻辑会在程序启动时提前运行,而非等待切换到Page2时触发。
修改方案
将需要在切换到Page2时才执行的逻辑从__init__方法迁移到父类预定义的show方法中,可按需增加初始化标记避免每次切换页面都重复执行逻辑。同时将按钮的触发逻辑统一改为调用页面对象的show方法。
完整修改后代码
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) # 仅初始化label占位,逻辑执行后再更新内容 self.label = tk.Label(self, text="") self.label.pack(side="top", fill="both", expand=True) # 初始化标记,避免逻辑重复执行 self._initialized = False def show(self): # 仅第一次打开Page2时执行逻辑,若需要每次打开都执行可删除判断 if not self._initialized: L=[] for x in ["A","B"]: print(x) L.append(x) self.label.config(text=L) self._initialized = True self.lift() 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) # 按钮触发改为调用show方法,保持逻辑统一 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) 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()
内容的提问来源于stack exchange,提问作者Stat
相关产品推荐
相关产品推荐

