I'm trying to check whether the user entered the correct path or not.
when the output appears it doesn't give any error but when i close the output it gets an error :
but when I try to catch the error it still returns the same error
Here's the code to try to catch the error :
when the output appears it doesn't give any error but when i close the output it gets an error :
Traceback (most recent call last):
File "voice_translate.py", line 115, in <module>
main()
File "voice_translate.py", line 88, in main
if check_file(values["Path"]):
TypeError: 'NoneType' object is not subscriptableI think it's wrong the os.path.isfile()method
but when I try to catch the error it still returns the same error
Here's the code to try to catch the error :
def check_file(path):
try:
os.path.isfile(path)
return True
except TypeError:
return Falseand this is the main code :import os
import pyttsx3
import requests
import googletrans
import PySimpleGUI as sg
import speech_recognition as sr
def audio_layout():
""" return audio layout """
layout = [
[sg.In(key="Path", size=(39, 0))],
[
sg.FileBrowse("Browse", size=(10, 0), target="Path"),
sg.Button("Text", size=(10, 0)),
sg.Button("Voice", size=(10, 0)),
],
]
return sg.Window("Voice Translate", layout, finalize=True)
def result_layout():
""" return result layout """
layout = [[sg.Output(size=(60, 20))]]
return sg.Window("Voice Translate", layout, finalize=True)
def language_translate(text, lang="id"):
""" returns the text after it is translated """
translator = googletrans.Translator()
lang_convert = translator.translate(text, dest=lang)
return lang_convert.text
def audio_to_text(audio):
""" convert audio to text """
recognizer = sr.Recognizer()
sound = sr.AudioFile(audio)
with sound as source:
audio = recognizer.record(source)
return recognizer.recognize_google(audio)
def text_to_audio(text):
""" convert text into voice """
engine = pyttsx3.init()
engine.say(text)
engine.runAndWait()
engine.stop()
def check_internet():
""" return true if internet is connect """
# google url only to test whether the user is connected to the internet
url = "https://www.google.com/"
timeout = 3
try:
requests.head(url, timeout=timeout)
return True
except requests.ConnectionError:
sg.popup("Lost Connection!")
return False
def check_file(path):
try:
os.path.isfile(path)
return True
except TypeError:
return False
# main program
def main():
audio_window, result_window, allowed = audio_layout(), None, False
while check_internet():
# read/get all event in all window
window, event, values = sg.read_all_windows()
# audio layout/window event handling
if window == audio_window and event in (sg.WIN_CLOSED, "Exit"):
break
# bug! "TypeError: 'NoneType' object is not subscriptable"
if check_file(values["Path"]):
convert_to_text = audio_to_text(values["Path"])
text_translate = language_translate(convert_to_text)
allowed = True
# user get the translate result of their voice
if event == "Text" and allowed:
result_window = result_layout()
# show the output on output widget
print(text_translate)
if event == "Voice" and allowed:
text_to_audio(text_translate)
# result layout/window event handling
if window == result_window and event in (sg.WIN_CLOSED, "Exit"):
result_window.close()
result_window = None
allowed = False
audio_window.close()
if result_window is not None:
result_window.close()
if __name__ == "__main__":
main()I know I can put the try and except statements above if or even replace them but I think it becomes unclean code and might make my code dirty
