Как запустить функцию из другого класса и использовать ее переменную? - PullRequest
0 голосов
/ 10 апреля 2019

Я новичок в Python, работающий над простым приложением для нашего проекта в последний год. Это единственная часть, которую я не могу решить, и я был бы очень признателен за вашу помощь. Мне нужно взять значение из обновленного CSV-файла, получить первый элемент и сопоставить его со ссылкой CSV. Эта часть уже работает. Затем мне нужно, чтобы он воспроизводил соответствующий звук в соответствии со звуком. Эта часть также уже работает.

Однако, поскольку он будет расположен в приложении Kivy, мне нужно создать несколько классов. Некоторые будут обрабатывать данные, а часть Kivy - часть отображения. Но мой вопрос сегодня касается части Python, а не Kivy.

Первый класс обрабатывает csv, playsound и numpy match.

Во втором классе я попытался вызвать функции первого класса для их запуска. Я также попытался получить переменную where, присутствующую в первом классе, чтобы я мог использовать ее в операторе if для проверки соответствия и вывода текстового дисплея.

import serial
import sys
import numpy as np
import time
import csv
import os
import string 
import collections
from playsound import playsound
from pathlib import Path
import os, sys



#import keyboard
class Identifier:
    def csvwriter(self): #function for writing csv file
        try:
            ser = serial.Serial('COM10', baudrate=9600)
            ser.flushInput()

            while True:
                ser_bytes = ser.readline()
                print(ser_bytes)
                file = open("letterz5.csv", "a")
                file.write(str(ser_bytes))
                file.close()

         #       if keyboard.is_pressed('esc'):
         #           break;

            ser.close
        except:
            print("Unexpected error:", sys.exc_info()[0])
            print("Unexpected error:", sys.exc_info()[1])
    def fn_voice(self): #function for parsing and comparing csv file.
        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()]
            where=match[0]
            voice=fn_voice(where)
            time.sleep(1)
            count = count + 1
        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
        os.system("rm lettera.csv")



class LetterAScreen(Identifier):
    def identity(self): #I tried to call the functions of Identifier class here but they won't run
        fn_voice() #I need the playsound part to only return playsound when the input data is correct
        fn_csvwriter()
        iden=fn_voice().where #I need to get the variable 'where' from fn_voice() but I can't seem to get it
     def verifier(self):
        verify=identity.iden
        if verify == 1:
            print ("correct")
        else:
            print ("incorrect")

Как мне это сделать? Как мне запустить весь первый класс и как извлечь переменную where, чтобы я мог использовать ее в функции verifier? Большое спасибо.

1 Ответ

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

В python вы не можете получить доступ к переменным, как вы сделали с fn_voice().where.

Подробнее о сфере деятельности читайте на https://pythonspot.com/scope/.

Решением вашей проблемы будет назначение where ссылки (переменной) в классе, а не в методе.

class Identifier:
    where = None
    def fn_voice(self):
        where = match[0]

Тогда вы сможете получить доступ к where, например:

Identifier.where

NB. Не забудьте проверить, является ли значение where равным None. Мы можем использовать стандартную проверку истинности Python https://docs.python.org/2.4/lib/truth.html.

if Identifier.where:
    #Logic if where is not None.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...