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

Frame is scrollable before scrollbar is activated

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

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, padx=5, 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, 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, column=0, padx=66)
root.mainloop()

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

所以用这个。

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")