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

如何解决Tkinter动态添加Entry控件后界面及滚动条不更新问题

问题原因

你遇到的显示和滚动条不同步问题,核心是新增行后没有更新Canvas的滚动区域参数,Canvas不会自动感知内部挂载的frame_entries尺寸变化,必须主动刷新配置。

修复方案

只需要修改add_row_table函数,在新增行完成后,新增一行刷新scrollregion的代码即可:

def add_row_table():
    global total_rows

    new_row: list[tk.Entry] = [tk.Entry() for _ in range(total_columns)]
    for j in range(total_columns):
        new_row[j] = tk.Entry(frame_entries, width=20)
        new_row[j].grid(row=total_rows, column=j, sticky="news")
        new_row[j].insert(tk.END, total_rows)
    total_rows += 1

    tbl.append(new_row)
    # 新增下面这一行即可修复问题
    canvas.config(scrollregion=canvas.bbox("all"))

修复后完整可运行代码

import tkinter as tk

total_columns = 5
total_rows = 18
tbl = []

def add_row_table():
    global total_rows

    new_row: list[tk.Entry] = [tk.Entry() for _ in range(total_columns)]
    for j in range(total_columns):
        new_row[j] = tk.Entry(frame_entries, width=20)
        new_row[j].grid(row=total_rows, column=j, sticky="news")
        new_row[j].insert(tk.END, total_rows)
    total_rows += 1

    tbl.append(new_row)
    canvas.config(scrollregion=canvas.bbox("all"))

root = tk.Tk()
root.grid_rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)

frame_main = tk.Frame(root, bg="gray")
frame_main.grid(sticky='news')

button2 = tk.Button(frame_main, text="Add Row", fg="green", command=add_row_table)
button2.grid(row=0, column=1, pady=(5, 0), sticky='nw')

frame_canvas = tk.Frame(frame_main)
frame_canvas.grid(row=2, column=0, pady=(5, 0), sticky='nw')
frame_canvas.grid_rowconfigure(0, weight=1)
frame_canvas.grid_columnconfigure(0, weight=1)
frame_canvas.grid_propagate(False)

canvas = tk.Canvas(frame_canvas, bg="yellow")
canvas.grid(row=0, column=0, sticky="news")

vsb = tk.Scrollbar(frame_canvas, orient="vertical", command=canvas.yview)
vsb.grid(row=0, column=1, sticky='ns')
canvas.configure(yscrollcommand=vsb.set)

frame_entries = tk.Frame(canvas, bg="blue")
canvas.create_window((0, 0), window=frame_entries, anchor='nw')

for i in range(total_rows):
    line = [tk.Entry() for j in range(total_columns)]
    for j in range(total_columns):
        line[j] = tk.Entry(frame_entries, width=20)
        line[j].grid(row=i, column=j, sticky="news")
        line[j].insert(tk.END, i)
    tbl.append(line)

frame_entries.update_idletasks()

columns_width = sum([tbl[0][j].winfo_width() for j in range(total_columns)])
rows_height = sum([tbl[i][0].winfo_height() for i in range(5)])
frame_canvas.config(width=columns_width + vsb.winfo_width(),
                height=rows_height+150)

canvas.config(scrollregion=canvas.bbox("all"))
root.mainloop()

效果说明

修改后点击Add Row按钮会自动在表格底部新增行,滚动条会自动适配最新的表格高度,不会出现行覆盖的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:03