【问题标题】:How do you convert a slider into a scrollbar in guizero/tkinter?如何在 guizero/tkinter 中将滑块转换为滚动条?
【发布时间】:2021-06-04 18:04:51
【问题描述】:

我正在尝试使用 Guizero 中的滑块小部件制作滚动条,该小部件适用于应用程序窗口和框小部件。我想出了一种使用滑块移动对象的方法,但它不会动态变化。我需要一种方法来确定滑块的长度,并根据不可见的项目数量限制它可以滚动/向下移动的距离。我试过直接使用 tkinter 直接滚动条和 Guizero,但它只显示但不起作用。我需要使用 滑块,因为它是最容易添加到小部件的。

我正在使用什么

我要做什么

  • 使用 Guizero
  • 更改滑块长度(就像您的网络浏览器一样)
  • 更改最大滚动限制(基于不可见的数量)

我当前的代码

根据 Joe Michail 的回答 tkinter: binding mousewheel to scrollbar

from guizero import *
app=App(title='Guizero - Scrollbar slider',bg='blue',height=500,width=350)
def mouse_wheel(event):
    global count
    # respond to Linux or Windows wheel event
    if event.num == 4 or event.delta == -120:
        if count!=200:
            count += 2
    if event.num == 5 or event.delta == +120:
        if count>=0:
            count -= 2
    slider.value=count
    boxs.tk.place(x=0,y=-count)
count = 0

def slide():
    global count
    count=slider.value
    boxs.tk.place(x=0,y=-count)

# with Windows OS
app.tk.bind("<MouseWheel>", mouse_wheel)
# with Linux OS
app.tk.bind("<Button-4>", mouse_wheel)
app.tk.bind("<Button-5>", mouse_wheel)

#slider end need to change
slider = Slider(app,horizontal=False,width=8,height='fill',start=0, end=200,align='right',command=slide)
slider.tk.config(sliderrelief='flat',
                 sliderlength=(app.height/4),#need to change length dynamically
                 bd=1,
                 borderwidth=1,
                 highlightthickness=0,
                 showvalue=True,
                 fg='white',
                 troughcolor='white',
                 activebackground='orange',
                 bg='blue')

boxs=Box(app,align='right')

for x in range(1,12):    
    Hello_text=Text(boxs, text=" \nHello\n"+str(x), align="top")
    #change the look so you can tell them apart
    if x%2==1:
        Hello_text.bg='white'
    else:
        Hello_text.bg='lightblue'

#default box location
boxs.tk.place(x=0,y=0)

app.display()

【问题讨论】:

    标签: python-3.x tkinter slider scrollbar guizero


    【解决方案1】:

    您可以在 boxs 调整大小时使用分配给 boxs.when_resized 的回调来更新滑块范围:

    def on_boxs_resized(event):
        slider.tk.config(to=event.tk_event.height-app.tk.winfo_height())
    
    boxs.when_resized = on_boxs_resized
    

    请注意,您可以在不使用全局变量count 的情况下简化mouse_wheel()slide() 这两个函数:

    def mouse_wheel(event):
        slider.value += 2 if event.delta < 0 else -2
    
    def slide():
        boxs.tk.place(x=0, y=-slider.value)
    

    更新:您可以更新分配给app.when_resized的回调中的sliderlength选项:

    def on_app_resized(event):
        percent = min(app.height/boxs.tk.winfo_height(), 1.0)
        sliderlength = slider.tk.winfo_height() * percent
        slider.tk.config(sliderlength=sliderlength)
    
    app.when_resized = on_app_resized
    
    # update the app
    app.tk.update()
    # adjust sliderlength of slider
    on_app_resized(None)
    
    app.display()
    

    【讨论】:

    • 在窗口调整大小完成之前,滑块长度不会改变,滑块位置也不会改变。
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多