类型错误函数缺少一个参数'self'

问题描述:

我想线程一个speech_recognition函数在后台连续运行,并检查音频函数,看看有什么文字说话,并采取相应的行动,我试着线程2功能运行平行但语音侦察功能一遍又一遍地被调用,我从来没有使用线程,并在YouTube上跟随一个教程来线程我的功能,我得到,我可以犯了一个非常愚蠢的错误,所以我请求谁回答这个问题在他们的答案和我的错误中有点详细。谢谢。类型错误函数缺少一个参数'self'

编辑
所以我删除其造成这个错误使得整个程序冗余我的听力功能的while循环,但现在我得到类型错误:checkingAudio()失踪1个人需要的位置参数:“自我”,我 as explained here要求我实例化一个类,但我做到了这一点,同样的错误仍然存​​在。

class listen(threading.Thread): 

    def __init__(self): 

     self.playmusicobject = playmusic() 
     self.r = sr.Recognizer() 

     self.listening() 

def listening(self): 

    self.objectspeak = speak() 
    self.apiobject = googleAPI() 
    print("say something") 
    time.sleep(2.0) 
    with sr.Microphone() as source: 
     # self.objectspeak.speaking("say something") 
     self.audio = self.r.listen(source) 


    def checkingAudio(self): 
     time.sleep(0.5) 

     try: 
      a = str(self.r.recognize_google(self.audio)) 
      a = str(self.r.recognize_google(self.audio)) 
      print(a) 

      if a in greetings: 
       self.objectspeak.speaking("I am good how are you?") 

      if a in music: 
       print("playing music") 
       self.playmusicobject.play() 
      if a in stop: 
       print("stopping") 
       self.playmusicobject.b() 

      if a in api: 
       self.apiobject.distance() 

      else: 
       print("error") 

     except sr.UnknownValueError: 
      print("Google Speech Recognition could not understand audio") 

     except sr.RequestError as e: 
      print("Could not request results from Google Speech Recognition service; {0}".format(e)) 


class speak: 
    THIS IS A PYTTS class 




class googleAPI: 
    GOOGLE DISTANCE API function calculates distance between 2 places 

class playmusic: 

    def play(self): 
     self.objectspeak = speak() 
     playsound.playsound('C:\\Users\legion\Downloads\Music\merimeri.mp3') 

    def b(self): 
     self.objectspeak.speaking("music stopped") 

while 1: 
    a = listen 
    t1 = threading.Thread(target=listen()) 
    t2 = threading.Thread(target= a.checkingAudio()) 
    t1.join() 
    t2.join() 
+1

在回答您的编辑,你没有实例化'listen'。你忘了父亲;你想'a = listen()'。但是,当然,现在你正在执行你想要在线程之外进行线程工作,并且仍然无法在线程中进行任何工作(因为在定义目标时你不想要这些工作)。阅读我的答案,它涵盖了所有这些。 – ShadowRanger

你实际上并没有使用任何线程,你在你的主线程调用的函数,而不是使他们的目标由线程调用。即使你有,你从来没有打电话start开始执行线程。你需要修正几件事:

首先,确保你只执行初始化,但不是正在进行的工作,在__init__;您需要首先完成创建对象,即使可以使用checkingAudio也可以使用该对象。

其次,你的线程创建更改为:

while 1: 
    listener = listen() # Make the object 
    t1 = threading.Thread(target=listener.listening) # Note: No parens or we invoke in main thread 
    t2 = threading.Thread(target=listener.checkingAudio) # Note: No parens 
    t1.start() # Actually launch threads 
    t2.start() 
    t1.join() 
    t2.join() 
+0

谢谢你的回答和解释。我很感谢@ ShadowRanger –