限制 Python Tkitner canvas 滚动条仅在满时响应鼠标滚轮
Limiting Python Tkitner canvas scrollbar to only respond to mousewheel when full
我在下面编写了 tkinter 代码,这样 canvas 可以通过滚动条或鼠标滚轮滚动。滚动条默认工作,因此仅当内容大于 canvas 时才启用,我想对鼠标滚轮滚动应用相同的限制。
我下面的代码生成一个 window,我可以在其中滚动浏览 canvas 上的按钮。如果有 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()
据我所知,您无法检查已经添加了多少个按钮,这是否正确?我认为在您当前的配置中无法决定是否滚动。
我的方法是注册您已经使用了多少个按钮(或多少个垂直 space)(在添加新按钮时更新),然后在 on_mousewheel
到 window 大小并决定是否触发 yview_scroll()
。
我在下面编写了 tkinter 代码,这样 canvas 可以通过滚动条或鼠标滚轮滚动。滚动条默认工作,因此仅当内容大于 canvas 时才启用,我想对鼠标滚轮滚动应用相同的限制。
我下面的代码生成一个 window,我可以在其中滚动浏览 canvas 上的按钮。如果有 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()
据我所知,您无法检查已经添加了多少个按钮,这是否正确?我认为在您当前的配置中无法决定是否滚动。
我的方法是注册您已经使用了多少个按钮(或多少个垂直 space)(在添加新按钮时更新),然后在 on_mousewheel
到 window 大小并决定是否触发 yview_scroll()
。