You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决PySimpleGUI开发中出现的“NoneType Object”错误

错误原因排查

  • 线程启动参数错误
    _thread.start_new_thread() 第一个参数要求传入可调用的函数对象,你当前写的speak(a)是直接执行了speak函数,返回值是None,自然会报TypeError: 'NoneType' object is not callable的错误。正确写法是把函数名作为第一个参数,函数入参放在第二个元组参数里。
  • 循环逻辑错误
    for i in range (len(chars) and not stop) 写法不符合预期:Python中and运算的结果是布尔值,当stop=False且输入文本非空时,len(chars) and not stop的结果是True,转成整数就是1,所以range(1)只会循环1次,自然只能读第一个字符。
  • 停止逻辑未生效
    原写法没有把停止判断放在循环执行过程中,即使stop设为True也不会终止正在进行的朗读循环。

修正后代码

from tkinter.constants import TRUE
import PySimpleGUI as sg
import pyttsx3
import time
import _thread

layout = [
    [sg.Text('Enter what you wanna teach : ')],
    [sg.Input(key='-inp-')],
    [sg.Button('Reads'),sg.Button('Stop'),sg.Button('Exit')]
]

window = sg.Window("Narrator",layout)
engine = pyttsx3.init()
chars = []
a = 0.5
stop = False

def splits(sentence):
    return list(sentence)

def speak(interval):
    global stop
    for char in chars:
        # 每次朗读前判断是否要终止
        if stop:
            engine.stop()
            break
        engine.say(char)
        engine.runAndWait()
        time.sleep(interval)

while TRUE:
    event,values = window.read()
    
    if event == 'Reads':
        out = values['-inp-']
        chars = splits(out)
        stop = False
        # 修正线程启动写法
        _thread.start_new_thread(speak, (a,))
    elif event == 'Stop':
        stop = True
    elif event == 'Exit' or event == sg.WIN_CLOSED:
        break

window.close()
engine.stop()

内容的提问来源于stack exchange,提问作者Kashif Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:09:00