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

如何实现带垂直滚动条且单列自动扩展的Tkinter组件列表?

问题

能否让由标签、按钮等组件组成的列表在Y方向可滚动,同时保持某一列在X方向如下方代码所示自动扩展?

原代码:

import tkinter as tk

root = tk.Tk()
root.geometry("600x100")

frame = tk.Frame(root)
frame.pack(fill="both", expand=True)
frame.columnconfigure(1, weight=1)
frame.columnconfigure((0,2,3), minsize=100)
frame.rowconfigure(0, minsize=40)

coln = ["NO.", "Description","Name", "Button"]

for i in range(len(coln)):
    label = tk.Label(frame, text=coln[i], borderwidth=2, relief="solid")
    label.grid(column=i, row=0, sticky="NESW")

for i in range(20):
    label = tk.Label(frame, text=i+1, borderwidth=1, relief="solid")
    label.grid(column=0, row=i+1, sticky="NESW")

    label2 = tk.Label(frame, text="TEST_Descr.", borderwidth=1, relief="solid")
    label2.grid(column=1, row=i+1, sticky="NESW")

    label3 = tk.Label(frame, text="NAME", borderwidth=1, relief="solid")
    label3.grid(column=2, row=i+1, sticky="NESW")

    label4 = tk.Label(frame, borderwidth=1, relief="solid")
    label4.grid(column=3, row=i + 1, sticky="NESW")

    button = tk.Button(label4, text="OK!")
    button.pack(fill="x", expand=True)

root.mainloop()
解决方案

可以通过tkinter.Canvas和tkinter.Scrollbar组合实现纵向滚动,同时保留原有的列宽自动扩展逻辑。核心思路是把承载所有组件的Frame放到Canvas中,让Canvas负责滚动,同时绑定Canvas和Frame的尺寸同步,保证列宽扩展功能正常。

修改后的代码如下:

import tkinter as tk

root = tk.Tk()
root.geometry("600x100")

# 创建滚动容器:Canvas + Scrollbar
scroll_container = tk.Frame(root)
scroll_container.pack(fill="both", expand=True)

canvas = tk.Canvas(scroll_container)
scrollbar = tk.Scrollbar(scroll_container, orient="vertical", command=canvas.yview)
content_frame = tk.Frame(canvas)

# 绑定尺寸变化事件,实时更新Canvas可滚动区域
content_frame.bind(
    "<Configure>",
    lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
)

# 将内容Frame放入Canvas
canvas.create_window((0, 0), window=content_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)

# 布局Canvas和滚动条
canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")

# 保留原有的列配置,保证第二列自动扩展
content_frame.columnconfigure(1, weight=1)
content_frame.columnconfigure((0,2,3), minsize=100)
content_frame.rowconfigure(0, minsize=40)

coln = ["NO.", "Description","Name", "Button"]

for i in range(len(coln)):
    label = tk.Label(content_frame, text=coln[i], borderwidth=2, relief="solid")
    label.grid(column=i, row=0, sticky="NESW")

for i in range(20):
    label = tk.Label(content_frame, text=i+1, borderwidth=1, relief="solid")
    label.grid(column=0, row=i+1, sticky="NESW")

    label2 = tk.Label(content_frame, text="TEST_Descr.", borderwidth=1, relief="solid")
    label2.grid(column=1, row=i+1, sticky="NESW")

    label3 = tk.Label(content_frame, text="NAME", borderwidth=1, relief="solid")
    label3.grid(column=2, row=i+1, sticky="NESW")

    label4 = tk.Label(content_frame, borderwidth=1, relief="solid")
    label4.grid(column=3, row=i + 1, sticky="NESW")

    button = tk.Button(label4, text="OK!")
    button.pack(fill="x", expand=True)

root.mainloop()

关键修改说明

  • 新增scroll_container作为Canvas和滚动条的父容器,确保滚动组件布局协调
  • 将原内容Frame替换为content_frame并嵌入Canvas,由Canvas提供滚动能力
  • 绑定content_frame的<Configure>事件,实时更新Canvas的滚动范围,保证滚动区域准确
  • 完全保留原有的columnconfigure配置,让第二列(Description)依然能在X方向自动扩展

内容的提问来源于stack exchange,提问作者Patrick T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:36:31