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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:27:44