我想制作2个可以改变音量的按钮(+和-)。但是,如果我想进一步增加音量,则可以按住该按钮。有什么想法如何检查用户是否仍然按下按钮吗?
def volumeUp():
currentVolume = m.getvolume()[0]
volumeSlider.set(currentVolume + 5)
def volumeDown():
currentVolume = m.getvolume()[0]
volumeSlider.set(currentVolume - 5)
volumeDownButton = Button(win, text = "-", font = myFont, command = volumeDown, height = 1, width = 1)
volumeDownButton.pack(side = BOTTOM)
volumeUpButton = Button(win, text = "+", font = myFont, command = volumeUp, height = 1, width = 1)
volumeUpButton.pack(side = BOTTOM)
答案 0 :(得分:2)
您可以做的是使Button按下触发功能,该功能会更改音量,然后安排自己在一定时间(例如100毫秒)后再次运行。然后,当释放按钮时,您可以取消更改音量以中断循环的功能的预定重复。
我对您的代码做了一些改动,以举例说明:
from tkinter import *
win = Tk()
def volumeUpPress(e=None):
global up_after
currentVolume = volumeSlider.get()
volumeSlider.set(currentVolume + 2)
up_after = win.after(100, volumeUpPress)
def volumeUpRelease(e=None):
global up_after
win.after_cancel(up_after)
def volumeDownPress(e=None):
global down_after
currentVolume = volumeSlider.get()
volumeSlider.set(currentVolume - 2)
down_after = win.after(100, volumeDownPress)
def volumeDownRelease(e=None):
global down_after
win.after_cancel(down_after)
volumeSlider = Scale(win, from_=0, to=100, orient=HORIZONTAL)
volumeSlider.pack()
volumeDownButton = Button(win, text = "-", height = 1, width = 1)
volumeDownButton.pack(side = BOTTOM)
volumeDownButton.bind("<Button-1>", volumeDownPress)
volumeDownButton.bind("<ButtonRelease-1>", volumeDownRelease)
volumeUpButton = Button(win, text = "+", height = 1, width = 1)
volumeUpButton.pack(side = BOTTOM)
volumeUpButton.bind("<Button-1>", volumeUpPress)
volumeUpButton.bind("<ButtonRelease-1>", volumeUpRelease)
win.mainloop()
注意事项:
command
,因为这不能让您灵活地知道何时释放Button。取而代之的是,我做了两个绑定,一个绑定用于按下按钮,一个绑定用于释放按钮。
after
方法在设定的毫秒数后安排对同一函数的新调用,我将对此计划函数的引用保存在全局变量中,以便能够在释放功能以使用after_cancel
.bind
调用带有事件对象的函数,而after
调用不带参数的函数,因为两者都调用相同的函数,所以我做到了,以便可以在有参数和无参数的情况下调用该函数( e=None
)答案 1 :(得分:2)
也使用after
的{{3}}的替代方法是测量state
的{{1}}值并检测当前是否为Button
为此,我们将一个函数绑定到active
,该函数将检查Button
,然后在使用state
调用该函数之前,如果state
是active
,则将值递增短暂延迟后再次出现:
after