如何解决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
相关产品推荐
相关产品推荐

