在python中创建延迟进程
使用tkinter,我希望创建一个按钮,当按下按钮时,它会在x秒内延迟切换 使用time.sleep(x)暂停整个程序,这不是我的本意 怎样才能做到呢 followed-button类(有一个checkbutton小部件、一个显示开/关标签的labelwidget和一个输入延迟秒数的输入小部件) 尝试更新cb函数-获取延迟,但不延迟:在python中创建延迟进程,python,tkinter,Python,Tkinter,使用tkinter,我希望创建一个按钮,当按下按钮时,它会在x秒内延迟切换 使用time.sleep(x)暂停整个程序,这不是我的本意 怎样才能做到呢 followed-button类(有一个checkbutton小部件、一个显示开/关标签的labelwidget和一个输入延迟秒数的输入小部件) 尝试更新cb函数-获取延迟,但不延迟: def cb(self,but): print(but[2].get()) ###(but[2] contains var1.get() -- tim
def cb(self,but):
print(but[2].get()) ###(but[2] contains var1.get() -- timeout for opretion
indx=devices_headers.index(but[0])
device_chage_state(indx,but[1].get())
if but[2].get() >0 :
print ("switch off in %d seconds"%self.status[indx][2].get())
root.after(but[2].get(),self.cb,but)
GUI中相关部分的图片显示每个按钮都有一个超时条目,输入时(大于0)将在输入秒数后关闭
既然您正在使用tkinter,那么最好的方法就是使用。例如,您可以添加如下方法:
def cb_delayed(self, master, but, delay_ms_var):
master.after(delay_ms_var.get(), self.cb, but)
然后在按钮创建更改中:
# ...
c = Checkbutton(
master, text=buts_list[i], variable=var, indicatoron=0,
command=lambda arg=[buts_list[i],var]: self.cb_delayed(master, arg, delay_ms_var),
width=10, height=2, onvalue="on", offvalue="off")
# ...
其中,
delay\u ms\u var
是tkinter变量对象,它包含您希望在更改发生之前具有的延迟(以毫秒为单位)。由于您正在使用tkinter,最好的方法是使用。例如,您可以添加如下方法:
def cb_delayed(self, master, but, delay_ms_var):
master.after(delay_ms_var.get(), self.cb, but)
然后在按钮创建更改中:
# ...
c = Checkbutton(
master, text=buts_list[i], variable=var, indicatoron=0,
command=lambda arg=[buts_list[i],var]: self.cb_delayed(master, arg, delay_ms_var),
width=10, height=2, onvalue="on", offvalue="off")
# ...
其中,
delay\u ms\u var
是tkinter变量对象,它包含您希望在更改发生之前具有的延迟(以毫秒为单位)。感谢您的回答-我有一些问题:1)CheckButton的命令只能传输一个变量(因此我使用lambda和arg=[但是,var])-那么如何将DELAY\u MS
传输到cd\u delayed
功能?2) cbu delayed
在其定义中具有master
。你能解释一下使用它的目的吗?1)我以为延迟是指固定的时间。我将答案改为使用变量对象。这可以像那样传递或添加到arg
,如果您愿意的话;因为tkinter变量在出现问题时容易导致问题,所以在您的情况下可能会更好。2) cbu delayed
中需要master
,以便在之后调用;但是,如果可以从全局变量或从self
访问该对象,则可能不需要将其作为参数传递。感谢您的更新-您可以看到问题附件中的GUI图片。1) delay\u ms\u var
在我的代码中是var1
。当按下任何按钮时,var1
传递给cb_delayed
的值属于最后一个按钮(#4)-这就是为什么我构造了arg
,因为在那里我没有找到任何其他传递值的方法。你能解释一下吗?@Guy.D参数command
是一个函数(或lambda,或通常可调用),按下按钮时Tk会调用该函数。如果使用lambda,则可以使用函数的局部变量(或全局变量)的参数指定调用。例如,请参见。@Guy.D lambda函数未从tkinter接收任何参数;在您的情况下,lambda正在接收arg
,因为它有一个默认值。然而,lambda本身可以自由调用任何参数多的函数;调用cb
/cb_delayed
的不是tkinter,而是lambda,因此您可以完全控制这些函数接收的参数。还有更多回调的例子。谢谢你的回答-我有一些问题:1)CheckButton的命令只能传输一个变量(所以我使用了lambda和arg=[但是列表,var])-那么DELAY\MS
是如何传输到cd\u delayed
函数的呢?2) cbu delayed
在其定义中具有master
。你能解释一下使用它的目的吗?1)我以为延迟是指固定的时间。我将答案改为使用变量对象。这可以像那样传递或添加到arg
,如果您愿意的话;因为tkinter变量在出现问题时容易导致问题,所以在您的情况下可能会更好。2) cbu delayed
中需要master
,以便在之后调用;但是,如果可以从全局变量或从self
访问该对象,则可能不需要将其作为参数传递。感谢您的更新-您可以看到问题附件中的GUI图片。1) delay\u ms\u var
在我的代码中是var1
。当按下任何按钮时,var1
传递给cb_delayed
的值属于最后一个按钮(#4)-这就是为什么我构造了arg
,因为在那里我没有找到任何其他传递值的方法。你能解释一下吗?@Guy.D参数command
是一个函数(或lambda,或通常可调用),按下按钮时Tk会调用该函数。如果使用lambda,则可以使用函数的局部变量(或全局变量)的参数指定调用。例如,请参见。@Guy.D lambda函数未从tkinter接收任何参数;在您的情况下,lambda正在接收arg
,因为它有一个默认值。然而,lambda本身可以自由调用任何参数多的函数;调用cb
/cb_delayed
的不是tkinter,而是lambda,因此您可以完全控制这些函数接收的参数。还有更多回调的例子。