检查Tkinter按钮是否仍处于单击状态

2024-10-03 21:32:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做两个按钮(+和-)可以改变音量。但是如果我想增加音量,我想继续按这个按钮。你知道如何检查用户是否按下了按钮吗?你知道吗

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)

Tags: textdefbutton按钮win音量fontset
2条回答

你可以做的是让按钮触发一个功能,改变音量,然后安排自己在一段时间后(例如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,因为这不能让您灵活地知道按钮何时被释放。相反,我做了两个绑定,一个是按下按钮时绑定,一个是松开按钮时绑定。你知道吗
  • 我使用after方法在设置的毫秒数之后安排对同一函数的新调用,我将对该计划函数的引用保存在全局变量中,以便能够在release函数中再次使用它来用after_cancel取消它
  • .bind用一个事件对象调用函数,而after调用一个没有参数的函数,因为两者都调用同一个函数,所以我这样做是为了可以用参数和没有参数调用函数(e=None

也使用afterfhdrsdg's answer的替代方法是测量Buttonstate值并检测它当前是否为active,为此,我们将一个函数绑定到Button,该函数检查state,然后如果stateactive,则增加一个值,然后使用after在短暂延迟后再次调用该函数:你知道吗

from tkinter import *

class App():
    def __init__(self, root):
        self.root = root
        self.button = Button(self.root, text="Increment")

        self.value = 0

        self.button.pack()
        self.button.bind("<Button-1>", lambda x: self.root.after(10, self.increment))

    def increment(self, *args):
        if self.button["state"] == "active":
            self.value += 1
            print(self.value)
            self.root.after(10, self.increment)

root = Tk()
App(root)
root.mainloop()

相关问题 更多 >