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

如何在Tkinter中独立并排放置不同尺寸的带滚动条Text组件?

解决Tkinter滚动文本组件独立并排布局的问题

这个问题的核心是你直接把滚动条组件放到了root的全局grid布局里,导致两个组件的位置被上方元素的行号限制住了。解决思路是用Frame容器把每个滚动文本组件打包成独立的模块,再把这些模块并排布局,这样它们就不会互相干扰了。

具体实现步骤

  • 为每个滚动文本组创建独立的Frame,把Scrollbar和Text组件放到对应的Frame内部
  • 在Frame内部完成滚动条和文本框的布局(保持你原来的grid逻辑即可)
  • 最后把这两个Frame在root里并排摆放,完全独立于上方的按钮/菜单布局

修改后的完整代码

from tkinter import ttk
from tkinter import *

# -------------
# set_up_output_scrollbar
def set_up_output_scrollbar(parent_frame):  # 新增parent_frame参数,指定组件的父容器
    output_scrollbar = Scrollbar(parent_frame)
    output_scrollbar_text = Text(parent_frame, height=scrollbar_height, width=scrollbar_width)
    output_scrollbar.config(command=output_scrollbar_text.yview)
    output_scrollbar_text.config(yscrollcommand=output_scrollbar.set)  # 补充联动逻辑,让文本框控制滚动条
    # 在Frame内部完成布局
    output_scrollbar_text.grid(row=0, column=0, sticky='NS')
    output_scrollbar.grid(row=0, column=1, sticky='NS')
    # 让Frame自动适应文本框的高度
    parent_frame.grid_rowconfigure(0, weight=1)
    return parent_frame

# -------------
# set_up_calculation_scrollbar
def set_up_calculation_scrollbar(parent_frame):  # 新增parent_frame参数
    calculation_scrollbar = Scrollbar(parent_frame)
    calculation_scrollbar_text = Text(parent_frame, height=calculation_scrollbar_height, width=calculation_scrollbar_width)
    calculation_scrollbar.config(command=calculation_scrollbar_text.yview)
    calculation_scrollbar_text.config(yscrollcommand=calculation_scrollbar.set)  # 补充联动逻辑
    # 在Frame内部完成布局
    calculation_scrollbar_text.grid(row=0, column=0, sticky='NS')
    calculation_scrollbar.grid(row=0, column=1, sticky='NS')
    parent_frame.grid_rowconfigure(0, weight=1)
    return parent_frame

# -------------------------------------------
# PROGRAMM SET UP
if __name__ == '__main__':
    # ---------------------------
    # main definition of gui
    root = Tk()
    root.title('Wetterderivate und Klima v_a0.0.1')
    #icon_path = get_local_path()
    #root.iconbitmap(icon_path + 'icon.ico') # icon
    root.geometry("1920x1080")
    root.resizable(width=False, height=False)
    # ---------------------------
    # call initial functions and set inital values
    scrollbar_width = 75
    scrollbar_height = 15
    calculation_scrollbar_height = 25
    calculation_scrollbar_width = 100

    # -------------
    # 创建两个独立的Frame容器,隔离滚动文本组件与全局布局
    output_frame = Frame(root)
    calculation_frame = Frame(root)

    # 初始化滚动文本组件,传入对应的Frame作为父容器
    output_frame = set_up_output_scrollbar(output_frame)
    calculation_frame = set_up_calculation_scrollbar(calculation_frame)

    # 把两个Frame并排布局(这里用grid,你也可以用pack(side=LEFT, padx=10)实现横向排列)
    output_frame.grid(row=6, column=0, padx=10, pady=10, sticky='NS')
    calculation_frame.grid(row=6, column=1, padx=10, pady=10, sticky='NS')

    # 上方的按钮/菜单可以正常放在row0到row5的位置,完全不会影响这两个并排的Frame
    # 示例:添加一个上方的测试按钮
    Button(root, text="功能按钮示例").grid(row=0, column=0, padx=10, pady=10)

    root.mainloop()

关键改动说明

  1. 新增父容器参数:修改两个初始化函数,接收parent_frame参数,让组件不再直接绑定到root,而是放到指定的Frame里,实现布局隔离
  2. 补充滚动条联动:添加text.config(yscrollcommand=scrollbar.set),这是你原来代码缺失的核心逻辑,没有这一行滚动条无法跟随文本内容滚动
  3. Frame内部布局:在每个Frame内部完成Text和Scrollbar的grid布局,保证每个模块的独立性
  4. 并排Frame:把两个Frame放在root的同一行不同列(或者用pack横向排列),这样它们就可以独立显示,不受上方元素的布局影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:27:44