只要按下按钮,如何更改值

How make a value being changed as long as a button is being pressed

我有一个初始值 CamTimeObsVar = 50,只要按下按钮 btnCamTimeL,我就希望它减少。当我松开按钮时停止减少。我尝试了以下代码,但变量只减少了一次。是否可以控制变化速度?我尝试了 sleep(0.1) 但它不起作用。

提前致谢。

我的代码是:

from tkinter import *
from time import sleep

root = Tk()
root.geometry('800x480')
Pressed = False

def CamTimeObsVarL(event):
    global CamTimeObsVar
    
    print("Button is pressed")
    CamTimeObsVar = CamTimeObsVar - 1
    lblCamTime['text'] = str(CamTimeObsVar) + ' sec'
    sleep(0.1)
    

def Stop(event):
    global Pressed
    print("Stopping")
    Pressed = False

myFrame = Frame(root, width = 800, height=480)
CamTimeObsVar = 100
lblCamTime = Label(root)
lblCamTime.place(x=650, y=50)
lblCamTime['text'] = str(CamTimeObsVar) + ' sec'
btnCamTimeL = Button(root, text ='L', width=1, height=1, bg='red')
btnCamTimeL.place(x=620, y=50)

btnCamTimeL.bind('<ButtonPress-1>',CamTimeObsVarL)
btnCamTimeL.bind('<ButtonRelease-1>',Stop)

root.mainloop()

您可以在按下按钮时使用 after() 开始定期更新,然后在释放按钮时取消 after() 任务:

def CamTimeObsVarL(event=None):
    global after_id, CamTimeObsVar
    print("Button is pressed")
    if CamTimeObsVar > 0:
        CamTimeObsVar -= 1
        lblCamTime['text'] = str(CamTimeObsVar) + ' sec'
        after_id = lblCamTime.after(100, CamTimeObsVarL) # update again 0.1 second later

def Stop(event):
    global after_id
    print("Stopping")
    if after_id:
        lblCamTime.after_cancel(after_id)
        after_id = None

另一种方法是将 ButtonPress 事件和 ButtonRelease 事件绑定到同一个事件处理程序,并使用 stop 之类的检查。此停止最初为 False,只有在 event.type==5 即鼠标释放事件时才会变为 True

from tkinter import *
from time import sleep

root = Tk()
root.geometry('800x480')
stop = False

def CamTimeObsVarL(event=None):
    global CamTimeObsVar, stop

    if event and int(event.type) == 4:
        stop = False

    if event and int(event.type) == 5:
        print('stopping')
        stop = True
    
    if stop==False:
        CamTimeObsVar = CamTimeObsVar - 1
        lblCamTime['text'] = str(CamTimeObsVar) + ' sec'
        print("Button is pressed")
        a = root.after(100, CamTimeObsVarL)

myFrame = Frame(root, width = 800, height=480)
CamTimeObsVar = 100
lblCamTime = Label(root)
lblCamTime.place(x=650, y=50)
lblCamTime['text'] = str(CamTimeObsVar) + ' sec'
btnCamTimeL = Button(root, text ='L', width=1, height=1, bg='red')
btnCamTimeL.place(x=620, y=50)

btnCamTimeL.bind('<ButtonPress-1>',CamTimeObsVarL)
btnCamTimeL.bind('<ButtonRelease-1>',CamTimeObsVarL, '+')

root.mainloop()

或者您也可以将 Release 事件和 press 事件绑定到不同的处理程序,如下所示。


def CamTimeObsVarL(event=None):
    global CamTimeObsVar, stop

    if event and int(event.type) == 4:
        stop = False
    
    if stop==False:
        CamTimeObsVar = CamTimeObsVar - 1
        lblCamTime['text'] = str(CamTimeObsVar) + ' sec'
        print("Button is pressed")
        a = root.after(100, CamTimeObsVarL)

def end(event):
    global stop
    stop = True


btnCamTimeL.bind('<ButtonPress-1>',CamTimeObsVarL)
btnCamTimeL.bind('<ButtonRelease-1>',end)