需要帮助以gpio和after方法找到tkinter的解决方案

问题描述

我正在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",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,所以我的代码非常复制粘贴,而且我肯定很草率。

解决方法

不要将太多功能直接放入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(不带括号)。