检查Tkinter按钮是否仍然被单击

时间:2018-11-30 12:14:13

标签: python button tkinter

我想制作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)

2 个答案:

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

注意事项:

  • 我没有使用Button的command,因为这不能让您灵活地知道何时释放Button。取而代之的是,我做了两个绑定,一个绑定用于按下按钮,一个绑定用于释放按钮。
  • 我使用after方法在设定的毫秒数后安排对同一函数的新调用,我将对此计划函数的引用保存在全局变量中,以便能够在释放功能以使用after_cancel
  • 取消它
  • .bind调用带有事件对象的函数,而after调用不带参数的函数,因为两者都调用相同的函数,所以我做到了,以便可以在有参数和无参数的情况下调用该函数( e=None

答案 1 :(得分:2)

也使用after的{​​{3}}的替代方法是测量state的{​​{1}}值并检测当前是否为Button为此,我们将一个函数绑定到active,该函数将检查Button,然后在使用state调用该函数之前,如果stateactive,则将值递增短暂延迟后再次出现:

after