如何处理意外按键

2024-03-28 18:13:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我设计了一个应用程序,它有两个按钮,即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函数的情况下,它不应该执行


Tags: txtloghomefordatagpiopiroot
1条回答
网友
1楼 · 发布于 2024-03-28 18:13:22

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

更优雅的方法是在启动时禁用save按钮,并且仅在执行cal功能后启用它

我不太熟悉Raspberry Pi实现,因此这只是如何实现按钮禁用的一个粗略示意图: 从外观上看,这些按钮是通过GPIO.add\u event\u 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, GPIO.RISING, callback=cal, bouncetime=1000)
# line with callback=sav is deleted here

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

相关问题 更多 >