Tkinter 800x800 GUI右侧按钮无法显示,求解决方案
解决Tkinter右侧按钮无法显示的问题
问题原因
你的Treeview组件使用了pack(side="left", fill="both", expand=True),其中expand=True会让Treeview占据窗口所有可用剩余空间,导致右侧的按钮框架没有空间分配,因此无法显示。
修复方案
你可以通过以下两种方式解决:
方式1:调整Treeview的pack参数
去掉expand=True,或者限制Treeview的填充方向,让右侧按钮框架保留足够空间:
- 将Treeview的
fill改为"y"(仅垂直填充),expand设为False,这样Treeview只会占据左侧垂直空间,右侧留给按钮框架。 - 或者给Treeview设置固定宽度,同时保留
fill="both"和expand=True,确保Treeview不会挤占全部宽度。
方式2:改用grid布局实现精准控制
grid布局可以通过列权重配置,让Treeview占据大部分宽度,按钮框架保持固定宽度,更适合复杂布局场景。
修改后的代码示例
方式1:调整pack参数的完整代码
import tkinter as tk from tkinter import ttk # Create the root window root = tk.Tk() root.geometry("800x800") # Create the treeview - 调整pack参数,避免挤占全部空间 treeview = ttk.Treeview(root) treeview.pack(side="left", fill="y", expand=False) # Create the buttons read_excel_button = tk.Button(root, text="Read Excel") invoice_per_order_button = tk.Button(root, text="Invoice per Order") save_pdf_button = tk.Button(root, text="Save PDF") close_button = tk.Button(root, text="Close") # Place the buttons in a frame and pack the frame to the right of the root window button_frame = tk.Frame(root) button_frame.pack(side="right", fill="both") # 增加padx/pady让按钮间距更合理 read_excel_button.pack(side="top", in_=button_frame, padx=5, pady=5) invoice_per_order_button.pack(side="top", in_=button_frame, padx=5, pady=5) save_pdf_button.pack(side="top", in_=button_frame, padx=5, pady=5) close_button.pack(side="top", in_=button_frame, padx=5, pady=5) # Run the Tkinter event loop root.mainloop()
方式2:使用grid布局的完整代码
import tkinter as tk from tkinter import ttk root = tk.Tk() root.geometry("800x800") # 配置行列权重:第0行占满垂直空间,第0列占满水平空间,第1列固定宽度 root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, weight=0) treeview = ttk.Treeview(root) treeview.grid(row=0, column=0, sticky="nsew") # 上下左右拉伸填充 button_frame = tk.Frame(root) button_frame.grid(row=0, column=1, sticky="nsew") # 垂直拉伸,水平固定 # 添加按钮并设置间距 read_excel_button = tk.Button(button_frame, text="Read Excel") read_excel_button.pack(side="top", padx=5, pady=5) invoice_per_order_button = tk.Button(button_frame, text="Invoice per Order") invoice_per_order_button.pack(side="top", padx=5, pady=5) save_pdf_button = tk.Button(button_frame, text="Save PDF") save_pdf_button.pack(side="top", padx=5, pady=5) close_button = tk.Button(button_frame, text="Close") close_button.pack(side="top", padx=5, pady=5) root.mainloop()
内容的提问来源于stack exchange,提问作者Mateo
相关产品推荐
相关产品推荐

