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

如何为Tkinter的Label组件添加可正常工作的滚动条?

为Tkinter Label添加垂直滚动条的解决方案

你直接把Label和按钮放在Canvas上的方式无法实现滚动功能,核心问题是没有给Canvas设置正确的滚动容器和滚动范围。正确的做法是将Label和按钮放入一个内部Frame,再把这个Frame嵌入Canvas的滚动窗口中,同时配置滚动相关的绑定与参数。

以下是修改后的完整可运行代码:

import tkinter as tk
from tkinter import ttk

# 示例文本变量(替换为你的实际数据)
xw = "美元: 90.50\n"
xe = "欧元: 98.30\n"
xr = "英镑: 112.70\n"
xt = "日元: 0.62\n"
xy = "加拿大元: 66.80\n"
xu = "澳大利亚元: 58.20\n"
xi = "瑞士法郎: 97.10\n"
xo = "港元: 11.50\n"
xp = "新加坡元: 66.00\n"
xa = "瑞典克朗: 8.50\n"
xs = "挪威克朗: 8.70\n"
xd = "丹麦克朗: 13.20\n"
xf = "阿联酋迪拉姆: 24.60\n"
xg = "沙特里亚尔: 24.00\n"
xh = "巴西雷亚尔: 17.80\n"
xj = "印度卢比: 1.08\n"
xk = "南非兰特: 4.80\n"
xl = "韩元: 0.068\n"
xz = "土耳其里拉: 2.85\n"
xx = "墨西哥比索: 4.90\n"
xc = "新西兰元: 55.30\n"
xv = "菲律宾比索: 1.60\n"
xb = "马来西亚林吉特: 20.00\n"
xn = "泰国泰铢: 2.55\n"
xm = "印尼卢比: 0.0058\n"
xqq = "捷克克朗: 3.90\n"
xqw = "匈牙利福林: 0.25\n"
xqe = "波兰兹罗提: 21.30\n"
xqr = "罗马尼亚列伊: 19.80\n"
xqt = "保加利亚列弗: 49.90\n"
xqy = "克罗地亚库纳: 13.20\n"
xqu = "以色列新谢克尔: 24.50\n"
xq = "埃及镑: 3.10\n"

def but1click():
    pass  # 替换为你的按钮逻辑
def but2click():
    pass  # 替换为你的按钮逻辑

win = tk.Tk()
win.title("Курс валют в рублях по данным ЦБ РФ")
win.geometry('445x200+200+100')
win.resizable(False, False)

frame = tk.Frame(win)
frame.grid(row=0, column=0)

canvas = tk.Canvas(frame)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

scroll = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)
scroll.pack(side=tk.RIGHT, fill=tk.Y)

# 关联Canvas与滚动条
canvas.configure(yscrollcommand=scroll.set)

# 创建内部Frame作为滚动容器
inner_frame = tk.Frame(canvas)
# 将内部Frame嵌入Canvas窗口
canvas.create_window((0, 0), window=inner_frame, anchor="nw")

# 添加Label到内部Frame
lab1 = tk.Label(inner_frame, text="Курс валют в рублях по данным Центрального Банка Российской Федерации")
lab1.configure(text= xw + xe + xr + xt + xy + xu + xi + xo + xp + xa + xs + xd + xf  + xg + xh + xj + xk + xl + xz + xx + xc + xv + xb + xn + xm + xqq + xqw + xqe + xqr + xqt + xqy + xqu + xq, justify=tk.LEFT)
lab1.pack(fill=tk.X)

# 添加按钮到内部Frame
but1 = tk.Button(inner_frame, text="Список всех валют с их курсами", command=but1click)
but2 = tk.Button(inner_frame, text="Перевод с иностранной валюты в рубли", command=but2click)
but1.pack(side="right", pady=5)
but2.pack(side="left", pady=5)

# 动态更新滚动范围
def update_scrollregion(event):
    canvas.configure(scrollregion=canvas.bbox("all"))

inner_frame.bind("<Configure>", update_scrollregion)

win.mainloop()

关键修改说明:

  • 内部容器Frame:把Label和按钮统一放入inner_frame,Canvas滚动的是这个完整容器,而非单个组件。
  • Canvas窗口嵌入:通过canvas.create_window将内部Frame添加到Canvas中,指定左上角锚点确保布局对齐。
  • 滚动范围动态更新:绑定内部Frame的<Configure>事件,每次内容或容器大小变化时,自动更新Canvas的scrollregion,确保滚动覆盖所有内容。
  • 双向滚动关联:补充canvas.configure(yscrollcommand=scroll.set),让滚动条能实时反映Canvas的滚动位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:12:04