提示:文章最后有GitHub源码地址,配制好解释器,语言版本以及pip install相关库,右键宠物,即可使用
一、代码框架(代码解读)
func.py文件
类 Eat:
这个类代表了一个用于推荐餐厅的小部件。
__init__
方法初始化了小部件的几何、标题、背景和UI元素。
add_ui
方法设置了UI组件,比如 QTextBrowser 用于显示文本。
closeEvent
方法处理了关闭小部件的事件。
类 Weather:
这个类代表了一个用于显示天气信息的小部件。
__init__
方法初始化了小部件的几何、标题、背景和UI元素。
add_ui
方法设置了UI组件,比如 QTextBrowser 用于显示文本。
它还调用了 OpenWeatherMap 的 API 获取上海的天气数据,并将其显示出来。
closeEvent
方法处理了关闭小部件的事件。
类 Translation:
这个类代表了一个用于将中文文本翻译为英文的小部件。
__init__
方法初始化了小部件的几何、标题、背景和UI元素。
add_ui
方法设置了UI组件,比如 QTextBrowser 用于显示文本。
它通过向有道翻译 API 发送 POST 请求将给定的中文文本翻译为英文,并显示翻译后的文本。
closeEvent
方法 处理了关闭小部件的事件。
main部分:
代码的这部分初始化了一个 QApplication,创建了一个 Eat 类的实例(代表餐厅推荐),显示了小部件,并使用 app.exec_() 开始应用程序事件循环。
每个类代表应用程序的不同功能或小部件,而主要部分初始化了应用程序并开始了事件循环。
PetAssistant文件
语音识别线程类 SpeechRecognitionThread
这是一个继承自 QThread 的自定义线程类,用于实现语音识别。
在 run 方法中,使用 SpeechRecognition 库进行语音识别,将识别结果通过信号 recognition_completed 发送出去。
宠物助手类 PetAssistant:
这个类继承自 QWidget,代表了整个宠物助手应用程序。
init
方法用于初始化窗口属性,使其无边框、总显示在最前面,并且设置窗口透明。
initPall
方法用于初始化系统托盘菜单,设置托盘图标和菜单项。
initPetImage
方法用于初始化宠物显示的图片资源。
petNormalAction
方法用于设置宠物的正常待机动作,通过定时器实现随机切换动作。
randomAct
方法用于随机切换宠物的动作。
quit
方法用于关闭程序。
showwin
方法用于显示宠物窗口。
randomPosition
方法用于随机设置宠物的位置。
mousePressEvent、mouseMoveEvent、mouseReleaseEvent、enterEvent
方法用于处理鼠标事件,实现宠物跟随鼠标移动等交互。
contextMenuEvent
方法用于处理右键菜单事件,根据右键菜单项的选择执行相应的操作。
handle_speech_recognition_completed
方法用于处理语音识别完成后的结果,根据识别结果执行不同的操作。
其他方法用于实现宠物不同动作的功能,如移动、播放音乐、餐厅推荐、天气查询、汉英翻译等。
主程序部分:
创建了一个 QApplication 实例和 PetAssistant 实例,并启动了应用程序事件循环。
其它文件
其他文件诸如.mp3 .jpg .gif等均是一些资源配置文件,可以根据自身条件修改。
二、多线程编程
在这使用了 Python 的多线程编程来实现语音识别功能。
具体实现步骤如下:
创建自定义线程类 SpeechRecognitionThread:
①首先定义了一个继承自 QThread 的线程类 SpeechRecognitionThread
,用于执行语音识别任务。
在该类中定义了一个字符串类型的信号 recognition_completed,用于在语音识别对象与宠物助手类之间传递信息。
②重写 run 方法:
在 SpeechRecognitionThread
类中重写了 run 方法,该方法是线程的入口点。
在 run 方法中,使用 speech_recognition 库进行语音识别。这里使用了 with 语句和 sr.Microphone() 获取麦克风资源,并通过 r.listen(source) 获取音频数据。
尝试通过 r.recognize_google(audio, language=‘zh-CN’) 将音频数据转换为文字,并捕获可能发生的异常。
如果语音中包含了“关闭”相关的关键词,则通过信号 recognition_completed 发送关闭信号,以通知宠物助手程序退出。
在主程序中启动线程:
③在主程序的入口处,创建了一个 QApplication
实例和一个 PetAssistant
实例。
然后创建了一个 SpeechRecognitionThread 实例,并连接了其信号 recognition_completed 与宠物助手类的槽函数handle_speech_recognition_completed。
最后调用了线程的 start 方法,启动了语音识别线程。
这样设计,语音识别任务被放在一个独立的线程中执行,不会阻塞主线程,从而保持了程序的流畅性和响应性。