Kivy:使用Python函数时如何解决崩溃的应用程序

时间:2019-04-12 16:44:36

标签: android python python-2.7 numpy kivy

我正在尝试将Kivy的GUI功能与我编写的Python函数结合起来。但是,每当我将函数调用到Screen类之一上时,整个应用程序就会崩溃并消耗我的内存和CPU使用率。

基本上,我想做的是从涉及两个csv文件的比较global where函数中获取fn_compare变量。然后,我打算在其他三个函数中使用该变量。 fn_verifier函数将使用该global where变量来验证字母的26个字母中的任何一个与之匹配,然后它发出声音。

class Identifier:
    def fn_compare(self): 
        count=1
        while (count>0):
            livecsv=np.genfromtxt("lettera.csv", delimiter=",", skip_header=1, filling_values=np.nan, dtype=int, case_sensitive=True, deletechars='', replace_space=' ')
            refcsv=np.genfromtxt("refcsv1.csv", delimiter=",", skip_header=1, filling_values=np.nan, dtype=int, case_sensitive=True, deletechars='', replace_space=' ')
            A=np.array(livecsv)
            B=np.array(refcsv)
            D=B - A[-1]
            match= B[np.abs(D).sum(axis=1).argmin()]
            global where
            where=match[0]
            time.sleep(1)
            count = count + 1
    def fn_verify(self):
        global where
        var=where
        if var==1:
            A=playsound('audio-alphabet/A.wav',True)
            return A
        elif var==2:
            B=playsound('audio-alphabet/B.wav',True)
            return B
        elif var==3:
            C=playsound('audio-alphabet/C.wav',True)
            return C
        elif var==4:
            D=playsound('audio-alphabet/D.wav',True)
            return D
        elif var==5:
            E=playsound('audio-alphabet/E.wav',True)
            return E
        elif var==6:
            F=playsound('audio-alphabet/F.wav',True)
            return F
        elif var==7:
            G=playsound('audio-alphabet/G.wav',True)
            return G
        elif var==8:
            H=playsound('audio-alphabet/H.wav',True)
            return H
        elif var==9:
            I=playsound('audio-alphabet/I.wav',True)
            return I
        elif var==10:
            J=playsound('audio-alphabet/J.wav',True)
            return J
        elif var==11:
            K=playsound('audio-alphabet/K.wav',True)
            return K
        elif var==12:
            L=playsound('audio-alphabet/L.wav',True)
            return L
        elif var==13:
            M=playsound('audio-alphabet/M.wav',True)
            return M
        elif var==14:
            N=playsound('audio-alphabet/N.wav',True)
            return N
        elif var==15:
            O=playsound('audio-alphabet/O.wav',True)
            return O
        elif var==16:
            P=playsound('audio-alphabet/P.wav',True)
            return P
        elif var==17:
            Q=playsound('audio-alphabet/Q.wav',True)
            return Q
        elif var==18:
            R=playsound('audio-alphabet/R.wav',True)
            return R
        elif var==19:
            S=playsound('audio-alphabet/S.wav',True)
            return S
        elif var==20:
            T=playsound('audio-alphabet/T.wav',True)
            return T
        elif var==21:
            U=playsound('audio-alphabet/U.wav',True)
            return U
        elif var==22:
            V=playsound('audio-alphabet/V.wav',True)
            return V
        elif var==23:
            W=playsound('audio-alphabet/W.wav',True)
            return W
        elif var==24:
            X=playsound('audio-alphabet/X.wav',True)
            return X
        elif var==25:
            Y=playsound('audio-alphabet/Y.wav',True)
            return Y
        elif var==26:
            Z=playsound('audio-alphabet/Z.wav',True)
            return Z

现在这是应用程序崩溃的部分。

class LetterAScreen(Screen):
    def on_enter(self):
        self.loader(
    def loader(self):
        self.identity()
        self.verifier()
    def identity(self):
        global where
        iden=Identifier()
        lol.fn_compare()  
    def verifier(self):
        iden=Identifier()
        global where
        count = 1
        while (count>0 and where != 1):
            self.identity()
            count=count+1
        iden.fn_verify()

我计划有26个屏幕A-Z,它们都具有相同的功能。但是,我什至不能进步。这里的问题是当我进入上述屏幕时,应用程序崩溃并且内存和CPU超载。我在代码中尝试做的是让identity函数运行fn_compare函数。然后,verifier类将决定global where variable等于1还是letetr A。一旦变为True,我就尝试在循环结束时放置fn_verify函数,以便仅在global where变量与1匹配时播放声音。

可能是导致崩溃的原因,我该如何解决?我是Python和Kivy的新手,我真的想了解更多。我希望你能帮助我。

1 个答案:

答案 0 :(得分:0)

根本原因

  1. class LetterAScreen()中,您实例化了class Identifier()两次,即2次或两次实例化。方法identity()中的一个,方法verifier()中的另一个,
  2. 在方法verifier()中,它循环调用了方法self.identity()。每次循环时,您都在实例化class Identifier()的新实例。因此,您的内存不足。

解决方案

def loader(self):
    self.iden = Identifier()
    self.identity()
    self.verifier()

def identity(self):
    global where
    self.iden.fn_compare()

def verifier(self):
    global where
    count = 1
    while (count > 0 and where != 1):
        self.identity()
        count = count + 1
    self.iden.fn_verify()