首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从pythonscript导入变量-->解析导致的TypeError

从pythonscript导入变量-->解析导致的TypeError
EN

Stack Overflow用户
提问于 2020-07-31 15:41:02
回答 1查看 77关注 0票数 0

我一直在尝试用gtts构建一个speech-recognition应用程序。我现在想做的是使用另一个python脚本中的变量,这样我就可以更新tk标签了。我试图将我的代码放在一个类的结构中来访问这个变量。我添加了一个较小的程序来展示我的问题。(这些程序是同时运行的)我是Python的初学者,所以我希望你们能教我怎么做得更好。:)提前谢谢!

错误:

代码语言:javascript
复制
S = SuperAssistant()
TypeError: __init__() missing 1 required positional argument: 'audio'

展示我的问题的基本示例:

代码语言:javascript
复制
from try_access_var import myfunction 

print(myfunction.audio)

然后在我另一个名为try_access_var的pyscript中:

代码语言:javascript
复制
def myfunction():
    audio = 1

(我想在我的程序中实现我可能得到的解决方案)

代码语言:javascript
复制
`from gtts import gTTS
import speech_recognition as sr
from playsound import playsound
import os
import re
import webbrowser
from tkinter import *
import smtplib
import requests
import sys
import subprocess
from subprocess import Popen
import time
import datetime as dt
from datetime import timedelta
import keyboard
import mouse
import pyaudio
import tkinter as tk
from tkinter import filedialog, Text
import csv

请注意,“SuperAssistant类”属于代码

SuperAssistant类:

代码语言:javascript
复制
def __init__(self):

    self.audio = audio
    
    

def talkToMe(self):
    "speaks audio passed as argument"

    #SuperAssistant.audio = audio
    print(self.audio)
    
    tts = gTTS(text=audio, lang='en')
    tts.save("good.mp3")
    #os.system("cd C://Users//johan//OneDrive - Departement Bildung, Kultur und Sport Kanton Aargau-7988362-Kantonsschule Zofingen//DATA_SHAR//desktopAssistant-master")
    #os.system("python -i C://Users//johan//OneDrive - Departement Bildung, Kultur und Sport Kanton Aargau-7988362-Kantonsschule Zofingen//DATA_SHAR//desktopAssistant-master//tkinter_samentha_tricks.py")
    #os.system("python -i tkinter_samentha_tricks.py")
    #force it to have no console
    DETACHED_PROCESS = 0x00000008
    subprocess.Popen("python -i tkinter_samentha_tricks.py") #creationflags=DETACHED_PROCESS)
    while playsound("good.mp3"):
        pass
    os.remove("good.mp3")


        

    #print(audio)
    #for line in audio.splitlines():
     #   os.system("say " + audio)

    #use the system's inbuilt say command instead of mpg123
    #text_to_speech = gTTS(text=audio, lang='en')
    #text_to_speech.save('audio.mp3')
    #os.system('mpg123 audio.mp3')



def myCommand(self, x):
    "listens for commands"

    r = sr.Recognizer()
    #mic_version= open("C:/Users/johan/OneDrive - Departement Bildung, Kultur und Sport Kanton Aargau-7988362-Kantonsschule Zofingen/DATA_SHARE/desktopAssistant-master/choose_mic_text.txt", "r")
    #mic_integer=mic_version
    #mic = sr.Microphone(device_index=mic_integer)

    with sr.Microphone() as source:
        print('Ready...')
        r.pause_threshold = 1
        r.adjust_for_ambient_noise(source, duration=1)
        audio = r.listen(source)

    if x == 1:
        try:
            command = r.recognize_google(audio).lower()
            #talkToMe('You said: ' + command + '\n')
            #add silent mode. for now: print only
            print('You said: ' + command + '\n')
        #loop back to continue to listen for commands if unrecognizable speech is received
        except sr.UnknownValueError:
            print('Your last command couldn\'t be heard')
            command = SuperAssistant.myCommand(1);

        return command


        if x == 2:
            try:
                command02 = r.recognize_google(audio).lower()
                #talkToMe('You said: ' + command + '\n')
                #add silent mode. for now: print only
                print('You said: ' + command02 + '\n')
            #loop back to continue to listen for commands if unrecognizable speech is received
            except sr.UnknownValueError:
                print('Your last command couldn\'t be heard')
                command02 = SuperAssistant.myCommand(2);

            return command02
        
        if x == 3:
            try:
                command03 = r.recognize_google(audio).lower()
                #talkToMe('You said: ' + command + '\n')
                #add silent mode. for now: print only
                print('You said: ' + command03 + '\n')
            #loop back to continue to listen for commands if unrecognizable speech is received
            except sr.UnknownValueError:
                print('Your last command couldn\'t be heard')
                command03 = SuperAssistant.myCommand(3);

            return command03

        if x == 4:
            try:
                command04 = r.recognize_google(audio).lower()
                #talkToMe('You said: ' + command + '\n')
                #add silent mode. for now: print only
                print('You said: ' + command04 + '\n')
            #loop back to continue to listen for commands if unrecognizable speech is received
            except sr.UnknownValueError:
                print('Your last command couldn\'t be heard')
                command04 = SuperAssistant.myCommand(4);

            return command04

        if x == 5:
            try:
                command05 = r.recognize_google(audio).lower()
                #talkToMe('You said: ' + command + '\n')
                #add silent mode. for now: print only
                print('You said: ' + command05 + '\n')
            #loop back to continue to listen for commands if unrecognizable speech is received
            except sr.UnknownValueError:
                print('Your last command couldn\'t be heard')
                command05 = SuperAssistant.myCommand(5);

            return command05

        if x == 6:
            try:
                command06 = r.recognize_google(audio).lower()
                #talkToMe('You said: ' + command + '\n')
                #add silent mode. for now: print only
                print('You said: ' + command06 + '\n')
            #loop back to continue to listen for commands if unrecognizable speech is received
            except sr.UnknownValueError:
                print('Your last command couldn\'t be heard')
                command06 = SuperAssistant.myCommand(6);

            return command06
    

    def time_greeting():
        if 12 > dt.datetime.now().hour:
            SuperAssistant.talkToMe('Good morning sir.')
        elif 12 == dt.datetime.now().hour:
            SuperAssistant.talkToMe('It is high noon, hope you are ready for your duel!')
        elif (12 < dt.datetime.now().hour) and (18 > dt.datetime.now().hour):
            SuperAssistant.talkToMe('Good afternoon sir.')
        elif 18 < dt.datetime.now().hour:
            SuperAssistant.talkToMe('Good evening sir.')

    def time_bye():
        if 12 > dt.datetime.now().hour:
            SuperAssistant.talkToMe('wish you a nice morning sir.')
        elif 12 == dt.datetime.now().hour:
            SuperAssistant.talkToMe('wish you a good lunce sir.!')
        elif (12 < dt.datetime.now().hour) and (18 > dt.datetime.now().hour):
            SuperAssistant.talkToMe('wish you a good afternoon sir.')
        elif 18 < dt.datetime.now().hour:
            SuperAssistant.talkToMe('wish you good evening sir.')


    def welcome():
        
        SuperAssistant.talkToMe('My systems are booting up. Systems successfully booted!')
        SuperAssistant.time_greeting()
        SuperAssistant.talkToMe('How should I call you? Please tell me your name.')
        global name
        name = SuperAssistant.myCommand(1)
        SuperAssistant.talkToMe('Nice to meet you ' + name +'.')

        file=open("C://Users//johan//OneDrive - Departement Bildung, Kultur und Sport Kanton Aargau-7988362-Kantonsschule Zofingen//DATA_SHARE//desktopAssistant-master//userprofiles.txt", "r") 

        with open("C://Users//johan//OneDrive - Departement Bildung, Kultur und Sport Kanton Aargau-7988362-Kantonsschule Zofingen//DATA_SHARE//desktopAssistant-master//userprofiles.txt", "r") as profiles:
        
            for line in profiles:
                if name in line:
                    pass
        
    
        for profiles in file.readlines():
            print(profiles)
            
        if name in profiles:
            SuperAssistant.talkToMe('welcome back.')
            file.close()
        else:
            SuperAssistant.talkToMe('Should I create a new profile?')
            profilcreation=myCommand(2)
                
            if 'yes' in profilcreation:
            
                #questions to ask to create new profil
                SuperAssistant.talkToMe('I am going to ask you some questions...')
                        
                SuperAssistant.talkToMe('What is your favorite color?')
                question01_profilcreation=myCommand(3)
                        
                SuperAssistant.talkToMe('What is your favorid food?')
                question02_profilcreation=myCommand(3)
                        
                SuperAssistant.talkToMe('When were you born?')
                question03_profilcreation=myCommand(3)

                file=open("C:/Users/johan/OneDrive - Departement Bildung, Kultur und Sport Kanton Aargau-7988362-Kantonsschule Zofingen/DATA_SHARE/desktopAssistant-master/userprofiles.txt", "a") 

                
                file.write('\n'+'['+'"'+name+'"'+','+'"'+question01_profilcreation+'"'+','+'"'+question02_profilcreation+'"'+','+'"'+question03_profilcreation+'"'+']')

                    
                    

            
            elif 'no' in profilcreation:
                SuperAssistant.talkToMe('profilcreation denied')

        file.close()
        
        return name
        

    def load(element):

        with open("C://Users//johan//OneDrive - Departement Bildung, Kultur und Sport Kanton Aargau-7988362-Kantonsschule Zofingen//DATA_SHARE//desktopAssistant-master//userprofiles.txt", "r") as profiles:

            for line in profiles:
                if name in line:
                    
                    hole_item=line
                    #hole_item.append(line)
                    #profil_item=hole_item[element]
                    profil=hole_item.split(",")
                    print(profil)
                    profiles.close()
                    
                    return profil[element]
                    
            all_the_lines = profiles.readlines()
            items = []
            for i in all_the_lines:
                items.append(i)
                print(items)


    def assistant(command):
        "if statements for executing commands"
        
        global name

        global check

       
        if 'samantha' in command:

            if (check == 0):
                check = 1
                SuperAssistant.welcome()
            else:
                SuperAssistant.talkToMe("What can I do for you")

            
            command02 = SuperAssistant.myCommand(2)
            
            if 'open reddit' in command02:
                reg_ex = re.search('open reddit (.*)', command02)
                url = 'https://www.reddit.com/'
                if reg_ex:
                    subreddit = reg_ex.group(1)
                    url = url + 'r/' + subreddit
                webbrowser.open(url)
                print('Done!')
                    

            elif 'open youtube' in command02:
                reg_ex = re.search('open website (.+)', command02)
                print(command02)
                song_title=command02[12:]
                print(song_title)
                url='https://www.youtube.com/results?search_query='+song_title
                webbrowser.open(url)
                talkToMe('Done!')
                
                command03 = SuperAssistant.myCommand(3)
                
                if 'play' in command03:
                    keyboard.press_and_release('tab','tab')
                    keyboard.press_and_release('enter')

                    command04 = SuperAssistant.myCommand(4)

                    if 'stop' in command04:
                        keyboard.press_and_release('space')
                        command04 = SuperAssistant.myCommand(4)

                    elif 'continue' in command04:
                        keyboard.press_and_release('space')
                        command04 = myCommand(4)
                    elif 'exit' in command03:
                        talkToMe('exit')
                        command = SuperAssistant.myCommand(1)

            elif 'help' in command02:
                talkToMe('I\'ve got some information for you.')`

这是我在函数/类的末尾的代码:

代码语言:javascript
复制
if __name__ == "__main__":
    S = SuperAssistant()
    S.talkToMe('I am ready for your command')
    


#loop to continue executing multiple commands
    while True:
        SuperAssistant.assistant(SuperAssistant.myCommand(1))

我用subprocess.Popen(....)打开的小程序(show tk window)的代码。

代码语言:javascript
复制
#importing the class/function
from desktopAssistant_wakeup import SuperAssistant
from tkinter import *

#printing out imported variable (if classes are used: object)

print(#way to print audio)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-31 16:05:55

SuperAssistent没有名为audio的类属性。为此,您必须将其设置在您的类中的某个位置。例如,您可以在talkToMe中执行类似SuperAssistent.audio = audio的操作。

是否有意只使用类方法而不实例化SuperAudio?如果不是这样,您应该添加一个构造函数,并添加self作为所有非类方法的第一个参数。如果是这样的话,我建议先介绍一下Python类/对象,比如this one on w3schools

更新:

下面是一个使用脚本和类定义的拆分文件来设置和访问类和实例属性的示例:

example.py

代码语言:javascript
复制
class Foo():
    class_attribute = 'class attribute: initial value'

    def __init__(self):
        self.instance_attribute = \
            'instance attribute ({:X}): initial value'.format(id(self))

    def do_something(self = None):
        Foo.class_attribute = 'class_attribute: modified value'
        if self is not None:
            self.instance_attribute = \
                'instance attribute ({:X}): modified value'.format(id(self))

script.py

代码语言:javascript
复制
#!/usr/bin/env python3

from example import Foo

a = Foo()
b = Foo()

print(Foo.class_attribute)
print(a.instance_attribute)
print(b.instance_attribute)

print('\nChanging attributes..\n')
Foo.do_something()
a.do_something()
b.do_something()

print(Foo.class_attribute)
print(a.instance_attribute)
print(b.instance_attribute)

执行script.py会产生以下输出(请注意,ID在不同的机器和执行过程中会发生变化:

代码语言:javascript
复制
class attribute: initial value
instance attribute (7F640ACF56A0): initial value
instance attribute (7F640AC2AB50): initial value

Changing attributes..

class_attribute: modified value
instance attribute (7F640ACF56A0): modified value
instance attribute (7F640AC2AB50): modified value
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63187737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档