问题描述
我正在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
(不带括号)。