0

我正在 tkinter 做一个问卷调查项目。如果你回答正确,它会带你到一个结束页面,它会提示你按下一个按钮。一旦你按下那个按钮,我需要将 GPIO 引脚设置为高电平并保持一段时间,然后切换回低电平。之后,它会带您返回主页以重新开始问卷调查。

我从 time.sleep 函数开始将引脚保持在高位,我了解到这不适用于 GUI。尽管如此,它确实对我有用,但通过测试,我发现在它处于睡眠状态时,按钮仍会按下按钮,并且似乎会缓冲它们,这在第一次按下按钮后似乎会堆叠起来。

在做了一些搜索之后,我找到了 after 方法,我尝试实现它,它似乎做了一些非常相似的事情。我想让程序尽可能地万无一失,所以如果有人不耐烦并按两次按钮,它不会延长持续时间并使其锁定。

我还考虑过在按下后尝试禁用按钮,但我似乎无法让它正常工作。

这是提示您按下按钮然后触发gpio变高的窗口,等待一段时间然后变低。然后将其切换到主页。我也让它移动鼠标,这样它就不会悬停在下一页的按钮上

class PleasePass(tk.Frame):
def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)

    label = tk.Label(self, text="Thank you \n Please press the button then proceed to tempature reading",
                     font=('Helvetica', 30))
    label.grid(column=0, row=0, padx=110, pady=200)

    button1 = tk.Button(self, text="Ready to Proceed", height=3, width=50, bg="lightgreen",
                        fg="black", font=('Helvetica', 20, "bold"),
                        command=lambda: [GPIO.output(26, GPIO.HIGH), self.after(2000),
                                         GPIO.output(26, GPIO.LOW),
                                         controller.show_frame(StartPage),
                                         self.event_generate('<Motion>', warp=True, x=50, y=50)])

    button1.grid(column=0, row=100)

我很感激这方面的一些帮助。我刚刚开始学习如何使用 python 和 tkinter,所以我的代码非常复制粘贴,我敢肯定非常草率。

4

1 回答 1

0

不要将这么多功能直接放入 lambda 函数中。在你的类中写一个额外的方法:

def clicked(self):
    self.button1.config(state="disabled") # disable button
    GPIO.output(26, GPIO.HIGH)
    self.after(2000, self.proceed) # call method proceed after 2 seconds

def proceed(self):
    GPIO.output(26, GPIO.LOW)
    # additional stuff

现在,在您的__init__方法中,将 button1 设置为带有self.button1 = tk.Button(.... 最后,您可以简单地将 Button 的命令参数设置为您的新方法:(command=self.clicked不带括号)。

于 2020-09-17T19:56:22.353 回答