【问题标题】:Frame is scrollable before scrollbar is activated在激活滚动条之前框架是可滚动的
【发布时间】:2023-04-08 22:39:01
【问题描述】:

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

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

【问题讨论】:

    标签: python python-3.x tkinter tkinter-canvas ttk


    【解决方案1】:

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

    【讨论】:

    • 我试过这个@JacksonPro 并且它的绑定工作但是对于滚动条的命令我的解决方案并不理想并且它有一些问题。如果您演示如何将它用于命令和 binf,我会很高兴
    • @OmidKi 我不太明白你的意思。 “对于绑定它可以工作,但对于滚动条的命令,我的解决方案并不理想并且存在一些问题”是什么意思?
    • A ttk.Scrollbar 仅适用于鼠标单击和鼠标按住,因此我手动将 事件绑定到 scroll_up_down 函数,以便用户可以使用滚轮上下移动,但是当我定义了滚动条我给了它一个 my_canvas.yview 的命令。因此,现在为了消除错误,我必须将其更改为名为 scroll_up_down 的另一个函数,但使用滚动条有两种模式“滚动”和“移动”。我的问题是有没有更好的方法让函数同时适用于 ttk.Scrollbar 的“my_canvas.bind_all”和“command”关键字,而不是检查模式?
    • @OmidKi 您当前的代码运行良好。我不明白你在说什么样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多