You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:51:02