【问题标题】:Using accelerometer values in python with kivy crashes app在 python 中使用加速度计值与 kivy 崩溃应用程序
【发布时间】:2020-05-31 16:09:02
【问题描述】:

我在 kivy android 应用程序中使用加速度计值时遇到了一些问题。 我可以正确读取加速度计值,并且它们在我的应用程序中以有意义的方式显示;我可以将它们打印到文本标签上。

但是,一旦我尝试在数学运算中使用它们(比如减法,在代码中标有注释),应用程序就会崩溃并出现以下错误:

Unsupported operand type(s) for -: ‘NoneType’ and ‘NoneType’

代码如下:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock 
from plyer import accelerometer
from plyer import gravity
import numpy as np

class TestApp(App):

    def __init__(self):
        super(TestApp, self).__init__()
        self.sensorEnabled= False
        self.acc= np.array([0, 0, 0])
        self.grav= np.array([0, 0, 0])
        self.lineal= np.array([0, 0, 0])

    def leer_accel(self, dt):
        self.acc= np.asarray(accelerometer.acceleration)
        self.grav= np.asarray(gravity.gravity)
        test= self.acc[0]- self.grav[0] #THIS LINE CRASHES THE APP!!
        self.root.ids['a_x'].text= f"{str(self.acc)}"
        self.root.ids['a_y'].text= f"{str(type(self.acc))}"
        self.root.ids['a_z'].text= " "
        #self.root.ids['g_x'].text= " "
        #self.root.ids['g_y'].text= " "
        self.root.ids['g_z'].text=f"{self.acc- self.grav}"
    def empezar(self):
        try: 
            if not self.sensorEnabled:
                accelerometer.enable()
                gravity.enable()
                Clock.schedule_interval(self.leer_accel, 1/100)
                self.sensorEnabled= True
                self.root.ids['boton_1'].text= "Parar"
            else: 
                accelerometer.disable()
                Clock.unschedule(self.leer_accel)
                self.sensorEnabled= False
                self.root.ids.boton_1.text= "Empezar"
        except NotImplementedError:
            import traceback
            traceback.print_exc()
            self.root.ids.status.text= "Accelerometro no soportado"

App= TestApp()
App.run()

有一些东西(很明显)我确定我错过了,因为变量存在并且我可以访问它们以将它们打印出来,但是我还没有发现错误。

谢谢

【问题讨论】:

    标签: python android numpy kivy


    【解决方案1】:

    听起来您可能在某个时候得到 None 的值,也许是在第一次访问加速度计时。如果您一路打印每个值,您可能会在日志中看到。

    然后解决方法是在leer_accel 中检查这一点,如果数据不好就提前返回。

    【讨论】:

    • 你是对的,加速度计值似乎不能立即获得;一旦使用 accelerometer.enable() 启用加速度计,它将返回填充有 None 的元组最多 30 或 40 毫秒,我通过在函数 time.sleep(0.05) 中添加 time.sleep(0.05) 解决了这个问题@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2020-11-29
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多