如何解决如何在 guizero/tkinter 中将滑块转换为滚动条?
我正在尝试使用 Guizero 中的滑块小部件制作滚动条,该小部件可与应用程序窗口和框小部件配合使用。我想出了一种使用滑块移动对象的方法,但它不会动态更改。我需要一种滑块长度的方法,并根据不可见项目的数量限制它可以滚动/向下移动的距离。我曾尝试将 tkinter 直接与 Guizero 直接滚动条一起使用,但它仅显示但不起作用。我需要使用滑块,因为它最容易添加到小部件中。
我在用什么
- Thonny Ide
- Python 3.7.9
- Guizero 1.2.0
- tk.place 根据计数移动对象
我想做什么
- 使用 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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。