How handle unexpected Key press

Viewed 57

I have designed an application which have two buttons i.e CAL and SAV. Accordingly that I have two functions but the issue is sometimes production line Operator by mistake presses SAV button. So that attribute error arises and program stuck.

How to overcome this issue? Please guide me.

Here is my code:

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()

This error generated due to root.L2.destroy() this line.

Can I block or disable this sav function, so that without call of cal function, it shouldn't execute?

1 Answers

A brute force solution would be to check whether root has an L2 attribute or not

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')

A more elegant approach would be to disable the save button on startup and only enable it after the cal function has been executed.

I am not very familiar with Raspberry Pi implementations, so this is only a rough sketch on how to achieve the button disabling: By the looks of it, the buttons are "wired in" via the GPIO.add_event_detect functions.

So i would remove the sav-callback from the main script and dynamically add it after the cal script, something like that:

# [...] 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()
Related