如何解决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
相关产品推荐
相关产品推荐

