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

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()

修改说明

  1. 移除fortable1.place(x=0,y=5),改用txtbox.window_create(INSERT, window=fortable1)将表格容器嵌入到文本流中,实现滚动同步
  2. 调整文本插入顺序,将表格放在前置文本和后置文本之间,保证排版符合预期
  3. 移除fortable1的固定宽高设置,让表格根据内容自动适配大小

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:55:52