Python Tkinter中框架的垂直滚动条
我的目标是在全屏窗口的右侧有一个滚动条,允许用户在各种不同的小部件(如标签和按钮)之间上下滚动。 从我在这个网站上看到的其他答案中,我得出了一个结论,那就是必须将滚动条分配给画布才能使其正常工作,我已经尝试将其包括在我的代码中,但没有取得多大成功 下面的代码显示了我迄今为止所完成的工作的简化版本:Python Tkinter中框架的垂直滚动条,python,python-3.x,tkinter,scrollbar,tkinter-canvas,Python,Python 3.x,Tkinter,Scrollbar,Tkinter Canvas,我的目标是在全屏窗口的右侧有一个滚动条,允许用户在各种不同的小部件(如标签和按钮)之间上下滚动。 从我在这个网站上看到的其他答案中,我得出了一个结论,那就是必须将滚动条分配给画布才能使其正常工作,我已经尝试将其包括在我的代码中,但没有取得多大成功 下面的代码显示了我迄今为止所完成的工作的简化版本: from tkinter import * root = Tk() root.state("zoomed") root.title("Vertical Scrollbar") frame = Fram
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()
运行此代码时,我面临两个问题:
一是滚动条处于非活动状态,不允许用户向下滚动查看其余文本
另一个是滚动条附加到文本的右侧,而不是窗口的右侧
到目前为止,我在这个网站上找到的其他答案都没有使我能够修改我的代码以支持程序的完整功能滚动条。我非常感谢阅读本文的任何人提供的任何帮助。请再次参阅链接:
它展示了如何创建滚动框架,然后您可以在此框架中添加所有小部件
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()
将tkinter作为tk导入
def on_配置(事件):
#启动“mainloop”后更新scrollregion
#当所有小部件都在画布中时
configure(scrollregion=canvas.bbox('all'))
root=tk.tk()
#---使用滚动条创建画布---
canvas=tk.canvas(根)
帆布包装(侧面=左侧)
scrollbar=tk.scrollbar(根,命令=canvas.yview)
scrollbar.pack(side=tk.LEFT,fill='y')
configure(yscrollcommand=scrollbar.set)
#启动“mainloop”后更新scrollregion
#当所有小部件都在画布中时
canvas.bind(“”,在配置上)
#---把框架放在画布上---
frame=tk.frame(画布)
canvas.create_window((0,0),window=frame,anchor='nw')
#---在框架中添加小部件---
l=tk.Label(框架,text=“Hello”,font=“-size 50”)
l、 包()
l=tk.标签(框架,text=“World”,font=“-size 50”)
l、 包()
l=tk.Label(框架,text=“测试文本1\n测试文本2\n测试文本3\n测试文本4\n测试文本5\n测试文本6\n测试文本7\n测试文本8\n测试文本9”,font=“-size 20”)
l、 包()
#---启动程序---
root.mainloop()
我建议使用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()
您必须使用
create\u window
而不是pack
将框架放入画布。见@bryan oakley嗨,bryan,谢谢你的回复。我已尝试将“.pack()”替换为“.create_window((4,4),window=frame,anchor=“nw”)”,正如您提供的链接所示。不幸的是,这导致我的文本标签完全消失,只显示一个滚动条。另外,我应该将框架放在画布中,而不是将画布放在框架中吗?标签需要放在框架中,框架需要用create_window
@bryan oakley添加到画布中好的,我已经将frame.pack()
更改为frame.create_window((4,4),window=canvas,anchor=“nw”)
我已经更改了canvas.create_window((4,4),window=frame,anchor=“nw”)
返回到canvas.pack()
。这给了我以下错误:AttributeError:“Frame”对象没有属性“create\u window”
。如果要滚动Frame,请将Frame放在画布中(canvas.create\u window(…,Frame)
)。如果要滚动标签,请将标签放在画布内(canvas.create_window(…,label)
)或标签放在框架内(label(frame)
)和框架内(canvas.create_window(…,frame)
)。请参阅Bryan link如何将框架添加到画布(以及使用滚动条添加框架),然后您可以轻松地在此框架中添加所有小部件。请解释链接与问题的关系以及它是如何工作的。老实说,我已经很久没有看这段代码了,但我认为您所发现的正是我所寻找的!希望这个答案对其他人有帮助好吧,我加了一个例子:)