Import variable from pythonscript --> solve caused TypeError

0

I've been trying to build a speech-recognition application with gtts. What I want to do now is to use a variable from another python script so I can update a tk Label. I tried to put my code in a structure of a class to access the variable. I've added a smaller program to showcase my problem. (These programs are ment to be running at the same time) I'am a beginner in Python so I hope you guys can teach me how to do it better. :) Thank you in advance!!

Error:

S = SuperAssistant()
TypeError: __init__() missing 1 required positional argument: 'audio'

basic example that showcases my problem:

from try_access_var import myfunction 

print(myfunction.audio)

Then in my other pyscript called try_access_var:

def myfunction():
    audio = 1

(My program where I want to implement the Solution I might get)

`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

Note that "Class SuperAssistant" belongs to the code

class SuperAssistant:

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.')`

This here is my code at the end of the function/class:

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))

the code of the smaller program (show tk window) I opened with subprocess.Popen(....)

#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)
python-3.x
class
tkinter
python-import
attributeerror
asked on Stack Overflow Jul 31, 2020 by Johannes Zimmermann • edited Aug 5, 2020 by Johannes Zimmermann

1 Answer

0

SuperAssistent does not have a class attribute named audio. For this you would have to set it somewhere in your class. For example, you could do something like SuperAssistent.audio = audio in talkToMe.

Is it on purpose that you use class methods only and do not instantiate SuperAudio? If that is not the case you should add a constructor and add self as first arguments of all methods that are not class methods. I suggest to go through an introduction for Python classes/objects like this one on w3schools if that is the case.

Update:

Here is an example for setting and accessing class and instance attributes with split up files for script and class definition:

example.py:

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

#!/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)

Executing script.py gives the following output (note that IDs change between machines and executions:

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
answered on Stack Overflow Jul 31, 2020 by Stefan Scheller • edited Aug 5, 2020 by Stefan Scheller

User contributions licensed under CC BY-SA 3.0