为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理意外按键

如何处理意外按键

jeck猫 2024-01-15 21:43:09
我设计了一个有两个按钮的应用程序,即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 GPIOimport tkinter as tkGPIO.setmode(GPIO.BCM)GPIO.setup(12,GPIO.IN)  #Save ButtonGPIO.setup(5,GPIO.IN)  #Cal  Buttonroot=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函数的情况下它不会执行吗?
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

强力解决方案是检查 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 here


root.after(500, update)

root.mainloop()


查看完整回答
反对 回复 2024-01-15
  • 1 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信