如何处理意外按键

How handle unexpected Key press

我设计了一个有两个按钮的应用程序,即 CALSAV。 因此,我有两个功能,但问题有时是生产线操作员错误地按下了 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,offset,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",fg="brown",font="bold")
          root.L2.pack()
          root.L2.place(x=1,y=1)

       


   def sav(channel):
       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,offset,Full_Scale,\n")

       file.write(str(rangeh)+","+str(offset)+","+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,GPIO.RISING,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,offset,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')

更优雅的方法是在启动时禁用保存按钮,仅在执行校准函数后才启用它。

我对Raspberry Pi实现不是很熟悉,所以这只是关于如何实现按钮禁用的粗略草图: 从外观上看,按钮是通过 GPIO.add_event_detect 函数“连接”的。

所以我会从主脚本中删除 sav-callback 并在 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, GPIO.RISING, callback=cal, bouncetime=1000)
# line with callback=sav is deleted here

root.after(500, update)
root.mainloop()