只要按下按钮,如何更改值
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)
我有一个初始值 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)