如何在Tkinter中通过Button命令向CommonPage类传递值替代硬编码
实现方案
你可以通过主控制器MyApp中转参数、新增页面内容更新方法实现需求,具体修改如下:
核心修改点
- 给主控制器
MyApp新增存储选中页面名称的属性,同时扩展show_frame方法支持接收额外参数 - 首页按钮点击时将对应页面名称作为参数传递给
show_frame CommonPage类新增内容更新方法,收到参数后动态修改标题等变量值
from tkinter import * import tkinter.ttk as ttk class MyApp(Tk): def __init__(self): Tk.__init__(self) # 新增:存储当前选中的页面名称 self.selected_page = "" container = ttk.Frame(self) container.pack(side="top", fill="both", expand=True) self.frames = {} for F in (HomePage, CommonPage): frame = F(container, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky='NSEW') self.show_frame(HomePage) # 修改:新增可选参数page_name,用于接收传递给CommonPage的页面标识 def show_frame(self, cont, page_name=None): # 如果传入了页面名称,先更新存储的变量 if page_name: self.selected_page = page_name frame = self.frames[cont] # 如果跳转的是CommonPage,调用它的更新方法刷新内容 if cont == CommonPage: frame.update_page(self.selected_page) frame.tkraise() class HomePage(ttk.Frame): def __init__(self, parent, controller): self.controller = controller ttk.Frame.__init__(self, parent) # create all of the main containers top_frame = Frame(self, bg='blue', width=355, height=50) mid_frame = Frame(self, bg='MediumPurple4', width=350, height=50) bottom_frame = Frame(self, bg='#a0ccda', width=350, height=100) # to go inside top_frame titleLabel = Label(top_frame, font=('Arial', 23, 'bold'), text="My App", bd=5, fg='snow',bg='blue', width=19, height=1) titleLabel.grid(row=0, column=0, sticky=N) top_frame.pack() # to go inside mid_frame titleLabel = Label(mid_frame, font=('Helvetica', 15, 'italic'), text="", bd=5, fg='snow',bg='black', width=30, height=1) titleLabel.grid(row=1, column=0, sticky=N) mid_frame.pack() # to go inside bottom_frame titleLabel = Label(bottom_frame, font=('Helvetica', 15, 'italic'), text="Select Button Page Below", bd=5, fg='snow',bg='gray', width=30) titleLabel.grid(row=1, column=0, sticky=N) # 修改:按钮点击时传递对应的页面名称参数 btnPageA = Button(bottom_frame, text="Page A", font="Arial 20", command=lambda: self.controller.show_frame(CommonPage, page_name="Page A"), bg="#a0ccda", width=22) btnPageA.grid(row=2, column=0, sticky=W) btnPageB = Button(bottom_frame, text="Page B", font="Arial 20", command=lambda: self.controller.show_frame(CommonPage, page_name="Page B"), bg="#a0ccda", width=22) btnPageB.grid(row=3, column=0, sticky=W) bottom_frame.pack() class CommonPage(ttk.Frame): def __init__(self, parent, controller): self.controller = controller ttk.Frame.__init__(self, parent) top_frame = Frame(self, bg='blue', width=355, height=50) bottom_frame = Frame(self, bg='#a0ccda', width=350, height=0) btnHomePage = ttk.Button(top_frame, text='Home Page', command=lambda: self.controller.show_frame(HomePage)) btnHomePage.grid(row=0, sticky=W) # 修改:将标题标签设为实例属性,方便后续修改内容,删掉硬编码逻辑 self.titleLabel = Label(top_frame, font=('Arial', 23, 'bold'), bd=5, fg='snow',bg='blue', width=19, height=1) self.titleLabel.grid(row=1, column=0, sticky=S) top_frame.pack() bottom_frame.pack() # 新增:页面内容更新方法,接收页面名称参数后修改标题 def update_page(self, page_name): self.mypage = page_name self.titleLabel.config(text=self.mypage) # 如果有其他和页面关联的变量要改,都可以加在这里 if __name__ == '__main__': app = MyApp() app.title('Mobile App') app.geometry('{}x{}'.format(355, 230)) app.mainloop()
后续如果需要新增更多同结构页面,只需要在首页新增对应按钮,传递不同的page_name参数即可,无需修改CommonPage的基础结构。
内容的提问来源于stack exchange,提问作者Precie Villafuerte
相关产品推荐
相关产品推荐

