【问题标题】:Limiting Python Tkitner canvas scrollbar to only respond to mousewheel when full将 Python Tkinter 画布滚动条限制为仅在已满时响应鼠标滚轮
【发布时间】: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


【解决方案1】:

据我所知,您无法检查已经添加了多少按钮,这是正确的吗?我认为在您当前的配置中,无法决定是否滚动。

我的方法是注册您已经使用了多少个按钮(或多少垂直空间)(在添加新按钮时更新),然后将 on_mousewheel 中的值与窗口大小进行比较并决定是否yview_scroll() 是否被触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2018-04-20
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多