在激活滚动条之前框架是可滚动的

问题描述

我只是在尝试滚动条小部件时遇到了一些奇怪的事情。我看到了有关如何使整个程序可滚动的视频,我只是对其进行了调整以动态更新画布的滚动区域,以便滚动条适应更改。一件奇怪的事情是滚动条可以在激活之前向上滚动并将内容向下推。如果你点击向上箭头,它会将内容推到一边,我不想要那样。此外,如果您打包了几帧,足以激活滚动条,则不会这样做。我怎样才能解决这个问题?我的代码

from tkinter import *
from tkinter import ttk

available_row = 1
root = Tk()
root.title("Scrollbar!")
root.geometry("500x320")
my_canvas = Canvas(root)


def add_fr_prg():
    global available_row
    lbl_fr = LabelFrame(second_frame,text=f"I am in row: {available_row}",padx=5,pady=5)
    prg = ttk.Progressbar(lbl_fr,length=300,orient=HORIZONTAL,mode="indeterminate")
    prg.pack()
    prg.start(9)
    lbl_fr.grid(row=available_row,column=0,columnspan=2,pady=3)
    available_row += 1


def scroll_up_down(event):
    my_canvas.yview_scroll(-1 * (int(event.delta / 120)),"units")


my_scrollbar = ttk.Scrollbar(root,orient=VERTICAL,command=my_canvas.yview)
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind_all("<MouseWheel>",scroll_up_down)
my_canvas.pack(side=LEFT,fill=BOTH,expand=1)
second_frame = Frame(my_canvas)
my_canvas.create_window(0,window=second_frame,anchor='nw')
second_frame.bind('<Configure>',lambda e: my_canvas.configure(scrollregion=my_canvas.bBox('all')))
my_scrollbar.pack(side=RIGHT,fill=Y)
add_btn = ttk.Button(second_frame,text="Add!",width=30,takefocus=False,command=add_fr_prg)
add_btn.grid(row=0,padx=66)
root.mainloop()

解决方法

Scrollbar.get() 方法返回一个元组。当没有滚动条时,它返回 (0.0,1.0)。当滚动条处于活动状态时,它会返回一个元组,其中第一个数字 >=0,第二个数字是

所以用这个。

def scroll_up_down(event):
    
    x,y = my_scrollbar.get()
    if x>0 or y < 1 : # or just if my_scrollbar.get() != (0.0,1.0) :
        my_canvas.yview_scroll(-1 * (int(event.delta / 120)),"units")