Android 应用程序立即关闭通过 buildozer p4a 编译

如何解决Android 应用程序立即关闭通过 buildozer p4a 编译

我正在为 2 轮机器人编写一个应用程序,通过 UDP 进行通信。在 PC 上一切正常,但在通过 buildozer 为 android 编译后不起作用。

这是来自 logcat

    - waiting for device -
--------- beginning of crash
--------- beginning of system
--------- beginning of main
12-22 01:36:59.225 30049 30093 I python  : Initializing Python for Android
12-22 01:36:59.225 30049 30093 I python  : Setting additional env vars from p4a_env_vars.txt
12-22 01:36:59.225 30049 30093 I python  : Changing directory to the one provided by ANDROID_ARGUMENT
12-22 01:36:59.225 30049 30093 I python  : /data/user/0/org.msstukangithub.robot/files/app
12-22 01:36:59.225 30049 30093 I python  : Preparing to initialize python
12-22 01:36:59.225 30049 30093 I python  : _python_bundle dir exists
12-22 01:36:59.225 30049 30093 I python  : calculated paths to be...
12-22 01:36:59.225 30049 30093 I python  : /data/user/0/org.msstukangithub.robot/files/app/_python_bundle/stdlib.zip:/data/user/0/org.msstukangithub.robot/files/app/_python_bundle/modules
12-22 01:36:59.225 30049 30093 I python  : set wchar paths...
12-22 01:36:59.265 30049 30093 I python  : Initialized python
12-22 01:36:59.266 30049 30093 I python  : AND: Init threads
12-22 01:36:59.266 30049 30093 I python  : testing python print redirection
12-22 01:36:59.267 30049 30093 I python  : Android path ['.','/data/user/0/org.msstukangithub.robot/files/app/_python_bundle/stdlib.zip','/data/user/0/org.msstukangithub.robot/files/app/_python_bundle/modules','/data/user/0/org.msstukangithub.robot/files/app/_python_bundle/site-packages']
12-22 01:36:59.267 30049 30093 I python  : os.environ is environ({'PATH': '/sbin:/system/sbin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin','DOWNLOAD_CACHE': '/data/cache','ANDROID_BOOTLOGO': '1','ANDROID_ROOT': '/system','ANDROID_ASSETS': '/system/app','ANDROID_DATA': '/data','ANDROID_STORAGE': '','EXTERNAL_STORAGE': '/sdcard','ASEC_MOUNTPOINT': '/mnt/asec','BOOTCLASSPATH': '/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.hidl.base-V1.0-java.jar:/system/framework/android.hidl.manager-V1.0-java.jar:/system/framework/framework-oahl-backward-compatibility.jar:/system/framework/android.test.base.jar:/system/framework/featurelayer-widget.jar:/system/framework/hwEmui.jar:/system/framework/hwTelephony-common.jar:/system/framework/hwIms-common.jar:/system/framework/hwframework.jar:/system/framework/com.huawei.nfc.jar:/system/framework/org.ifaa.android.manager.jar:/system/framework/hwperf.jar:/system/framework/hwaps.jar:/system/framework/hwcustEmui.jar:/system/framework/hwcustframework.jar:/system/framework/hwcustTelephony-common.jar:/system/framework/servicehost.jar:/system/framework/hwIAwareAL.jar','SYSTEMSERVERCLASSPATH': '/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jar:/system/framework/com.android.location.provider.jar:/system/framework/hwServices.jar:/system/framework/hwWifi-service.jar:/system/framework/hwcustServices.jar:/system/framework/hwcustwifi-service.jar','OEM_ROOT': '/product/hw_oem/CLT-L29','ODM_PRODUCT': '/odm/hw_odm/CLT-L29','CUST_POLICY_DIRS': '/system/emui/base:/system/emui/oversea:/vendor/etc:/odm/etc:/product/etc:/odm/hw_odm/CLT-L29:/product/region_comm/oversea:/preas/oversea:/product/hw_oem/CLT-L29:/preload/CLT-L29/hw/eu:/cust/global:/cust/hw/eu:/product/special_cust/CLT-L29/hw/eu','ANDROID_SOCKET_zygote_secondary': '18','ANDROID_ENTRYPOINT': 'main.pyc','ANDROID_ARGUMENT': '/data/user/0/org.msstukangithub.robot/files/app','ANDROID_APP_PATH': '/data/user/0/org.msstukangithub.robot/files/app','ANDROID_PRIVATE': '/data/user/0/org.msstukangithub.robot/files','ANDROID_UNPACK': '/data/user/0/org.msstukangithub.robot/files/app','PYTHONHOME': '/data/user/0/org.msstukangithub.robot/files/app','PYTHONPATH': '/data/user/0/org.msstukangithub.robot/files/app:/data/user/0/org.msstukangithub.robot/files/app/lib','PYTHONOPTIMIZE': '2','P4A_BOOTSTRAP': 'SDL2','PYTHON_NAME': 'python','P4A_IS_WINDOWED': 'True','P4A_ORIENTATION': 'landscape','P4A_NUMERIC_VERSION': 'None','P4A_MINSDK': '21','LC_CTYPE': 'C.UTF-8'})
12-22 01:36:59.267 30049 30093 I python  : Android kivy bootstrap done. __name__ is __main__
12-22 01:36:59.267 30049 30093 I python  : AND: Ran string
12-22 01:36:59.267 30049 30093 I python  : Run user program,change dir and execute entrypoint
12-22 01:36:59.377 30049 30093 I python  : [INFO   ] [Logger      ] Record log in /data/user/0/org.msstukangithub.robot/files/app/.kivy/logs/kivy_20-12-22_3.txt
12-22 01:36:59.377 30049 30093 I python  : [INFO   ] [Kivy        ] v1.11.1
12-22 01:36:59.378 30049 30093 I python  : [INFO   ] [Kivy        ] Installed at "/data/user/0/org.msstukangithub.robot/files/app/_python_bundle/site-packages/kivy/__init__.pyc"
12-22 01:36:59.378 30049 30093 I python  : [INFO   ] [Python      ] v3.8.1 (default,Dec 21 2020,23:40:42) 
12-22 01:36:59.378 30049 30093 I python  : [Clang 8.0.2 (https://android.googlesource.com/toolchain/clang 40173bab62ec7462
12-22 01:36:59.378 30049 30093 I python  : [INFO   ] [Python      ] Interpreter at ""
12-22 01:36:59.830 30049 30093 I python  : [INFO   ] [Factory     ] 184 symbols loaded
12-22 01:36:59.863 30049 30093 I python  : [INFO   ] [Image       ] Providers: img_tex,img_dds,img_sdl2,img_gif (img_pil,img_ffpyplayer ignored)
12-22 01:37:00.106 30049 30093 I python  : [INFO   ] [Window      ] Provider: sdl2
12-22 01:37:00.124 30049 30093 I python  : [INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
12-22 01:37:00.125 30049 30093 I python  : [INFO   ] [GL          ] Backend used <sdl2>
12-22 01:37:00.126 30049 30093 I python  : [INFO   ] [GL          ] OpenGL version <b'OpenGL ES 3.2 v1.r14p0-00cet0.0416641283c5d6e2d53c163d0ca99357'>
12-22 01:37:00.126 30049 30093 I python  : [INFO   ] [GL          ] OpenGL vendor <b'ARM'>
12-22 01:37:00.126 30049 30093 I python  : [INFO   ] [GL          ] OpenGL renderer <b'Mali-G72'>
12-22 01:37:00.126 30049 30093 I python  : [INFO   ] [GL          ] OpenGL parsed version: 3,2
12-22 01:37:00.126 30049 30093 I python  : [INFO   ] [GL          ] Texture max size <8192>
12-22 01:37:00.126 30049 30093 I python  : [INFO   ] [GL          ] Texture max units <16>
12-22 01:37:00.142 30049 30093 I python  : [INFO   ] [Window      ] auto add sdl2 input provider
12-22 01:37:00.143 30049 30093 I python  : [INFO   ] [Window      ] virtual keyboard not allowed,single mode,not docked
12-22 01:37:00.144 30049 30093 I python  : [WARNING] [Base        ] Unknown <android> provider
12-22 01:37:00.144 30049 30093 I python  : [INFO   ] [Base        ] Start application main loop
12-22 01:37:00.145 30049 30093 I python  : [INFO   ] [Base        ] Leaving application in progress...
12-22 01:37:00.145 30049 30093 I python  :  Traceback (most recent call last):
12-22 01:37:00.145 30049 30093 I python  :    File "kivy/properties.pyx",line 860,in kivy.properties.ObservableDict.__getattr__
12-22 01:37:00.145 30049 30093 I python  :  KeyError: 'GridUnderJoy'
12-22 01:37:00.145 30049 30093 I python  :  
12-22 01:37:00.146 30049 30093 I python  :  During handling of the above exception,another exception occurred:
12-22 01:37:00.146 30049 30093 I python  :  
12-22 01:37:00.146 30049 30093 I python  :  Traceback (most recent call last):
12-22 01:37:00.146 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/app/main.py",line 336,in <module>
12-22 01:37:00.146 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/RoboT/kivy/app.py",line 855,in run
12-22 01:37:00.146 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/RoboT/kivy/base.py",line 504,in runTouchApp
12-22 01:37:00.147 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/RoboT/kivy/core/window/window_sdl2.py",line 747,in mainloop
12-22 01:37:00.147 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/RoboT/kivy/core/window/window_sdl2.py",line 479,in _mainloop
12-22 01:37:00.147 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/RoboT/kivy/base.py",line 339,in idle
12-22 01:37:00.147 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/RoboT/kivy/clock.py",line 591,in tick
12-22 01:37:00.148 30049 30093 I python  :    File "kivy/_clock.pyx",line 384,in kivy._clock.CyClockBase._process_events
12-22 01:37:00.148 30049 30093 I python  :    File "kivy/_clock.pyx",line 414,line 412,line 167,in kivy._clock.ClockEvent.tick
12-22 01:37:00.148 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/app/main.py",line 70,in update
12-22 01:37:00.149 30049 30093 I python  :    File "/home/ms/RoX/.buildozer/android/app/main.py",line 97,in WHJoy
12-22 01:37:00.149 30049 30093 I python  :    File "kivy/properties.pyx",line 863,in kivy.properties.ObservableDict.__getattr__
12-22 01:37:00.149 30049 30093 I python  :  AttributeError: 'super' object has no attribute '__getattr__'
12-22 01:37:00.149 30049 30093 I python  : Python for android ended.

也许有人知道为什么在 PC 上运行它不会从 las 6 行中产生这个错误?正是这个 AttributeError: 'super' object has no attribute 'getattr' ? 如何更改 main 中的代码以使其在 android 上运行?或者其他问题的解决方案?

主界面代码

    import time # do sleepa w komunikacji udp
from kivy.uix.widget import Widget
from kivy.uix.behaviors import DragBehavior
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
from threading import Thread
from kivy.properties import NumericProperty,BooleanProperty,ReferenceListProperty,ObjectProperty
#################  For Udp transmission ################
import socket

global Data1,DataToSend,UDP_IP,UDP_PORT
UDP_IP = "192.168.43.168" # IP ESP
UDP_PORT = 4210
MESSAGE = b"Hello,mot*** fu****"
Data1 = [88,44,11,3,8,40,155]   # tymczasowo do testów
DataToSend = bytes(Data1)                # convert na byte aby dało się wysłać
#print("UDP target IP: %s" % UDP_IP)
#("UDP target port: %s" % UDP_PORT)
#print("message: %s" % MESSAGE)
                        # Internet     # UDP
#sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#sock.sendto(MESSAGE,(UDP_IP,UDP_PORT))
###########################################################


global StopRunUDP,OnceRunUDP
StopRunUDP,OnceRunUDP = True,False
global WidX,HeiY,valXXY
global AccelX,AccelY,AccelZ,GyroX,GyroY,GyroZ,Battery,Temp
AccelX,GyroZ = 0,0
Battery,Temp = 0,0
valXXY = NumericProperty
valXXY = 1

class Circle(DragBehavior,Widget):

    def on_touch_move(self,touch):
        if self.collide_point(*touch.pos):
            tx,ty = touch.pos
            sx,sy = self.pos
        return super(Circle,self).on_touch_move(touch)

    def on_touch_up(self,touch):
        if self.collide_point(*touch.pos):
            #print("\tCircle.on_touch_up:")  # do usnięcia komentaz pogladowy do spr działania
            self.pos = WidX / 2 - self.width / 2,HeiY / 2 - self.height / 2
        return super(Circle,self).on_touch_up(touch)


class GUI(FloatLayout):

    ######   Global   Variables      ######


    global StopRunUDP,OnceRunUDP
    runOnce =BooleanProperty(False) # zmienna do jednorazowego pobrania wid/hei pod joystickiem

###################   Automatyczny updete pozycji #################3
    def __init__(self,**kwargs):
        super(GUI,self).__init__(**kwargs)
        Clock.schedule_interval(self.update,1/30.0)
        Clock.schedule_interval(self.change_color,1 / 1)  # !!!!!!!! TO DO ZMIANY
       # Clock.schedule_interval(self.change_color,1 / 30.0) # !!!!!!!! TO DO ZMIANY
    # clock.schedule uruchamia w każdej wolnej chwili funkcje
    # dzieki temu automatycznie sa aktualizowane wartości label/ variables itd

    def update(self,*args): # args to pusty argument żeby się nie czepiał kompilator w sesie że nic nie robi,ale bez niego nie działa
        if not self.runOnce :
            self.WHJoy()
            self.runOnce=True

        pozX = self.ids.cir.pos[0]+25
        pozY = self.ids.cir.pos[1]+25
        pX,pY = self.calc_Joy(pozX,pozY)

    #
        self.ids.padX.text = ' pad X: %.2f' % pX
        self.ids.padY.text = ' pad Y: %.2f' % pY


    #   #### Updateing Data of Joystick ####
        self.Send_Pos_Joy(pX,pY)

    #   ####   Takeing half wid of showed reactangles ####
        WidRectangle = self.ids.GyXx.width-10
        HalfWidRe= WidRectangle/2
        self.Update_AccelGyro(HalfWidRe)




# ################## Pobranie szerokosci placu pod Joy.. ###############
    def WHJoy(self):  # uruchamiane jdnorazowo aby pobrac szerokość placu pod
                        # joystickiem by móc go wycentrować
        global WidX,HeiY
        WidX = self.ids.GridUnderJoy.size[0]
        HeiY = self.ids.GridUnderJoy.size[1]

#   ####       Updating posytion of joystick to send to ESP ####
    def Send_Pos_Joy(self,pozX,pozY):
        global Data1,DataToSend
        pXx = self.Map_Func(pozX,-50,50,100)
        pYy = self.Map_Func(pozY,100)
        Data1[0] = int(pXx)
        Data1[1] = int(pYy)
        DataToSend = bytes(Data1)
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#  ####        Updateing value in kivy screen                      ####
    def Update_AccelGyro(self,HalfWID):

                # GyroX
        Gyrox = self.Map_Func(GyroX,-32768,32768,-HalfWID,HalfWID)
        self.ids.valGyroX.text = '%d' % GyroX  # modyfikator tekst
        self.ids.GyroX.sGx = Gyrox
                # GyroY
        Gyroy = self.Map_Func(GyroY,HalfWID)
        self.ids.valGyroY.text = '%d' % GyroY  # modyfikator tekst
        self.ids.GyroY.sGy = Gyroy
                # GyroZ
        Gyroz = self.Map_Func(GyroZ,HalfWID)
        self.ids.valGyroZ.text = '%d' % GyroZ  # modyfikator tekst
        self.ids.GyroZ.sGz = Gyroz
                # AccelX
        Accelx = self.Map_Func(AccelX,HalfWID)
        self.ids.valAccelX.text = '%d' % AccelX  # modyfikator tekst
        self.ids.AccelX.sAx = Accelx
                # AccelY
        Accely = self.Map_Func(AccelY,HalfWID)
        self.ids.valAccelY.text = '%d' % AccelY  # modyfikator tekst
        self.ids.AccelY.sAy = Accely
                # AccelZ
        Accelz = self.Map_Func(AccelZ,HalfWID)
        self.ids.valAccelZ.text = '%d' % AccelZ  # modyfikator tekst
        self.ids.AccelZ.sAz = Accelz
                #Battery
        Baatt = self.Map_Func(Battery,255,HalfWID*2)
        BtPerCent = self.Map_Func(Battery,100)
        self.ids.valBattery.text = ' %d ' % BtPerCent + '%' # modyfikator tekst
        self.ids.BATT.sBt = Baatt
        #print(HalfWID*2)
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    def change_color(self,*args):
        ww = Battery
        BatteryColor = (0,16 / 255,1)
        if 191 < ww <= 255:  # 255-64
            BatteryColor = (94 / 255,1,1)
        elif 128 < ww <= 191:
            BatteryColor = (221 / 255,1)
        elif 64 < ww <= 128:
            BatteryColor = (1,140 / 255,1)
        elif 0 <= ww <= 64:
            BatteryColor = (1,64 / 255,1)
        self.ids.BATT.colOf = BatteryColor





# #### Calc position of joystick               #####
    def calc_Joy(self,pozY):

        if pozX >150: pozX = 150
        elif pozX<50: pozX = 50
        else: pozX = pozX
        UpDo = -(100-pozX)

        if pozY >150: pozY = 150
        elif pozY<50: pozY = 50
        else: pozY = pozY
        LeRi = -(100-pozY)

        return(UpDo,LeRi)
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    ###--------------------------- Dotąd jest G--------------------------###

            ################### map Function #################
    def Map_Func(self,x,minX,maxX,outMin,outMax):
        Out = (x - minX) * (outMax - outMin) / (maxX - minX) + outMin
        #  Out=    Y     *       Z            /      C       + outMin
        # Y/Z/C   ogarnąć zabezpiecznie  ( pamiętaj cholero nie dziel przez zero),czy python to ogrania i uj z tym?
        return(Out)



    def do_something(self):
        global StopRunUDP,OnceRunUDP
        #print(StopRunUDP)
        if not OnceRunUDP:
            StopRunUDP = True
            OnceRunUDP = True

       # print('after IF')
        #print(StopRunUDP)
        # create the thread to invoke other_func with arguments (2,5)
        t1 = Thread(target=self.Communication_UDP_ESP)
        # set daemon to true so the thread dies when app is closed
        t1.daemon = True            # Jesli True -> background worker,if false
        # start the thread
        t1.start()


    def Stop_UDP(self):    # Z niewiadomych przyczyn nie uruchamia sie ...
        global StopRunUDP,OnceRunUDP           # próba przynajmniej zkończenia watku other_func
        #print(StopRunUDP)
        StopRunUDP = False
        OnceRunUDP = False
        #print('after StopUDP')
        #print(StopRunUDP)


    def Communication_UDP_ESP(self):
        global StopRunUDP,OnceRunUDP
        global Data1,UDP_PORT
        global AccelX,Temp
                                     # Internet     # UDP
        sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  # Tworzenie / podlączenie socketa
        sock.sendto(MESSAGE,UDP_PORT))
        sock.settimeout(0.3) # najwyrażnej rozwiązło problem,(socket.setblocking)
                    # jesli false to nie mrozi progrmu w oczekiwaniu na dane jesli true,mrozi
        #lost = 1

        def Save_Data_From_ESP(Data):
            global AccelX,Temp
                        # Battery
            Battery = Data[0]
                        # Temp
            Temp = Data[1] << 8 | Data[2]
                        # Accel X
            AccelXx = Data[3] << 8 | Data[4]
            AccelX = self.Map_Func(AccelXx,65535,32768)

                        # Accel Y
            AccelYy = Data[5] << 8 | Data[6]
            AccelY = self.Map_Func(AccelYy,32768)

                        # Accel Z
            AccelZz = Data[7] << 8 | Data[8]
            AccelZ = self.Map_Func(AccelZz,32768)

                        # Gyro X
            GyroXx = Data[9] << 8 | Data[10]
            GyroX = self.Map_Func(GyroXx,65500,-32750,32750)

                        # Gyro Y
            GyroYy = Data[11] << 8 | Data[12]
            GyroY = self.Map_Func(GyroYy,32750)

                        # Gyro Z
            GyroZz = Data[13] << 8 | Data[14]
            GyroZ = self.Map_Func(GyroZz,32750)




        while StopRunUDP:
            # lost = lost+1     # for tests
            # print(lost)
            # if lost >90000 :
            #     lost = 0

            mili_Start = time.time()
            try:
                Data,addr = sock.recvfrom(16)  # buffer size is 15 bytes
            except:
                print("                                     error")

            if len(Data) > 0:  # jesli bufor wiekszy od zera ( linijak wyżej,albo bedzie,albo bedzie zero ....)
                Save_Data_From_ESP(Data)
               # print(Data)
                # print("received message: %s" % Data)  # wypisz dane
                Data = []  # zerowanie buforu,ale chyba niekonieczne
                sock.sendto(DataToSend,UDP_PORT))  # wysłanie wiadomości zwrotnej

            mili_Stop = time.time()
            TimeOut = mili_Stop - mili_Start
            #print(TimeOut)
            if TimeOut > 0.2 :
                print("Coś poszło nie tak,sprawdź połączenie")
                sock.sendto(DataToSend,UDP_PORT))  # wysłanie wiadomości zwrotnej

            #print()


        # def Print_Data_ESP_For_Check():
        #               # Battery
        #     Battery = Data[0]
        #     print("Battery: %x       " % Battery,end='')
        #     print("Battery in decimal: %d" % Battery)
        #               # Temp
        #     Temp = Data[1] << 8 | Data[2]
        #     print("Temp: %x       " % Temp,end='')
        #     print("Temp in decimal: %d" % Temp)
        #               # Accel X
        #     AccelXx = Data[3] << 8 | Data[4]
        #     AccelX = self.Map_Func(AccelXx,32768)
        #     print("AccelX: %x       " % AccelX,end='')
        #     print("AccelX in decimal: %d" % AccelX)
        #               # Accel Y
        #     AccelYy = Data[5] << 8 | Data[6]
        #     AccelY = self.Map_Func(AccelYy,32768)
        #     print("AccelY: %x       " % AccelY,end='')
        #     print("AccelY in decimal: %d" % AccelY)
        #               # Accel Z
        #     AccelZz = Data[7] << 8 | Data[8]
        #     AccelZ = self.Map_Func(AccelZz,32768)
        #     print("AccelZ: %x       " % AccelZ,end='')
        #     print("AccelZ in decimal: %d" % AccelZ)
        #               # Gyro X
        #     GyroXx = Data[9] << 8 | Data[10]
        #     GyroX = self.Map_Func(GyroXx,32750)
        #     print("GyroX: %x       " % GyroX,end='')
        #     print("GyroX in decimal: %d" % GyroX)
        #               # Gyro Y
        #     GyroYy = Data[11] << 8 | Data[12]
        #     GyroY = self.Map_Func(GyroYy,32750)
        #     print("GyroY: %x       " % GyroY,end='')
        #     print("GyroY in decimal: %d" % GyroY)
        #               # Gyro Z
        #     GyroZz = Data[13] << 8 | Data[14]
        #     GyroZ = self.Map_Func(GyroZz,32750)
        #     print("GyroZ: %x       " % GyroZ,end='')
        #     print("GyroZ in decimal: %d" % GyroZ)



class GUIApp(App):

    def build(self):

        return GUI()


if __name__ == '__main__':
    GUIApp().run()

还有一个规范文件。

    [app]

# (str) Title of your application
title = RobT

# (str) Package name
package.name = RoboT

# (str) Package domain (needed for android/ios packaging)
package.domain = org.MSStukanGithub

# (str) Source code where the main.py live
source.dir = .

# (list) Source files to include (let empty to include all the files)
source.include_exts = py,png,jpg,kv,atlas

# (list) List of inclusions using pattern matching
#source.include_patterns = assets/*,images/*.png

# (list) Source files to exclude (let empty to not exclude anything)
source.exclude_exts = .

# (list) List of directory to exclude (let empty to not exclude anything)
#source.exclude_dirs = tests,bin,venv

# (list) List of exclusions using pattern matching
#source.exclude_patterns = license,images/*/*.jpg

# (str) Application versioning (method 1)
version = 0.1

# (str) Application versioning (method 2)
# version.regex = __version__ = ['"](.*)['"]
# version.filename = %(source.dir)s/main.py

# (list) Application requirements
# comma separated e.g. requirements = sqlite3,kivy
requirements = python3,kivy

# (str) Custom source folders for requirements
# Sets custom source for any requirements with recipes
# requirements.source.kivy = ../../kivy

# (str) Presplash of the application
#presplash.filename = %(source.dir)s/data/presplash.png

# (str) Icon of the application
#icon.filename = %(source.dir)s/data/icon.png

# (str) Supported orientation (one of landscape,sensorLandscape,portrait or all)
orientation = landscape
# (list) List of service to declare
#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY

#
# OSX Specific
#

#
# author = © Copyright Info

# change the major version of python used by the app
osx.python_version = 3.7.7

# Kivy version to use
osx.kivy_version = 1.11.1

#
# Android specific
#

# (bool) Indicate if the application should be fullscreen or not
fullscreen = 0

# (string) Presplash background color (for android toolchain)
# Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
# red,blue,green,black,white,gray,cyan,magenta,yellow,lightgray,# darkgray,grey,lightgrey,darkgrey,aqua,fuchsia,lime,maroon,navy,# olive,purple,silver,teal.
#android.presplash_color = #FFFFFF

# (string) Presplash animation using Lottie format.
# see https://lottiefiles.com/ for examples and https://airbnb.design/lottie/
# for general documentation.
# Lottie files can be created using various tools,like Adobe After Effect or Synfig.
#android.presplash_lottie = "path/to/lottie/file.json"

# (list) Permissions
#android.permissions = INTERNET

# (list) features (adds uses-feature -tags to manifest)
#android.features = android.hardware.usb.host

# (int) Target Android API,should be as high as possible.
android.api = 27

# (int) Minimum API your APK will support.
android.minapi = 21

# (int) Android SDK version to use
#android.sdk = 20

# (str) Android NDK version to use
#android.ndk = 19b

# (int) Android NDK API to use. This is the minimum API your app will support,it should usually match android.minapi.
#android.ndk_api = 21

# (bool) Use --private data storage (True) or --dir public storage (False)
#android.private_storage = True

# (str) Android NDK directory (if empty,it will be automatically downloaded.)
#android.ndk_path =

# (str) Android SDK directory (if empty,it will be automatically downloaded.)
#android.sdk_path =

# (str) ANT directory (if empty,it will be automatically downloaded.)
#android.ant_path =

# (bool) If True,then skip trying to update the Android sdk
# This can be useful to avoid excess Internet downloads or save time
# when an update is due and you just want to test/build your package
# android.skip_update = False

解决方法

我怀疑问题出在时间上。 Android 设备可能比您的 PC 慢一点,导致 ids 实例中的 GUI 在您调用 WHJoy() 时未准备好。我建议从 Clock.schedule_interval() 方法中删除 __init__() 调用并稍微延迟这些间隔调用的开始。也许从 on_start()App 方法开始:

class GUIApp(App):

    def build(self):

        return GUI()

    def on_start(self):
        Clock.schedule_interval(self.root.update,1/30.0)
        Clock.schedule_interval(self.root.change_color,1 / 1)

作为测试,只是为了看看时间是否是罪魁祸首,请尝试运行:

class GUIApp(App):

    def build(self):
        Clock.schedule_once(self.start_intervals,3)
        return GUI()

    def start_intervals(self,dt):
        Clock.schedule_interval(self.root.update,1 / 1)

此代码在开始您的间隔(3 秒)之前会造成极大的延迟。当然,这对于您的最终代码来说是不可接受的,但是如果这消除了错误,那么时间就是问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-