tkinter中的小部件按钮的无限循环

时间:2014-11-21 07:55:02

标签: python tkinter widget

我正在尝试实现一个持续运行游戏步骤的按钮。该按钮涉及一个无限循环,它一遍又一遍地运行我的步进功能,直到按钮被释放。问题是它不起作用。相反,它通常冻结或给我

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

如果有人可以帮我解决这个问题,那就太棒了。

2 个答案:

答案 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,但不会使用它。

下一行的话也是如此