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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:25:53