Tkinter表格定位问题:如何将表格放置在非顶部中心位置?
问题
基于Tkinter创建带滚动条的表格,表格已封装在独立框架table_frame中,默认用pack()会固定在窗口顶部中心。尝试改用place()方法调整位置时出现异常,请问如何将表格放置到顶部中心以外的任意位置?
解决方案
核心问题包含两点:布局管理器混用导致的位置异常,以及滚动条变量名冲突导致功能失效。以下是修复步骤和完整代码:
关键修复点
- 统一布局逻辑:将
table_frame的pack()替换为place(),直接指定坐标;框架内部的滚动条和表格仍用pack(),同一父组件内保持布局方式一致即可。 - 修复滚动条变量冲突:原代码中两个滚动条共用
scroll_bar变量,导致垂直滚动条绑定失效,需分别命名(如v_scroll和h_scroll)。 - 自定义位置参数:
place()支持绝对坐标(x/y)和相对坐标(relx/rely),配合anchor参数可精准控制表格位置。
修改后的完整代码
from tkinter import * from tkinter import ttk window = Tk() window.title('Table Function') window.geometry('1000x900') table_values = {'Brize Norton': ['Teams', '39'], 'Corsham': ['MS Word', '48'], 'Corsford': ['MS Azure', '41'], 'Halton': ['JIRA', '98']} table_values2 = {'test1': ['Teams', '39'], 'test2': ['MS Word', '48'], 'test3': ['MS Azure', '41'], 'test4': ['JIRA', '98']} def create_table(): table_frame = Frame(master=window, bg="#f0f0f0") # 使用place指定位置:x=150,y=100,左上角对齐 table_frame.place(x=150, y=100, anchor="nw") # 修复滚动条变量名冲突 v_scroll = Scrollbar(table_frame) v_scroll.pack(side=RIGHT, fill=Y) h_scroll = Scrollbar(table_frame, orient='horizontal') h_scroll.pack(side=BOTTOM, fill=X) Table_Object = ttk.Treeview(table_frame, yscrollcommand=v_scroll.set, xscrollcommand=h_scroll.set) Table_Object.pack() v_scroll.config(command=Table_Object.yview) h_scroll.config(command=Table_Object.xview) # 定义列 Table_Object['columns'] = ('Station', 'Most Reported', 'Num') column_width = 150 Table_Object.column("#0", width=0, stretch=NO) Table_Object.column("Station", anchor=CENTER, width=column_width) Table_Object.column("Most Reported", anchor=CENTER, width=column_width) Table_Object.column("Num", anchor=CENTER, width=column_width) # 创建表头 Table_Object.heading("#0", text="", anchor=CENTER) Table_Object.heading("Station", text="Station", anchor=CENTER) Table_Object.heading("Most Reported", text="Most Reported", anchor=CENTER) Table_Object.heading("Num", text="Num", anchor=CENTER) return table_frame, Table_Object def add_table_values(values, table): """向表格添加字典中的数据""" for loc in values.items(): table.insert(parent='', index='end', text='', values=(loc[0], loc[1][0], loc[1][1])) def delete_table_values(table): """清空表格数据""" for i in table.get_children(): table.delete(i) table_frame, table_object = create_table() delete_table_values(table_object) def key_pressed(event): if event.char == 'p': delete_table_values(table_object) add_table_values(table_values, table_object) if event.char == 'q': delete_table_values(table_object) add_table_values(table_values2, table_object) window.bind("<Key>", key_pressed) window.mainloop()
位置调整示例
- 绝对位置:
table_frame.place(x=200, y=300, anchor="nw")→ 表格左上角位于窗口(200,300)坐标处 - 相对位置:
table_frame.place(relx=0.5, rely=0.5, anchor="center")→ 表格中心位于窗口正中央 - 混合位置:
table_frame.place(relx=0.2, y=100, anchor="nw")→ 水平方向占窗口20%宽度,垂直方向固定在y=100处
内容的提问来源于stack exchange,提问作者StratCharl
相关产品推荐
相关产品推荐

