Tkinter滚动异常:表格固定不动,需与ScrolledText文本同步滚动
Tkinter滚动同步问题:ScrolledText内表格未随文本滚动
问题描述
使用Tkinter开发时,滚动ScrolledText组件时,通过Entry组件创建的表格固定在初始位置,仅文本内容随滚动条滚动,期望表格能与文本同步滚动。代码运行无报错,但滚动功能未正常工作。
问题截图

原代码
from tkinter import * import tkinter as tk from tkinter import scrolledtext app = tk.Tk(screenName="main") #Font and orientation setup app.geometry('600x200') txtbox = scrolledtext.ScrolledText(app, width=50, height=10) txtbox.grid(row=0, column=0, sticky=E+W+N+S) txtbox.insert(INSERT,".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n Physical Properties.\n.\n.\n Physical Properties",) fortable1 = Frame(txtbox, padx=5, pady=5,width=500,height=200 ) fortable1.place(x=0,y=5) class Table: def __init__(self, fortable1): # code for creating table self.e = Entry(fortable1, width=12, fg='blue', bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=0) self.e.insert(END, lst[0][0]) self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=1) self.e.insert(END, lst[0][1]) self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=2) self.e.insert(END, lst[0][2]) self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=3) self.e.insert(END, lst[0][3]) for i in range(1, total_rows): for j in range(total_columns): self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=i, column=j) self.e.insert(END, lst[i][j]) lst = [("Sr/N", 'Parameter', 'Value', "Remarks"), (1, 'Grade Category', '1', '-'), (2, 'Equivalant Grade', 'N/A', "No such grades \n in our record"), (3, 'Liquidus', 'Tliq', '_'), (4, 'Solidus', 'Tsol', '_')] total_rows = len(lst) total_columns = len(lst[0]) t = Table(fortable1) app.mainloop()
解决方案
问题根源在于直接用place将Frame放在ScrolledText内时,ScrolledText的滚动仅同步内部文本内容,不会联动子组件位置。正确做法是利用ScrolledText(本质为Text组件)的window_create方法,将表格Frame嵌入到文本流中,实现滚动同步。
修改后的代码
from tkinter import * import tkinter as tk from tkinter import scrolledtext app = tk.Tk(screenName="main") app.geometry('600x200') txtbox = scrolledtext.ScrolledText(app, width=50, height=10) txtbox.grid(row=0, column=0, sticky=E+W+N+S) # 插入前置文本 txtbox.insert(INSERT,".\n.\n.\n.\n.\n.\n.\n.\n.\n.\n Physical Properties.\n") # 创建表格容器,无需固定宽高 fortable1 = Frame(txtbox, padx=5, pady=5) # 将表格容器嵌入到ScrolledText的当前插入位置 txtbox.window_create(INSERT, window=fortable1) # 插入表格后的文本 txtbox.insert(INSERT,"\n.\n.\n Physical Properties") class Table: def __init__(self, fortable1): # 创建表头 self.e = Entry(fortable1, width=12, fg='blue', bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=0) self.e.insert(END, lst[0][0]) self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=1) self.e.insert(END, lst[0][1]) self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=2) self.e.insert(END, lst[0][2]) self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=0, column=3) self.e.insert(END, lst[0][3]) # 创建表格内容 for i in range(1, total_rows): for j in range(total_columns): self.e = Entry(fortable1, width=12, bg="#FFFFE0", font=('Arial', 12, 'bold'), justify=CENTER) self.e.grid(row=i, column=j) self.e.insert(END, lst[i][j]) lst = [("Sr/N", 'Parameter', 'Value', "Remarks"), (1, 'Grade Category', '1', '-'), (2, 'Equivalant Grade', 'N/A', "No such grades \n in our record"), (3, 'Liquidus', 'Tliq', '_'), (4, 'Solidus', 'Tsol', '_')] total_rows = len(lst) total_columns = len(lst[0]) t = Table(fortable1) app.mainloop()
修改说明
- 移除
fortable1.place(x=0,y=5),改用txtbox.window_create(INSERT, window=fortable1)将表格容器嵌入到文本流中,实现滚动同步 - 调整文本插入顺序,将表格放在前置文本和后置文本之间,保证排版符合预期
- 移除fortable1的固定宽高设置,让表格根据内容自动适配大小
内容的提问来源于stack exchange,提问作者Prashant Priyadarshi
相关产品推荐
相关产品推荐

