Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中创建延迟进程_Python_Tkinter - Fatal编程技术网

在python中创建延迟进程

在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

使用tkinter,我希望创建一个按钮,当按下按钮时,它会在x秒内延迟切换

使用time.sleep(x)暂停整个程序,这不是我的本意

怎样才能做到呢

followed-button类(有一个checkbutton小部件、一个显示开/关标签的labelwidget和一个输入延迟秒数的输入小部件)

尝试更新cb函数-获取延迟,但不延迟:

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,因此您可以完全控制这些函数接收的参数。还有更多回调的例子。