Python Forum

Full Version: TypeError: 'NoneType' object is not subscriptable
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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 :

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 subscriptable
I 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 False
and 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
Please show the complete error message. It surely tells on what line the error occurs.
(Sep-26-2020, 07:44 AM)syafiq14 Wrote: [ -> ]TypeError: 'NoneType' object is not subscriptable

The error is self-explanatory. You are trying to subscript an object which you think is a list or dict, but actually is None (i.e: the object has no value). This means that you tried to do:

None[something]

Here you attempted to index an object that doesn’t have that functionality. You might have noticed that the method sort() that only modify the list have no return value printed – they return the default None. This is a design principle for all mutable data structures in Python.

This ‘NoneType’ object is not subscriptable is the one thrown by python when you use the square bracket notation object[key] where an object doesn’t define the getitem method.
cristydavidd Wrote:The error is self-explanatory.
The error traceback contains valuable information (including line numbers) that not only show where the error occurred, but also show what was processed just prior to the fail. This is why we ask for it.