如何在 guizero/tkinter 中将滑块转换为滚动条?

问题描述

我正在尝试使用 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()

解决方法

您可以使用分配给 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

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

def mouse_wheel(event):
    slider.value += 2 if event.delta < 0 else -2

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...