如何解决如何处理意外的按键
我设计了一个具有两个按钮的应用程序,即 CAL 和 SAV 。 因此,我有两个功能,但问题有时是生产线操作员错误地按下了 SAV 按钮。这样会出现属性错误,并且程序被卡住。
如何克服这个问题?请引导我。
这是我的代码:
class ADS1x15:
"""Base functionality for ADS1x15 analog to digital converters."""
class ADS1115(ADS1x15):
"""Class for the ADS1115 16 bit ADC."""
class AnalogIn:
"""AnalogIn Mock Implementation for ADC Reads."""
import RPi.GPIO as GPIO
import tkinter as tk
GPIO.setmode(GPIO.BCM)
GPIO.setup(12,GPIO.IN) #Save Button
GPIO.setup(5,GPIO.IN) #Cal Button
root=tk.Tk()
root.geometry("1000x600")
file = open("/home/pi/data_log.txt","r")
f = file.read().split(',')
rangeh = int(f[3])
offset = int(f[4])
fullScale = int(f[5])
chan=AnalogIn(ads,P0,P1)
def cal(channel):
global Dsel,cal_c,rangeh,offset,fullScale,chan
cal_c = cal_c + 1
if cal_c == 1:
root.L1 = tk.Label(root,text="Put Zero Weight and Press CAL btn",fg="brown",font="bold")
root.L1.pack()
root.L1.place(x=1,y=1)
elif cal_c == 2:
root.L1.destroy()
offset = chan.value
file = open("/home/pi/data_log.txt","w")
if os.stat("/home/pi/data_log.txt").st_size == 0:
file.write("rangeh,Full_Scale,\n")
file.write(str(rangeh)+","+str(offset)+","+str(fullScale))
file.flush()
root.L2 = tk.Label(root,text="Put Full Weight and Press SAV btn",font="bold")
root.L2.pack()
root.L2.place(x=1,y=1)
def sav(channel):
global rangeh,fullScale
file = open("/home/pi/data_log.txt","w")
if os.stat("/home/pi/data_log.txt").st_size == 0:
file.write("rangeh,\n")
file.write(str(rangeh)+","+str(fullScale))
file.flush()
root.L2.destroy()
def update():
""" function for continuous show value in every 500ms in tkinter window"""
GPIO.add_event_detect(5,GPIO.RISING,callback=cal,bouncetime=1000)
GPIO.add_event_detect(12,callback=sav,bouncetime=1000)
root.after(500,update)
root.mainloop()
由于root.L2.destroy()
这一行而产生此错误。
我可以阻止或禁用此sav
函数,以便在不调用cal
函数的情况下不执行该功能吗?
解决方法
蛮力解决方案是检查root是否具有L2属性
from tkinter import messagebox
def sav(channel):
if hasattr(root,'L2'):
global rangeh,offset,fullScale
file = open("/home/pi/data_log.txt","w")
if os.stat("/home/pi/data_log.txt").st_size == 0:
file.write("rangeh,Full_Scale,\n")
file.write(str(rangeh) + "," + str(offset) + "," + str(fullScale))
file.flush()
root.L2.destroy()
else:
messagebox.showinfo('Unable to save','No data was generated yet')
一种更优雅的方法是在启动时禁用保存按钮,并仅在执行cal函数之后启用它。
我对Raspberry Pi的实现不是很熟悉,所以这只是关于如何实现按钮禁用的粗略草图: 从外观上看,这些按钮是通过GPIO.add_event_detect函数“连接”的。
因此,我将从主脚本中删除sav回调,并在cal脚本之后动态添加它,如下所示:
# [...] beginning of your script [...]
def cal(channel):
# [...] original body of cal function [...]
activate_save_button()
def activate_save_button():
GPIO.add_event_detect(12,GPIO.RISING,callback=sav,bouncetime=1000)
def deactivate_save_button():
GPIO.remove_event_detect(12)
def sav(channel):
# [...] original body of sav function [...]
# remove save button functionality after saving
deactivate_save_button()
def update():
""" function for continuous show value in every 500ms in tkinter window"""
GPIO.add_event_detect(5,callback=cal,bouncetime=1000)
# line with callback=sav is deleted here
root.after(500,update)
root.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。