需要帮助使用 gpio 和 after 方法找到 tkinter 的解决方案
Need help finding a solution to tkinter with gpio and after method
我正在 tkinter 中做一个问卷项目。如果您回答正确,它会将您带到结束页面,提示您按一个按钮。一旦你按下那个按钮,我需要将 GPIO 引脚设置为高电平并保持一段时间,然后切换回低电平。之后,它会将您带回主页以重新开始问卷调查。
我从 time.sleep 功能开始,以将引脚保持在高位,我了解到这不适用于 GUI。尽管如此,它确实对我有用,但通过测试它,我发现当它在休眠期间,按钮仍然会按下按钮,并且似乎缓冲它们,这似乎在第一次按下按钮后堆叠起来。
经过一些搜索后,我找到了 after 方法并尝试实现它,它似乎做了一些非常相似的事情。我想让程序尽可能万无一失,这样如果有人不耐烦并按了两次按钮,它就不会延长持续时间并使其锁定。
我也研究过尝试在按下后禁用按钮,但我似乎无法让它正常工作。
这是window提示你按下按钮然后触发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,所以我的代码非常复制粘贴,而且我肯定很马虎。
不要直接将这么多功能放入 lambda 函数中。在你的class中写一个额外的方法:
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__
方法中,使用 self.button1 = tk.Button(...
将 button1 设为实例变量。最后,您只需将 Button 的命令参数设置为您的新方法:command=self.clicked
(不带括号)。
我正在 tkinter 中做一个问卷项目。如果您回答正确,它会将您带到结束页面,提示您按一个按钮。一旦你按下那个按钮,我需要将 GPIO 引脚设置为高电平并保持一段时间,然后切换回低电平。之后,它会将您带回主页以重新开始问卷调查。
我从 time.sleep 功能开始,以将引脚保持在高位,我了解到这不适用于 GUI。尽管如此,它确实对我有用,但通过测试它,我发现当它在休眠期间,按钮仍然会按下按钮,并且似乎缓冲它们,这似乎在第一次按下按钮后堆叠起来。
经过一些搜索后,我找到了 after 方法并尝试实现它,它似乎做了一些非常相似的事情。我想让程序尽可能万无一失,这样如果有人不耐烦并按了两次按钮,它就不会延长持续时间并使其锁定。
我也研究过尝试在按下后禁用按钮,但我似乎无法让它正常工作。
这是window提示你按下按钮然后触发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,所以我的代码非常复制粘贴,而且我肯定很马虎。
不要直接将这么多功能放入 lambda 函数中。在你的class中写一个额外的方法:
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__
方法中,使用 self.button1 = tk.Button(...
将 button1 设为实例变量。最后,您只需将 Button 的命令参数设置为您的新方法:command=self.clicked
(不带括号)。