pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

news2025/1/19 8:34:27

一、引言

这学期儿子语文期末考试有一道这样的题目:

这道题答案是B,儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的,因为二者有一个笔画是不一样的,“车字旁”下边那笔是“提”,而“车”字是“横”,规律就是先"横"后“竖”,先“竖”后“提”,类似的还有“牛字旁”和“牛”。

为了验证我的说法,我从网上又查了一下如下图1和图2所示。

图1 “车”和“车子旁”笔顺

图2 “牛”和“牛字旁”和笔顺

为了方便查询每个字的笔顺,我和儿子决定把他所学过的生字的笔顺GIF动图都保存下来,然后编写一个小程序,想查哪个字的时候一输入,就可以很快查到,不用再去网上搜索。

儿子最近再学C++,开始想用C++来编写,但是发现用dev-c编写显示GIF动图的资料比较少,也比较难实现。而用python的例子比较多,所以就决定用python来实现。经过几天的努力,基本实现了最初的基本想法,最终的效果如图所示。

本程序简要说明:在文本编辑框中输入一个汉字,单击“查询”按钮,如果程序中含有这个汉字的动图,那么就会在屏幕中进行播放。下边就把实现的过程做个介绍。

二、Python与PyCharm

Python是一种脚本语言‌。脚本语言(Scripting language)是一种电脑编程语言,通常以简单的方式快速完成某些复杂的事情。Python是一种解释型的脚本语言,这意味着它的代码在运行之前不需要显式的编译步骤,而是通过解释器逐行解释执行。Python语言具有易学易用、开发效率高、运行速度快等优点,因此在数据科学、人工智能、Web开发、游戏开发等领域都有广泛的应用。本文用的python版本是3.12.1。

图3 python 3.12

‌PyCharm‌是由JetBrains开发的一个专门为Python设计的IDE,带有一整套用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。它支持多种Python版本,包括Python 3.5及更高版本。本文用的pycharm版本是2024.1.1。

图4 pycharm 2024.1.1

在使用PyCharm进行Python开发时,需要配置Python环境,以便PyCharm能够找到Python解释器并执行Python代码。PyCharm支持Python 2.x和Python 3.x版本,用户可以根据自己的需要选择不同的Python版本进行开发。此外,PyCharm还提供了丰富的插件和扩展,帮助用户增强开发体验和提高开发效率。

三、PySide6及其自带的designer

PySide6是Qt for Python的一部分,是一个Python绑定库,用于创建跨平台的GUI应用程序。PySide6是QT company官方维护的项目,支持LGPL协议,适用于开源和商业用途‌。PySide6自带了一个可以手动设计UI的designer,方便设计,并且可以直观看到界面的最终效果。一般的UI设计,是先用designer设计出界面,然后再把UI转成python语言格式,用pycharm平台进行功能代码的编写。

本文默认pycharm和python已经安装完成,从安装PySide6开始介绍。

pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple

下载的目录默认在python安装的目录下的\Lib\site-packages\PySide6文件夹内。

找到PySide6安装目录,打开designer应用程序,如图5所示。

图5 designer位置

四、程序实现步骤

4.1 创建pycharm工程文件

打开pycharm软件,如果是第一次使用,那么界面如下图所示。操作步骤如下:

单击“New Project”,如图6所示。

图6 pycharm初始界面

在图所示的页面中填入工程名称(Name),本例的名称为“mystroke”,选择工程存放的地址(Location),并选择python版本,然后点“Create”按钮,如图7所示。

图7 创建新工程

创建好的工程如图8所示。

图8 工程创建完成

4.2 UI设计步骤

UI设计使用PySide6自带的designer。

4.2.1在pycharm中引入designer做为外部工具

第一步:在菜单“File”中选择“Settings”选项,如图9所示。

图9  选择Settings

第二步:在“Settings”页面中,选择“Tools”项目下的“External Tools”选项,点右侧列表左上角的“+”号,添加外部工具,如图10所示。

图10 选择External Tools

第三步:在Create Tool对话框中,填好外部程序的名称(Name),选择外部程序pyside6下的designer.exe的所在位置(Program),然后单击“OK”按钮,如图11所示。注意,一定要先填名字后选程序位置,名字可以随便取。

图11  添加designer外部工具

此时,在External Tools的列表框中出现了刚刚添加的Pyside6Designer。

第四步:在pycharm中打开Pyside6Designer。在“Tools”菜单中,选择“External Tools”下的Pyside6Designer,即可打开Designer,如图12所示。

图12 打开designer

4.2.1 利用designer设计UI

第一步:创建窗体。打开designer后,选择“Main Window”,然后单击“创建”,如图13所示。

图13  选择Main Window

第二步:在窗体上添加一个文本编辑框。在页面左侧“窗口部件盒”中选择Line Edit对象,并拖动到窗体上,如图14所示。

图14  添加文本编辑框

第三步:在窗体上添加一个按钮。在页面左侧“窗口部件盒”中选择Push Button对象,并拖动到窗体上,如图15所示。

图15  添加按钮

第四步:在窗体上添加一个动图显示框。在页面左侧“窗口部件盒”中选择Label对象,并拖动到窗体上,如图16所示。

图16  添加label对象

第五步:在右侧对象检查器中查看三个对象的名称,图中红框中第一列是对象名字,第二列是所属类名,如图17所示。

图17  对象列表

第六步:修改lineEdit的初始显示内容。在窗体上选中lineEdit对象,在右侧属性编辑器中text属性后的内容修改为“请输入要查询的字”,如图18所示。

图18  设置文本编辑框初始显示内容

第七步:选中pushButton,text属性修改为“查询”,如图19所示。

图19  设置按钮显示文字

第八步:清空label的text属性内容,如图20所示。因为网上下载的字笔顺动图的像素是600*600的,所以label的外框要拉大一些,然不然字的笔顺动图显示不全。

图20  清空label初始显示内容

第九步:把设计好的UI保存到pycharm创建的工程mystroke的目录下,UI的名称为mystroke_ui,如图21所示。

图21  保存UI到pycharm工程目录

4.3 准备字笔顺动图

在mystroke的工程目录下新建一个gif文件夹,如图22所示。

图22  在工程目录下创建gif文件夹

从网上搜索“爸笔顺”,找到爸字的笔顺动图,然后在动图上鼠标右键“将图像另存为”,然后把动图存放到gif文件夹内,如图23所示。

图23  下载汉字对应的笔顺动图

4.4 编写python代码

4.4.1 为pycharm工程文件添加python程序

在pycharm的mystroke工程名字上右键单击,在弹出菜单中选择“New”——"Python File",如图24所示。

图24  给pycharm工程添加python程序

在New Python file对话框中输入python程序名称为“mystroke”,文件类型选择“Python file”,然后按回车键,完成新建mystroke.py文件,如图25所示。

图25  确定程序名称和类型

完成新建后的页面如图26所示。

图26  添加python程序完成

4.4.2 编写mystroke.py代码

在新建的mystroke.py文件中输入以下代码:

import sys
from PySide6.QtCore import QFile, QIODevice, Slot
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButton, QTextBrowser
from PySide6.QtGui import QMovie

# 定义主窗口类
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 加载UI文件
        loader = QUiLoader()
        ui_file = QFile("mystroke_ui.ui")
        if not ui_file.open(QIODevice.ReadOnly):
            print("无法打开UI文件")
            sys.exit(-1)

        # 加载UI文件并实例化为窗口对象
        self.window = loader.load(ui_file)

        # 关闭UI文件
        ui_file.close()

        # 获取UI文件中的小部件对象
        self.button1 = self.window.findChild(QPushButton, "pushButton")
        self.lineEdit = self.window.findChild(QLineEdit, "lineEdit")
        self.label = self.window.findChild(QLabel, "label")

        # 连接信号和槽
        self.button1.clicked.connect(self.bt_transmit_click)

    # 按钮点击事件处理函数
    @Slot()
    def bt_transmit_click(self):
        #创建一个movie对象,用于播放GIF动图
        self.movie = QMovie("./gif/"+self.lineEdit.text()+".gif")
        #在label中设置movie
        self.label.setMovie(self.movie)
        #播放movie
        self.movie.start()

# 主程序
if __name__ == "__main__":
    # 创建一个QApplication对象,它是PySide6应用程序的核心,负责处理事件和管理应用程序的生命周期。
    app = QApplication([])
    # 创建一个MainWindow对象,即主窗口类的实例。
    main_window = MainWindow()
    # 调用主窗口对象的show()方法,将主窗口显示在屏幕上。
    main_window.window.show()
    # 启动应用程序的事件循环,使得应用程序能够响应用户的输入和系统事件,保持运行状态。
    app.exec()

4.4.2 mystroke.py核心代码的解读

第一部分:加载UI程序段。UI文件的加载程序如下所示,把用pyside6 designer设计的界面“mystroke_ui”加载到python程序中来,然后把原UI文件关闭。

    # 加载UI文件
        loader = QUiLoader()
        ui_file = QFile("mystroke_ui.ui")
        if not ui_file.open(QIODevice.ReadOnly):
            print("无法打开UI文件")
            sys.exit(-1)

        # 加载UI文件并实例化为窗口对象
        self.window = loader.load(ui_file)

        # 关闭UI文件
        ui_file.close()

第二部分:获取UI中控件对象程序段。获取UI中控件对象的方法为self.window.findChild ,该方法是一个在 PySide6 中用于查找窗口子部件的方法,它的基本语法是:

childObject = self.window.findChild(class_type, name)

该方法有两个参数,第一个参数是部件的类型,第二个参数是UI上部件的名称。

本文UI上一共有三个部件:一个pushButton,一个lineEdit,一个label,获取的代码如下:

    # 获取UI文件中的小部件对象
        self.button1 = self.window.findChild(QPushButton, "pushButton")
        self.lineEdit = self.window.findChild(QLineEdit, "lineEdit")
        self.label = self.window.findChild(QLabel, "label")

第三部分:信号和槽绑定程序段

PySide6中的信号和槽机制是一种用于对象间通信的机制。信号(Signal)是在特定事件发生时由对象发出的消息,而槽(Slot)是用于接收并处理这些信号的函数。信号和槽机制允许对象在事件发生时进行交互,而不必了解彼此的具体实现,从而实现了低耦合的通信方式。

本例的信号和信号接收槽各有一个,信号就是单击pushButton,槽里的接收函数也只有一个。信号和槽函数绑定的程序如下图所示。

 # 连接信号和槽
        self.button1.clicked.connect(self.bt_transmit_click)

第四部分:槽函数程序段

槽函数bt_transmit_click(self)函数体一共有三行,如图所示。

    # 按钮点击事件处理函数
    @Slot()
    def bt_transmit_click(self):
        #创建一个movie对象,用于播放GIF动图
        self.movie = QMovie("./gif/"+self.lineEdit.text()+".gif")
        #在label中设置movie
        self.label.setMovie(self.movie)
        #播放movie
        self.movie.start()

第一行,给movie设置了GIF动图的地址,这个地址是各字符串形式,由三部分拼接而成。第一部分“./gif/”是指明动图的存放文件夹为“gif”;第二部分self.lineEdit.text(),是取编辑框内文字,也就是动图的名称;第三部分是动图的后缀".gif"。

第二行,使用 setMovie 方法将 QMovie 对象设置到 QLabel 上。

第三行,播放movie,也就是播放GIF动图。

(本文结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2278852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快手极速版如何查找ip归属地?怎么关掉

在数字化时代,个人隐私的保护成为了广大用户关注的焦点。快手极速版作为一款备受欢迎的短视频应用,其IP归属地的显示与关闭功能自然也成了用户热议的话题。本文将详细介绍如何在快手极速版中查找IP归属地以及如何关闭IP属地显示,帮助用户更好…

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

Go语言strings包与字符串操作:从基础到高级的全面解析

Go语言strings包与字符串操作:从基础到高级的全面解析 引言 Go语言以其简洁、高效和强大的标准库而闻名,其中strings包是处理字符串操作的核心工具。本文将深入探讨Go语言中strings包的功能及其在实际开发中的应用,帮助开发者更好地理解和使用这一工具。 1. strings包概述…

基于YOLOv4与Tkinter的口罩识别系统

往期精彩 基于YOLOv11的番茄成熟度实时检测系统设计与实现 用YOLOv11检测美国手语:挥动手腕的科技魔法 基于YOLOv11模型PyQt的实时鸡行为检测系统研究 OpenCV与YOLO在人脸识别中的应用研究(论文源码) 计算机视觉:农作物病虫害检测系统:基于Y…

电力场景红外测温图像绝缘套管分割数据集labelme格式2436张1类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):2436 标注数量(json文件个数):2436 标注类别数:1 标注类别名称:["arrester"] 每个类别标注的框数&am…

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…

电梯系统的UML文档05

Dispatcher 不控制实际的电梯组件,但它在软件系统中是重要的。每一个电梯有一个ispatcher,主要功能是计算电梯的移动方向、移动目的地以及保持门的打开时间。它和系统中除灯控制器以外的几乎所有控制对象交互。 安全装置也是一个环境对象,它…

各种获取数据接口

各种获取数据免费接口 1.音频接口 代理配置 /music-api:{target:https://api.cenguigui.cn/,changeOrigin:true,rewrite:(path)>path.replace(/^\/music-api/,),secure:false}axios全局配置 import axios from axios;const MusicClient axios.create({baseURL: /music-a…

外包公司名单一览表(成都)

大家好,我是苍何。 之前写了一篇武汉的外包公司名单,评论区做了个简单统计,很多人说,在外包的日子很煎熬,不再想去了。 有小伙伴留言说有些外包会强制离职,不行就转岗,让人极度没有安全感。 这…

第十一章 图论

#include <iostream> #include <cstdio> #include <vector>using namespace std;const int MAXN 1000;vector<int> graph[MAXN]; //用向量存储邻接表中的每个点及其连接的的其他点int main(){return 0; } #include <iostream> #include &…

大数据中 TopK 问题的常用套路

大数据中 TopK 问题的常用套路 作者 Chunel Feng&#xff0c;编程爱好者&#xff0c;阿里巴巴搜索引擎开发工程师。开源项目&#xff1a;Caiss 智能相似搜索引擎 对于海量数据到处理经常会涉及到 topK 问题。在设计数据结构和算法的时候&#xff0c;主要需要考虑的应该是当前算…

RabbitMQ基础篇

文章目录 1 RabbitMQ概述1.1 消息队列1.2 RabbitMQ体系结构 2 RabbitMQ工作模式2.1 简单模式&#xff08;Simple Queue&#xff09;2.2 工作队列模式&#xff08;Work Queues&#xff09;2.3 发布/订阅模式&#xff08;Publish/Subscribe&#xff09;2.4 路由模式&#xff08;R…

【人工智能】:搭建本地AI服务——Ollama、LobeChat和Go语言的全方位实践指南

前言 随着自然语言处理&#xff08;NLP&#xff09;技术的快速发展&#xff0c;越来越多的企业和个人开发者寻求在本地环境中运行大型语言模型&#xff08;LLM&#xff09;&#xff0c;以确保数据隐私和提高响应速度。Ollama 作为一个强大的本地运行框架&#xff0c;支持多种先…

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…

社区版Dify实现文生视频 LLM+ComfyUI+混元视频

社区版Dify实现文生视频 LLMComfyUI混元视频 一、 社区版Dify实现私有化混元视频效果二、为什么社区版Dify可以在对话框实现文生视频&#xff1f;LLMComfyUI混元视频 实现流程图&#xff08;重点&#xff09;1. 文生视频模型支持ComfyUI2. ComfyUI可以轻松导出API实现封装3. Di…

SpringBoot的Bean-中级-作用域

5个作用域&#xff1a; 初级演示的是第一种默认的singleton&#xff1a;SpringBoot的Bean-初级获取bean对象-CSDN博客 中级-1&#xff1a;Lazy注解使其在使用的时候再实例化 中级-2&#xff1a;Scope("prototype")使其每次需要注入的时候都实例化新的对象 测试程序&…

放大芯片参数阅读

一、芯片的增益能力 1. GBW&#xff08;增益带宽积&#xff09; 例如&#xff0c;GBW (typ) 1 MHz。 增益带宽积&#xff08;Gain Bandwidth Product&#xff09;是一个关键参数&#xff0c;用于计算在特定频率下的最大增益。 定义公式为&#xff1a; 增益带宽G…