吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1080|回复: 14
收起左侧

[Python 原创] python写的一个英语学习小软件,需要调用谷歌的在线翻译功能可用。

[复制链接]
vocan 发表于 2024-9-30 16:52
pip install PyQt6 gTTS pygame googletrans==3.1.0a0  运行库没有的装上
谷歌翻译修复工具在本站搜索【GoogleTranslate】
220164730.png
[Python] 纯文本查看 复制代码
import sys
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, 
                             QPushButton, QLabel, QGridLayout, QScrollArea, QFileDialog)
from PyQt6.QtCore import Qt, QThread, pyqtSignal
from gtts import gTTS, gTTSError
import os
import pygame
from googletrans import Translator

class TranslateThread(QThread):
    translation_done = pyqtSignal(str)

    def __init__(self, text, dest='zh-cn'):
        QThread.__init__(self)
        self.text = text
        self.dest = dest

    def run(self):
        translator = Translator()
        try:
            translation = translator.translate(self.text, dest=self.dest).text
            self.translation_done.emit(translation)
        except Exception as e:
            self.translation_done.emit(f"翻译出错: {str(e)}")

class AudioThread(QThread):
    audio_done = pyqtSignal()
    error_occurred = pyqtSignal(str)

    def __init__(self, text):
        QThread.__init__(self)
        self.text = text
        self.audio_file = "temp_audio.mp3"
        self.is_paused = False

    def run(self):
        try:
            tts = gTTS(text=self.text, lang='en', tld='com')  # 只使用美式英语
            tts.save(self.audio_file)
            pygame.mixer.music.load(self.audio_file)
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy() or self.is_paused:
                pygame.time.Clock().tick(10)
            pygame.mixer.music.unload()
            self.audio_done.emit()
        except gTTSError as e:
            self.error_occurred.emit(f"gTTS错误: {str(e)}")
        except Exception as e:
            self.error_occurred.emit(f"音频播放出错: {str(e)}")

    def pause_audio(self):
        pygame.mixer.music.pause()
        self.is_paused = True

    def resume_audio(self):
        pygame.mixer.music.unpause()
        self.is_paused = False

class EnglishLearningApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        pygame.mixer.init()
        self.audio_thread = None
        self.is_playing = False  # 标志当前是否在播放

    def initUI(self):
        main_layout = QVBoxLayout()

        self.input_field = QTextEdit()
        self.input_field.setFixedSize(400, 100)
        main_layout.addWidget(self.input_field)

        button_layout = QHBoxLayout()

        self.play_button = QPushButton('朗读')
        self.play_button.clicked.connect(self.play_text)
        button_layout.addWidget(self.play_button)

        self.stop_button = QPushButton('停止阅读')
        self.stop_button.clicked.connect(self.stop_audio)
        button_layout.addWidget(self.stop_button)

        self.pause_button = QPushButton('暂停阅读')
        self.pause_button.clicked.connect(self.toggle_pause_resume)
        self.pause_button.setEnabled(False)  # 初始禁用该按钮
        button_layout.addWidget(self.pause_button)

        self.split_button = QPushButton('拆分句子')
        self.split_button.clicked.connect(self.split_sentence)
        button_layout.addWidget(self.split_button)

        self.save_button = QPushButton('保存音频')
        self.save_button.clicked.connect(self.save_audio)
        button_layout.addWidget(self.save_button)

        main_layout.addLayout(button_layout)

        self.translation_label = QLabel()
        self.translation_label.setWordWrap(True)  # 启用自动换行
        main_layout.addWidget(self.translation_label)

        scroll_area = QScrollArea()
        scroll_area.setWidgetResizable(True)
        scroll_content = QWidget()
        self.word_layout = QGridLayout(scroll_content)
        scroll_area.setWidget(scroll_content)
        main_layout.addWidget(scroll_area)

        self.setLayout(main_layout)
        self.setWindowTitle('英语学习助手')
        self.setGeometry(300, 300, 500, 500)

    def play_text(self):
        text = self.input_field.toPlainText()
        if text:
            self.play_button.setEnabled(False)
            self.pause_button.setEnabled(True)  # 启用暂停按钮
            self.stop_button.setEnabled(True)  # 启用停止按钮
            
            self.translate_text(text)
            self.audio_thread = AudioThread(text)
            self.audio_thread.audio_done.connect(self.on_audio_done)
            self.audio_thread.error_occurred.connect(self.on_audio_error)
            self.audio_thread.start()
            self.is_playing = True  # 设置播放状态

    def stop_audio(self):
        pygame.mixer.music.stop()
        self.play_button.setEnabled(True)
        self.pause_button.setEnabled(False)
        self.stop_button.setEnabled(False)
        self.is_playing = False  # 重置播放状态

    def toggle_pause_resume(self):
        if self.audio_thread and self.audio_thread.is_paused:
            self.audio_thread.resume_audio()
            self.pause_button.setText('暂停阅读')
        else:
            if self.audio_thread:
                self.audio_thread.pause_audio()
                self.pause_button.setText('继续阅读')

    def on_audio_done(self):
        self.play_button.setEnabled(True)
        self.pause_button.setEnabled(False)  # 禁用暂停按钮
        self.stop_button.setEnabled(False)  # 禁用停止按钮
        self.is_playing = False  # 重置播放状态

    def on_audio_error(self, error_msg):
        self.play_button.setEnabled(True)
        self.pause_button.setEnabled(False)
        self.stop_button.setEnabled(False)  # 禁用停止按钮
        self.translation_label.setText(error_msg)

    def translate_text(self, text):
        self.translation_thread = TranslateThread(text)
        self.translation_thread.translation_done.connect(self.update_translation)
        self.translation_thread.start()

    def update_translation(self, translation):
        self.translation_label.setText(f"中文翻译: {translation}")

    def split_sentence(self):
        text = self.input_field.toPlainText()
        words = text.split()

        for i in reversed(range(self.word_layout.count())): 
            self.word_layout.itemAt(i).widget().setParent(None)

        for i, word in enumerate(words):
            button = QPushButton(word)
            button.clicked.connect(lambda checked, w=word: self.on_word_click(w))
            row = i // 3
            col = i % 3
            self.word_layout.addWidget(button, row, col)

    def on_word_click(self, word):
        self.audio_thread = AudioThread(word)
        self.audio_thread.audio_done.connect(self.on_audio_done)
        self.audio_thread.error_occurred.connect(self.on_audio_error)
        self.audio_thread.start()
        self.translate_text(word)

    def save_audio(self):
        if os.path.exists("temp_audio.mp3"):
            save_path, _ = QFileDialog.getSaveFileName(self, "保存音频文件", "", "MP3 Files (*.mp3)")
            if save_path:
                try:
                    with open("temp_audio.mp3", 'rb') as src_file, open(save_path, 'wb') as dst_file:
                        dst_file.write(src_file.read())
                    print(f"音频文件已保存到: {save_path}")
                except Exception as e:
                    print(f"保存音频文件时出错: {str(e)}")
        else:
            print("没有可保存的音频文件")

    def closeEvent(self, event):
        if os.path.exists("temp_audio.mp3"):
            os.remove("temp_audio.mp3")
        event.accept()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = EnglishLearningApp()
    ex.show()
    sys.exit(app.exec())

免费评分

参与人数 5吾爱币 +10 热心值 +5 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
DYAurocal + 1 用心讨论,共获提升!
刘统宝 + 1 + 1 谢谢@Thanks!
wj21 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
helian147 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

刘统宝 发表于 2024-9-30 22:37
论坛里的这个谷歌翻译修复工具不太行,试用几次都失败,大家有成功的吗?
alpha版本也测试了,都不行
wj21 发表于 2024-9-30 22:20
 楼主| vocan 发表于 2024-9-30 22:41
我有一个这大神写的,很好用啊。就是在论坛你下的。你们找一下。
RXL@VYG{1B$O{~HF_J9A.png
chenhuxiang 发表于 2024-9-30 23:14
为什么非要用谷歌翻译呢,百度、有道、腾讯都可以用嘛。谷歌翻译经常会失效
刘统宝 发表于 2024-9-30 23:41
本帖最后由 刘统宝 于 2024-10-1 07:48 编辑
vocan 发表于 2024-9-30 22:41
我有一个这大神写的,很好用啊。就是在论坛你下的。你们找一下。

粗大事了,hosts文件不知怎地加上.txt扩展名了!
楼主此帖让我把这问题解决了,
送分表示感谢!
gegegefei 发表于 2024-10-1 08:18
感谢楼主分享,支持一下,小工具对于我来说,很有帮助。
suxfei 发表于 2024-10-1 08:28
这是需要安装Python程序吗
Hileen520 发表于 2024-10-1 08:38
收藏,感谢分享
龍謹 发表于 2024-10-1 09:18
翻译、朗读这些个功能可以啊,谢谢楼主分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 05:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表