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

如何在Tkinter已有窗口的子ListBox中添加Scrollbar?

为Tkinter主窗口中的子ListBox添加Scrollbar的正确方案

你的核心问题在于直接将ListBox和Scrollbar都作为主窗口的子组件,导致两者的位置和尺寸无法匹配。解决这个问题的最优方式是用一个Frame作为容器,把ListBox和Scrollbar都放在这个Frame内,再将Frame整体放置到主窗口的目标位置。这样既能保证Scrollbar和ListBox高度完全对齐,又能灵活控制整体的位置。

另外注意你代码里的一个错误:scrollbar.config(command = listBox.yview()) 这里不该加括号,应该传入函数对象listBox.yview,而不是调用它的返回值。

修正后的代码

import tkinter as tk

def main():
    mainWindow = tk.Tk(className="TEST")
    mainWindow.geometry("300x300")

    # 创建容器Frame,用来承载ListBox和Scrollbar
    list_container = tk.Frame(mainWindow)
    # 把Frame放到主窗口的指定位置(和你原来ListBox的位置一致)
    list_container.place(x=100, y=100, anchor="center")

    # 在容器里创建Scrollbar,父组件是Frame
    scrollbar = tk.Scrollbar(list_container)
    scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

    # 创建ListBox,父组件是Frame,绑定Scrollbar的set方法
    listBox = tk.Listbox(
        list_container,
        yscrollcommand=scrollbar.set
    )
    # 让ListBox占满整个容器
    listBox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

    # 给Scrollbar绑定ListBox的yview方法(注意不要加括号)
    scrollbar.config(command=listBox.yview)

    # 插入测试数据
    for i in range(100):
        listBox.insert(tk.END, f"TEST {i+1}")

    mainWindow.resizable(False, False)
    mainWindow.mainloop()

if __name__ == "__main__":
    main()

关键说明

  1. 容器Frame的作用:Frame作为中间容器,让ListBox和Scrollbar成为它的子组件,这样两者的尺寸会自动适配Frame的大小,Scrollbar的高度会和ListBox完全一致,不需要手动调整。
  2. 组件布局方式:在Frame内部用pack布局来对齐ListBox和Scrollbar,这是Tkinter中处理滚动组件最便捷的方式;而Frame本身用place放到主窗口的目标位置,满足你对位置的需求。
  3. 关于yscrollcommand的修改:其实你完全可以先创建ListBox,之后再通过listBox.config(yscrollcommand=scrollbar.set)来设置滚动命令,不需要在构造ListBox时就传入,这能解决你之前担心的"无法先创建ListBox再创建Scrollbar"的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:35:08