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

如何基于现有Tkinter代码实现按钮点击在frame加载内容的两种示例

Tkinter右侧内容区域功能实现示例

基础修改说明

我们在你提供的原有代码基础上,新增了右侧剩余区域的内容承载frame main_frame,两个示例均基于该基础结构修改:

# 原有代码保留,在leftbar定义后新增右侧内容区域
main_frame = tk.Frame(root, background="#f0f0f0")
main_frame.pack(side='right', fill='both', expand=True) # 占满剩余所有空间

示例1:单文件实现点击按钮切换右侧区域样式与内容

所有逻辑都在同一个文件内,点击按钮1时修改右侧区域配色、加载对应内容,完整代码如下:

from tkinter import messagebox
import tkinter as tk
from tkinter import ttk
# 如果你需要使用PIL加载图片取消下方注释即可
# from PIL import ImageTk, Image

def clear_main_frame():
    # 清空右侧区域现有内容,避免内容叠加
    for widget in main_frame.winfo_children():
        widget.destroy()

def clicked(btn):
    # 原有按钮高亮逻辑保留
    for w in leftbar.winfo_children():
        w['bg'] = 'white' if w is not btn else 'yellow'
    # 新增右侧内容切换逻辑
    clear_main_frame()
    if btn == btn1:
        # 修改右侧配色
        main_frame.config(bg="#e3f2fd")
        # 加载按钮1对应的内容,可自行扩展更多控件
        tk.Label(main_frame, text="这是按钮1对应的内容", bg="#e3f2fd", font=("微软雅黑", 20)).pack(pady=50)
    elif btn == btn2:
        main_frame.config(bg="#f3e5f5")
        tk.Label(main_frame, text="这是按钮2对应的内容", bg="#f3e5f5", font=("微软雅黑", 20)).pack(pady=50)

root = tk.Tk()
root.title("xxxx")
root.geometry("1920x1080+0+0")
root.config(bg="#f0f0f0")
root.state("normal")

topbar = tk.Frame(root, background="#e10a0a", height=43)
topbar.pack(fill='x')

leftbar = tk.Frame(root, width=250, background="white")
leftbar.pack(side='left', fill='y')
leftbar.pack_propagate(0)

# 新增右侧内容承载区域
main_frame = tk.Frame(root, background="#f0f0f0")
main_frame.pack(side='right', fill='both', expand=True)

# 注意:原有代码的PhotoImage路径请替换为你自己的实际图片路径,此处临时注释避免运行报错
# button1 = tk.PhotoImage(file="/image.png")
btn1 = tk.Button(leftbar, borderwidth=0, highlightthickness=0,
                 bg="white", text="aaaaa", foreground='green', compound='left', anchor='w')
btn1.pack(fill='x')
btn1['command'] = lambda: clicked(btn1)

# button2 = tk.PhotoImage(file="/image.png")
btn2 = tk.Button(leftbar, borderwidth=0, highlightthickness=0,
                 bg="white", text="bbbbb", foreground='green', compound='left', anchor='w')
btn2.pack(fill='x')
btn2['command'] = lambda: clicked(btn2)

root.mainloop()

示例2:导入外部py文件作为模块渲染右侧内容

适合业务逻辑复杂的场景,每个按钮对应内容单独拆分为独立py文件,便于维护。

步骤1:创建外部模块文件

在主程序同级目录下新建 page_btn2.py,内容如下,所有控件都绑定到传入的父容器上:

# page_btn2.py 内容
import tkinter as tk
from tkinter import ttk

def render(parent):
    # 所有控件的master都设置为传入的parent,也就是主程序的main_frame
    ttk.Label(parent, text="这是外部模块page_btn2的内容", font=("微软雅黑", 18)).pack(pady=30)
    # 你可以在这里写任意复杂的业务逻辑、添加任意控件
    ttk.Entry(parent, width=30).pack(pady=10)
    ttk.Button(parent, text="外部模块的按钮", command=lambda: tk.messagebox.showinfo("提示", "外部模块的功能正常运行")).pack(pady=10)

步骤2:修改主程序代码

主程序中导入外部模块,点击对应按钮时调用模块的渲染方法:

from tkinter import messagebox
import tkinter as tk
from tkinter import ttk
# 导入外部模块
import page_btn2

def clear_main_frame():
    for widget in main_frame.winfo_children():
        widget.destroy()

def clicked(btn):
    for w in leftbar.winfo_children():
        w['bg'] = 'white' if w is not btn else 'yellow'
    clear_main_frame()
    main_frame.config(bg="#f0f0f0") # 恢复默认背景
    if btn == btn1:
        # 按钮1的内容可以继续写在主文件,也可以拆分为单独模块
        tk.Label(main_frame, text="按钮1内容(主文件内定义)", bg="#f0f0f0", font=("微软雅黑", 20)).pack(pady=50)
    elif btn == btn2:
        # 调用外部模块的render方法,把main_frame作为父容器传入
        page_btn2.render(main_frame)

root = tk.Tk()
root.title("xxxx")
root.geometry("1920x1080+0+0")
root.config(bg="#f0f0f0")
root.state("normal")

topbar = tk.Frame(root, background="#e10a0a", height=43)
topbar.pack(fill='x')

leftbar = tk.Frame(root, width=250, background="white")
leftbar.pack(side='left', fill='y')
leftbar.pack_propagate(0)

main_frame = tk.Frame(root, background="#f0f0f0")
main_frame.pack(side='right', fill='both', expand=True)

# button1 = tk.PhotoImage(file="/image.png")
btn1 = tk.Button(leftbar, borderwidth=0, highlightthickness=0,
                 bg="white", text="aaaaa", foreground='green', compound='left', anchor='w')
btn1.pack(fill='x')
btn1['command'] = lambda: clicked(btn1)

# button2 = tk.PhotoImage(file="/image.png")
btn2 = tk.Button(leftbar, borderwidth=0, highlightthickness=0,
                 bg="white", text="bbbbb", foreground='green', compound='left', anchor='w')
btn2.pack(fill='x')
btn2['command'] = lambda: clicked(btn2)

root.mainloop()

说明

  • 你可以给每个按钮对应新建独立的py文件,所有业务逻辑都放在对应文件的render方法内,主文件只负责切换逻辑,结构非常清晰
  • 不需要额外的canvas或者弹窗,所有内容都直接渲染在右侧的main_frame区域内

内容的提问来源于stack exchange,提问作者Erling Olsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:24:04