Tkinter - 如何停止滚动条在画布窗口之上

4

我有一个带有鼠标滚轮绑定滚动功能的可滚动框架,但当框架小于画布时,我能够在其上方滚动 - 我该如何使框架保持在画布顶部?

以下是代码的最简版本:

import tkinter as tk

class Gui:
    def __init__(self, master):
        self.root = master
        self.canvas = tk.Canvas(self.root)
        self.frame = tk.Frame(self.canvas,bg='white')
        self.scroll = tk.Scrollbar(self.canvas,orient='vertical', command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scroll.set)

        self.scroll.pack(side='right', fill='y')
        self.canvas.place(relheight=1, relwidth=0.85, relx=0.15)
        self.canvas_frame = self.canvas.create_window((0,0), window=self.frame, anchor='nw')

        self.frame.bind('<Configure>', self.onFrameConfigure)
        self.canvas.bind_all('<MouseWheel>', lambda event: self.canvas.yview_scroll(int(-1*(event.delta/120)), 'units'))
        self.addToFrame()
    def onFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox('all'))

    def addToFrame(self):
        self.label = tk.Label(self.frame,text='Label')
        self.label.pack()
        
if __name__ == "__main__":
    root = tk.Tk()
    gui = Gui(root)
    root.mainloop()
1个回答

7
你可以定义自己的 yview() 方法,只在画布内容未完全可见时进行滚动。为此,我使用了 self.canvas.yview(),如果画布内容全部可见,则返回(0.0,1.0)。然后我将自定义的 yview() 方法用作滚动条命令,并在鼠标滚轮绑定中使用。
import tkinter as tk

class Gui:
    def __init__(self, master):
        self.root = master
        self.canvas = tk.Canvas(self.root)
        self.frame = tk.Frame(self.canvas,bg='white')
        self.scroll = tk.Scrollbar(self.canvas,orient='vertical', command=self.yview)
        self.canvas.configure(yscrollcommand=self.scroll.set)

        self.scroll.pack(side='right', fill='y')
        self.canvas.place(relheight=1, relwidth=0.85, relx=0.15)
        self.canvas_frame = self.canvas.create_window((0,0), window=self.frame, anchor='nw')

        self.frame.bind('<Configure>', self.onFrameConfigure)
        self.canvas.bind_all('<MouseWheel>', lambda event: self.yview('scroll', int(-1*(event.delta/120)), 'units'))
        self.addToFrame()

    def onFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox('all'))

    def addToFrame(self):
        self.label = tk.Label(self.frame,text='Label')
        self.label.pack()

    def yview(self, *args):
        if self.canvas.yview() == (0.0, 1.0):
            return
        self.canvas.yview(*args)

if __name__ == "__main__":
    root = tk.Tk()
    gui = Gui(root)
    root.mainloop()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接