Tkinter 中框架的垂直滚动条,Python

Vertical scrollbar for frame in Tkinter, Python

我的目标是让滚动条位于全屏的右侧 window,允许用户上下滚动浏览各种不同的小部件(例如标签和按钮)。 从我在这个网站上看到的其他答案,我得出的结论是必须将滚动条分配给 canvas 才能使其正常运行,我试图将其包含在我的代码中但是没有取得太大的成功。

下面的代码显示了到目前为止我已经完成的简化版本:

from tkinter import *
root = Tk()
root.state("zoomed")
root.title("Vertical Scrollbar")
frame = Frame(root)
canvas = Canvas(frame)
Label(canvas, text = "Test text 1\nTest text 2\nTest text 3\nTest text 4\nTest text 5\nTest text 6\nTest text 7\nTest text 8\nTest text 9", font = "-size 100").pack()
scrollbar = Scrollbar(frame)
scrollbar.pack(side = RIGHT, fill = Y)
canvas.configure(yscrollcommand = scrollbar.set)
canvas.pack()
frame.pack()
root.mainloop()

当 运行 此代码时,我面临两个问题:

一个是滚动条处于非活动状态,不允许用户向下滚动以查看其余文本。

另一种是滚动条附在文字的右侧,而不是window的右侧。

到目前为止,我在此站点上找到的其他答案中的 none 使我能够修改我的代码以支持我的程序的全功能滚动条。如果阅读本文的任何人能提供任何帮助,我将不胜感激。

再看link:

它展示了如何创建滚动框架 - 然后您可以在此框架中添加所有小部件。

import tkinter as tk


def on_configure(event):
    # update scrollregion after starting 'mainloop'
    # when all widgets are in canvas
    canvas.configure(scrollregion=canvas.bbox('all'))


root = tk.Tk()

# --- create canvas with scrollbar ---

canvas = tk.Canvas(root)
canvas.pack(side=tk.LEFT)

scrollbar = tk.Scrollbar(root, command=canvas.yview)
scrollbar.pack(side=tk.LEFT, fill='y')

canvas.configure(yscrollcommand = scrollbar.set)

# update scrollregion after starting 'mainloop'
# when all widgets are in canvas
canvas.bind('<Configure>', on_configure)

# --- put frame in canvas ---

frame = tk.Frame(canvas)
canvas.create_window((0,0), window=frame, anchor='nw')

# --- add widgets in frame ---

l = tk.Label(frame, text="Hello", font="-size 50")
l.pack()

l = tk.Label(frame, text="World", font="-size 50")
l.pack()

l = tk.Label(frame, text="Test text 1\nTest text 2\nTest text 3\nTest text 4\nTest text 5\nTest text 6\nTest text 7\nTest text 8\nTest text 9", font="-size 20")
l.pack()

# --- start program ---

root.mainloop()

我会推荐使用 tkScrolledFrame https://pypi.org/project/tkScrolledFrame/ 他们在网站上也有一个很好的小例子。非常易于使用,非常适合我。

下面是一个简单的例子:


from tkscrolledframe import ScrolledFrame
import tkinter as tk

# Create a root window
root = tk.Tk()

frame_top = tk.Frame(root, width=400, height=250)
frame_top.pack(side="top", expand=1, fill="both")

# Create a ScrolledFrame widget
sf = ScrolledFrame(frame_top, width=380, height=240)
sf.pack(side="top", expand=1, fill="both")

# Bind the arrow keys and scroll wheel
sf.bind_arrow_keys(frame_top)
sf.bind_scroll_wheel(frame_top)

frame = sf.display_widget(tk.Frame)

l = tk.Label(frame, text="Test text 1\nTest text 2\nTest text 3\nTest text 4\nTest text 5\nTest text 6\nTest text 7\nTest text 8\nTest text 9", font="-size 20")
l.pack()

root.mainloop()