как вернуться, чтобы попробовать скрипт, когда исключение заканчивается - PullRequest
0 голосов
/ 18 февраля 2019

в последнее время я пытаюсь написать скрипт GUI, который будет отлавливать данные из цифрового компаса QMC5883l и показывать данные в небольшом графическом интерфейсе в реальном времени, скрипт работает нормально без ошибок, за исключением случаев, когда компас отключен, ошибка OSError и программаостанавливается, я использовал try-catch, чтобы решить эту проблему, так что теперь, когда исключение повышается, оно показывает, что компас отключен, однако, когда компас снова подключен, он не будет работать снова, как если бы он находился в коде исключения исключения oserror, мне нужно знать, есть лилюбой способ вернуться, чтобы попробовать скрипт, когда ошибка заканчивается

мой код ниже

# This Python file uses the following encoding: utf-8
import smbus            #import SMBus module of I2C
from time import sleep  #import sleep
import math
import sys
import os
from tkinter import *
#some MPU6050 Registers and their Address                         
Register_mode  = 0x09           #Address of mode register
Register_set_reset = 0x0b       #Addreas of set/reset period
X_axis_H    = 0x01              #Address of X-axis MSB data register
Z_axis_H    = 0x03              #Address of Z-axis MSB data register
Y_axis_H    = 0x05              #Address of Y-axis MSB data register
declination = 1.466          #define declination angle of location where measurement going to be done
pi          = 3.14159265359     #define pi value

def Magnetometer_Init():
        #Write to mode R`egister for selecting mode
        bus.write_byte_data(Device_Address, Register_mode, 0x1d)
        bus.write_byte_data(Device_Address, Register_set_reset , 0x01)
def read_raw_data(addr):
          #Read raw 16-bit value
        high = bus.read_byte_data(Device_Address, addr)
        low = bus.read_byte_data(Device_Address, addr-1)
        #concatenate higher and lower value
        value = ((high << 8) | low)

        #to get signed value from module
        if(value > 32768):
            value = value - 65536
        return value


bus = smbus.SMBus(1)    # or bus = smbus.SMBus(0) for older version boards
Device_Address = 0x0d   #QMC5883L magnetometer device address

Magnetometer_Init()     # initialize qMC5883L magnetometer 
print (" Reading Heading Angle")
window = Tk()
window.title("Welcome to LikeGeeks app")
window.geometry('350x200')
lbl = Label(window, text='heading angle')
lbl.grid(column=0, row=0)

def mainloop1():
        try:
        #Read Accelerometer raw value
                x = read_raw_data(X_axis_H)
                z = read_raw_data(Z_axis_H)
                y = read_raw_data(Y_axis_H)
        #Due to declination check for >360 degree
                heading = math.atan2(y, x) + declination        
                if(heading > 2*pi):
                        heading = heading - 2*pi

                #check for sign
                if(heading < 0):
                        heading = heading + 2*pi

                #convert into angle
                heading_angle = int(heading * 180/pi)
                lbl.configure(text=heading_angle)
                window.after(1,mainloop1)
          except OSError:
                  lbl.configure(text='compass disconnected')
window.after(0, mainloop1)      
window.mainloop()

1 Ответ

0 голосов
/ 19 февраля 2019

Поскольку window.after(1, mainloop1) вызывается внутри блока try, при возникновении исключения оно не будет выполнено и mainloop1() не будет выполнено снова.

Чтобы преодолеть его, просто переместите window.after(1, mainloop1) из блока try до конца mainloop1(), как показано ниже:

def mainloop1():
    try:
        ...
        lbl.configure(text=heading_angle)
    except OSError as err:
        lbl.configure(text='compass disconnected')
    window.after(1, mainloop1)

Тогда window.after(1, mainloop1) будет выполняться, даже если возникла исключительная ситуация.

...