【发布时间】:2015-07-14 13:05:25
【问题描述】:
我在下面编写了 tkinter 代码,以便可以通过滚动条或鼠标滚轮滚动画布。滚动条默认工作,因此仅在内容大于画布时才启用,我想对鼠标滚轮滚动应用相同的限制。
我下面的代码会生成一个窗口,我可以在其中滚动浏览画布上的按钮。如果有 3 个或更多按钮,这很好,但只有 1 个或 2 个,它当然可以滚动。
有什么想法吗?提前致谢。
from tkinter import *
root = Tk()
root.resizable(0, 0)
class Scroller():
def __init__(self):
self.scroll_canvas = Canvas(root, borderwidth=0, highlightthickness=0, height=200)
self.scroll_frame = Frame(self.scroll_canvas, background="#ffffff")
self.scroll_canvas.create_window(4, 4, window=self.scroll_frame)
self.vsb = Scrollbar(root, orient="vertical", command=self.scroll_canvas.yview)
self.scroll_canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.scroll_canvas.pack(side="left", fill='both', expand=True)
self.scroll_frame.bind("<Configure>", self.scroll_configure)
self.scroll_canvas.bind_all("<MouseWheel>", self.on_mousewheel)
def on_mousewheel(self, event):
if event.num == 5 or event.delta == -120:
direction = 1
if event.num == 4 or event.delta == 120:
direction = -1
self.scroll_canvas.yview_scroll(direction, "units")
def scroll_configure(self, event):
self.scroll_canvas.configure(scrollregion=self.scroll_canvas.bbox("all"))
buttons_frame = Frame(Scroller().scroll_frame, padx=5, pady=5)
buttons_frame.grid(row=1, column=1, sticky=N)
add_button = Button(buttons_frame, text='This\nis\na\nbutton.\nAdd Another Button',
command=lambda: add_another_button())
add_button.pack()
def add_another_button():
Button(buttons_frame, text='This\nis\na\nbutton.\nAdd Another Button', command=lambda: add_another_button()).pack()
root.mainloop()
【问题讨论】:
-
re:“它当然可以滚动”。你在观察这个吗?如果您设置
scrollregion,则滚动应限制在给定区域。
标签: python canvas scroll tkinter scrollbar