Kivy: Как решить сбой приложения при использовании функций Python - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь объединить возможности графического интерфейса Kivy с написанной мной функцией Python. Но всякий раз, когда я вызываю функцию для одного из моих Screen классов, все приложение вылетает и потребляет мою память и использование процессора.

По сути, я пытаюсь получить переменную global where из функции сравнения fn_compare, которая включает в себя два файла csv. Затем я собираюсь использовать эту переменную в трех других функциях. Функция 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, все с одинаковыми функциями. Тем не менее, я даже не могу прогрессировать с одним. Проблема здесь в том, что когда я вхожу в указанный экран, приложение вылетает, а память и процессор перегружаются. В коде я попытался выполнить функцию identity для запуска функции fn_compare. Затем класс verifier решит, равен ли global where variable 1 или letetr A. Как только она становится True, я попытался поставить функцию fn_verify, когда цикл заканчивается, чтобы она воспроизводила звук только тогда, когда переменная global where соответствует 1.

Что может быть причиной сбоя и как мне это решить? Я новичок в Python и Kivy, и я действительно хочу узнать больше. Я надеюсь, вы могли бы помочь мне.

1 Ответ

0 голосов
/ 12 апреля 2019

первопричины

  1. В class LetterAScreen() вы создали class Identifier() дважды, то есть 2 или дважды. Один раз в методе identity(), а другой в методе verifier()
  2. В методе verify () он вызывал метод 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...