如何从另一个类运行函数并使用其变量?

时间:2019-04-10 00:36:20

标签: python function class

我是Python的初学者,致力于为我们的最后一年项目开发一个简单的应用程序。这是我无法解决的唯一部分,非常感谢您的帮助。我需要从实时更新的csv文件中获取一个值,获取第一个元素并将其与参考csv进行匹配。该部分已经在工作。然后,我需要它来播放相应的声音。该部分也已经在工作。

但是,由于它将位于Kivy应用程序中,因此我需要创建多个类。一些将处理数据处理端,而Kivy部分将处理显示部分。但是我今天的问题是针对Kivy中的Python部分。

第一个类处理csv,playsound和numpy匹配。

第二个类是我试图调用第一个类的函数以使其运行的地方。我还尝试使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 :(得分:0)

在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.