如何处理意外按键

我设计了一个有两个按钮的应用程序,即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,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()




此错误是由于root.L2.destroy()这一行而产生的。


我可以阻止或禁用此sav函数,以便在不调用cal函数的情况下它不会执行吗?


jeck猫
浏览 76回答 1
1回答

紫衣仙女

强力解决方案是检查 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')更优雅的方法是在启动时禁用保存按钮,仅在执行 cal 函数后才启用它。我对 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 hereroot.after(500, update)root.mainloop()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python