栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python QtGUI与数据可视化编程(一)想写GUI程序?来试试Python Qt吧!

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python QtGUI与数据可视化编程(一)想写GUI程序?来试试Python Qt吧!

✅作者简介:大家好我是五维星空,目前是某国企的一名Java全栈程序员,热爱技术、喜欢代码,希望我的文章能给大家带来收获。

✅个人主页:五维星空的csdn博客

✅系列专栏:Python QtGUI与可视化编程

✅如果觉得博主的文章还不错的话,请三连支持一下博主哦!
或微信搜索“五维星空”关注我吧~
✅参考书目:《Python QtGUI与数据可视化编程》

1. PyQt开发环境搭建 1.1 Python安装

点击链接直接下载Python3.10版本:https://www.python.org/ftp/python/3.10.4/python-3.10.4-amd64.exe

下载太慢?微信搜索“五维星空”,发送“python安装包”获取网盘下载地址。

下载后双击启动安装程序即可(记得勾选add to path)。

1.2 PyQt5安装

打开cmd执行pip3 install pyqt5。

又慢?换源大法送上。如下命令是替换为中科大的源。

pip install pip -U #升级
pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/ #换源
1.3 Qtdesigner安装

这个东西主要是用来设计界面的,没错,就是拖拽控件生成界面,之后执行命令将其转换成Python代码。(喜欢手敲的大佬可以跳过这个工具,over~)

点击链接直接下载Qtdesigner Windows版本:https://build-system.fman.io/static/public/files/Qt%20Designer%20Setup.exe

又又又慢?微信搜索“五维星空”,发送“QtDesigner安装包”获取网盘下载地址。

下载后双击启动安装程序即可。

2. PyQt开发基础 2.1 第一个程序——HelloWorld

基础不牢、语法不会?**问题不大。毛主席都说了,实践是检验真理的唯一标准。**来写一个HelloWorld吧

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

if __name__ == '__main__':
    # 创建APP
    app = QtWidgets.QApplication(sys.argv)
    # 创建窗体
    mainFrame = QtWidgets.QWidget()
    # 设置窗体大小
    mainFrame.resize(800, 200)
    # 设置窗体标题
    mainFrame.setWindowTitle("HelloWorld")
    # 将Label组件绑定到mainFrame上,并设置内容
    labelHello = QtWidgets.QLabel(mainFrame)
    labelHello.setText("Hello World!By 五维星空~")
    # 设置字体
    font = QtGui.QFont()
    # 字体加粗
    font.setBold(True)
    # 字体大小
    font.setPixelSize(26)
    labelHello.setFont(font)
    # 计算Label的合适大小并返回QSize对象
    size = labelHello.sizeHint()
    # 设置labelHello的坐标以及宽高
    labelHello.setGeometry(250, 100, size.width(), size.height())
    # 运行时显示对话框
    mainFrame.show()
    # 启动应用程序
    sys.exit(app.exec_())

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nkfS12K4-1655217489235)(D:WorkSpacemarkdown书imageimage-20220604100945081.png)]

2.2 使用QtDesigner设计窗体

​ 在2.1节我们一起写了一个简单的HelloWorld程序(没搞懂?问题不大,后面敲着敲着就懂了),本节我们使用QtDesigner来做同样的事情。在此之前,我们先通过下面这幅图简单了解一下QtDesigner的界面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-THJKQHan-1655217489236)(D:WorkSpacemarkdown书imageimage-20220604104550848.png)]

好了,接下来正式开始本节的内容。

  1. 打开QtDesigner,按照下图创建程序。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mGwE7yey-1655217489237)(D:WorkSpacemarkdown书imageimage-20220604101808796.png)]

  2. 找到windowTitle属性,输入窗口标题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9yLICjgD-1655217489237)(D:WorkSpacemarkdown书imageimage-20220604101951714.png)]

  3. 找到Label组件,拖拽至窗体位置

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFmrZ1b1-1655217489238)(D:WorkSpacemarkdown书imageimage-20220604102127120.png)]

  4. 双击进入编辑模式,输入HelloWorld! By 五维星空~,调整至合适大小。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Cz3dnTc-1655217489238)(D:WorkSpacemarkdown书imageimage-20220604102301486.png)]

  5. 在右侧对象浏览器中选中label,之后在属性编辑器中找到font属性,选择合适的字体(咳咳,商用注意小心字体侵权~),设置字体大小后记得调整Label大小。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KAt4FsUG-1655217489239)(D:WorkSpacemarkdown书imageimage-20220604102742568.png)]

    可以商用的字体(口水话安排上樂:搜索结果来自互联网,“五维星空”不对该结果的准确性负责~):

    1. 思源字体,可以免费商用的有:思源黑体,思源宋体,思源柔黑体。

    2. 方正字体,方正类字体可以免费商用的有:方正仿宋(简,繁),方正黑体(简,繁),方正楷体( 简繁),方正书宋(简,繁)。

    3. …

  6. 额,忘了调整窗体大小,补上补上~

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLisKWoZ-1655217489240)(D:WorkSpacemarkdown书imageimage-20220604103331425.png)]

  7. 调整Label大小

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIZ9KZQR-1655217489240)(D:WorkSpacemarkdown书imageimage-20220604103717693.png)]

  8. Ctrl+S保存生成helloWorld.ui文件即可。

  9. 在helloWorld.ui文件目录下打开cmd,输入pyuic5 -o ui_HelloWorld.py helloWorld.ui回车后生成python文件。

    pyuic5是PyQt5的工具软件,在1.2小节安装PyQt5的时候它已经安装在D:SoftwarePython310Scripts路径下(注意这是我本地的路径,你的路径应该是你的Python安装位置。)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5sJ9r4Y-1655217489241)(D:WorkSpacemarkdown书imageimage-20220604105000176.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OrtZ4Slc-1655217489241)(D:WorkSpacemarkdown书imageimage-20220604105056282.png)]

    常见问题:

    1. pyuic5报命令不存在?

      小老弟,是不是忘了加环境变量?添加之后记得重启cmd窗口。

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBGFwt20-1655217489242)(D:WorkSpacemarkdown书imageimage-20220604105612257.png)]

    2.3 使用QtDesigner设计的界面

    ​ 在2.1节我们使用QtDesigner生成了一个HelloWorld程序并将它转换成了python代码,本节我们来学习如何使用这份代码。是不是有小伙伴已经运行代码了发现无事发生?不要慌,我们接着往下看。我们先简单了解一下这份文件的内容。

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'helloWorld.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.6
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_Form(object):
        '''注意,此处继承的是object对象而不是QWidget对象'''
        def setupUi(self, Form):
            '''设置ui的函数,Form为程序最外层的组件容器对象'''
            Form.setObjectName("Form") # 设置Form对象名称
            Form.resize(800, 200) # 设置大小
            self.label = QtWidgets.QLabel(Form) # 在Form上定义一个Label
            self.label.setGeometry(QtCore.QRect(250, 100, 420, 35)) # 定义Label位置
            font = QtGui.QFont() # 定义字体
            font.setFamily("楷体")
            font.setPointSize(26)
            font.setBold(True)
            font.setWeight(75)
            self.label.setFont(font) # 设置Label字体
            self.label.setTextFormat(QtCore.Qt.AutoText) # 格式化处理
            self.label.setObjectName("label") # 设置Label对象名称
    
            self.retranslateUi(Form) # 自定义方法
            QtCore.QMetaObject.connectSlotsByName(Form) # 通过名称关联信号与插槽
    
        def retranslateUi(self, Form):
            '''设置Form的UI属性'''
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "HelloWorld"))
            self.label.setText(_translate("Form", "HelloWorld! By 五维星空~"))
    

    怎么样?是不是跟咱们手写的代码很类似,里面关于信号与插槽部分后面章节会讲,大家只需要大致了解这份文件的风格即可(QtDesigner会有一个继承object的类进行了ui的一些设置)。

    常见的有三种方式使用这份代码文件。

    1. 方式一:直接法(不推荐)

      import sys
      
      from PyQt5 import QtCore, QtGui, QtWidgets
      from ui_HelloWorld import Ui_Form
      
      if __name__ == '__main__':
          app = QtWidgets.QApplication(sys.argv)
          container = QtWidgets.QWidget()
          form = Ui_Form()
          form.setupUi(container)  # 将最外层组件容器对象传入
          container.show()
          sys.exit(app.exec_())
          
      

      缺点:耦合性太高。

    2. 方式2:多继承(不推荐)

      import sys
      
      from PyQt5.QtWidgets import QApplication, QWidget
      from ui_HelloWorld import Ui_Form
      
      
      class MyWidget(QWidget, Ui_Form):
          """多继承"""
      
          def __init__(self):
              # 在多继承时,super()的得到的是第一个基类,在此处就是QWidget。
              super().__init__()  # 调用父类构造函数,创建窗体。
              self.labTip = "多继承"  # 新定义一个变量
              self.setupUi(self)  # 将当前类(QWidget的子类)传入
              self.label.setText(self.labTip)  # 设置label内容
      
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          container = MyWidget()
          container.show()
          sys.exit(app.exec_())
      
      

      缺点:MyWidget自己的属性和Ui_Form的属性混在一起了,不易区分。

    3. 方式3:单继承(推荐)

    import sys
    
    from PyQt5.QtWidgets import QApplication, QWidget
    from ui_HelloWorld import Ui_Form
    
    
    class MyWidget(QWidget):
        """单继承"""
    
        def __init__(self, parent=None):
            super().__init__(parent)  # 调用父类构造函数,创建窗体
            self.__ui = Ui_Form()  # 创建ui对象
            self.__ui.setupUi(self)  # 设置父窗体
            self.labTip = "单继承"  # 自定义属性
            self.__ui.label.setText(self.labTip)  # 设置ui内的属性
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        container = MyWidget()
        container.show()
        sys.exit(app.exec_())
    

    优点:MyWidget自己的属性和Ui_Form的属性易区分。

    字体显示有问题的小伙伴,请将ui转的python文件中的font.setPointSize(26)改为font.setPixelSize(26)。QtDesigner中没有setPixelSize属性,应该是QtDesigner和python版本不一致问题导致的吧,具体原因没有深究,有兴趣的小伙伴可以评论区讨论哦。

✅我是五维星空,一名Java全栈开发者,热爱技术,感谢各位大大的点赞、收藏和评论,我们下期再见!

微信搜索“五维星空”关注我吧~

by 五维星空-分享前后端技术

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971457.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号