我正在尝试实现一个持续运行游戏步骤的按钮。该按钮涉及一个无限循环,它一遍又一遍地运行我的步进功能,直到按钮被释放。问题是它不起作用。相反,它通常冻结或给我
TypeError: <lambda>() takes 0 positional arguments but 1 was given
以下是代码:
def __init__(self, root):
Frame.__init__(self, root)
self.butt_released = False
button3 = Button(self.but_frame, text='Step', width=15, command=lambda :self.step_funct())
button3.pack(side='right')
button4 = Button(self.but_frame, text='Run', width=15)
button4.pack(side='right')
button4.bind("<Button-1>", lambda :self.run_funct())
button4.bind("<ButtonRelease-1>", lambda :self.butt_release())
def run_funct(self):
while True:
self.step_funct()
time.sleep(1)
if self.butt_released:
break
self.butt_released = False
def butt_release(self):
self.butt_released = True
如果有人可以帮我解决这个问题,那就太棒了。
答案 0 :(得分:1)
您需要使用root.after()函数,因此请尝试:
def __init__(self, root):
Frame.__init__(self, root)
self.root = root
self.butt_released = True
button3 = Button(self.but_frame, text='Step', width=15, command=lambda :self.step_funct())
button3.pack(side='right')
button4 = Button(self.but_frame, text='Run', width=15)
button4.pack(side='right')
button4.bind("<Button-1>", self.butt_press)
button4.bind("<ButtonRelease-1>", self.butt_release)
def butt_press(self, event):
self.butt_released = False
self.run_funct()
def run_funct(self):
if not self.butt_released:
self.step_funct()
self.root.after(10, self.run_funct)
def butt_release(self, event):
self.butt_released = True
答案 1 :(得分:1)
虽然Benjamin James Drury完全正确,并且使用time.sleep
并在使用Tkinter时创建无限循环(Tkinter主循环除外)是非常糟糕的想法,我想指出具体原因你发布的错误。
您的错误来自
行button4.bind("<Button-1>", lambda :self.run_funct())
bind函数将事件对象传递给给定的函数,但是lambda不接受任何参数。要让lambda接受事件而不使用它,您可以使用
button4.bind("<Button-1>", lambda e :self.run_funct())
这会将事件接受为e
,但不会使用它。
下一行的话也是如此