使用tkinter与pyttsx3开发屏幕阅读器:从光标位置朗读文本框内容的功能实现及报错解决
解决Tkinter文本框光标位置朗读的问题
咱们一步步来解决你的问题:
1. 先搞定NameError: name 'CURRENT' is not defined报错
CURRENT是Tkinter内置的常量,用来指代当前光标位置,但你没正确引用它。两种修复方式任选其一:
- 使用时加上
tk.前缀,写成tk.CURRENT - 或者在代码开头导入这个常量:
from tkinter import CURRENT
2. 实现从光标位置朗读的核心逻辑
你的原函数有两个明显问题:
text_box.index()只需要一个参数(你传了两个),它的作用是获取指定位置的索引值- 你现在只是朗读了索引字符串,而不是光标之后的实际文本内容
另外,你还忘记初始化pyttsx3的语音引擎实例了,这会导致后续调用engine.say()时直接报错。
修改后的完整可运行代码
import tkinter as tk import pyttsx3 import threading jabberwocky = """ ’Twas brillig, and the slithy toves Did gyre and gimble in the wabe: All mimsy were the borogoves, And the mome raths outgrabe. """ # 初始化语音朗读引擎 engine = pyttsx3.init() # 标记当前是否正在朗读 is_reading = False def READfromCURSOR(): global is_reading if not is_reading: is_reading = True # 获取当前光标所在位置的索引 cursor_pos = text_box.index(tk.CURRENT) # 提取从光标位置到文本末尾的内容 text_to_read = text_box.get(cursor_pos, tk.END) # 用线程执行朗读,避免阻塞GUI界面 def read_task(): global is_reading engine.say(text_to_read) engine.runAndWait() is_reading = False threading.Thread(target=read_task).start() def PAUSEREADING(): global is_reading if is_reading: engine.stop() is_reading = False window = tk.Tk() window.geometry("800x600+100+100") window.title("简易屏幕阅读器") framed1 = tk.Frame(window) text_box = tk.Text(framed1, font=("Arial", 12)) text_box.pack(padx=5, pady=15, fill=tk.BOTH, expand=True) text_box.insert(tk.INSERT, jabberwocky) framed1.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 朗读按钮 read_btn = tk.Button(window, text="从光标位置朗读", command=READfromCURSOR) read_btn.pack(side=tk.LEFT, padx=20, pady=10) # 暂停按钮 pause_btn = tk.Button(window, text="暂停朗读", command=PAUSEREADING) pause_btn.pack(side=tk.LEFT, padx=20, pady=10) window.mainloop()
关键修改点说明
- 初始化语音引擎:创建
engine = pyttsx3.init()实例,这是实现语音朗读的基础 - 提取光标后文本:先用
text_box.index(tk.CURRENT)拿到光标位置,再用text_box.get()提取需要朗读的内容 - 线程处理朗读:因为
engine.runAndWait()是阻塞式的,用线程执行可以避免GUI界面卡死 - 实现暂停功能:调用
engine.stop()可以终止当前朗读,同时用is_reading变量跟踪状态,防止重复触发朗读
现在你可以测试:把光标放在任意文本位置,点击「从光标位置朗读」,就会从光标处开始朗读;点击「暂停朗读」可以随时终止朗读。
内容的提问来源于stack exchange,提问作者egghead jr
相关产品推荐
相关产品推荐

