如何基于现有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
相关产品推荐
相关产品推荐

