您现在的位置是:首页 > 技术教程 正文

Python——GUI界面编程(一)

admin 阅读: 2024-03-25
后台-插件-广告管理-内容页头部广告(手机)

小序

有的时候想一想曾经的那些人和事,
时时嘴角上扬,
是过去太值得留恋,
还是经历的是最美好的生活与青春

今天来谈一谈GUI编程,好久前发的一个资源,得到了大家的一些认可
这次正好好好地说一下GUI编程的事情

目录

  • 小序
  • 正文
    • GUI简介
    • PyQt 安装
      • 安装 PyQt5 和 PyQt5-tools
      • 配置环境变量
    • PyQt——GUI设计
      • layout布局
      • 信号与槽
        • 编写槽函数
        • 总结:
        • 样例
    • 小结
  • 结束语

正文

GUI简介

在这里插入图片描述

GUI 即图形用户界面,今天说一下曾经实现的Python - GUI 编程,使用QtDesigner 实现PyQt 编程

Qt包括一个图形用户界面设计器Qt Designer。PyQt能够从Qt Designer生成Python代码,还可以添加使用Python编写的新的GUI控件到Qt Designer

PyQt常用的几个模块
(1) QtCore模块:Qt Core类提供核心的非GUI功能,所有模块都需要这个模块。
(2) QtGui模块:提供 GUI 程序的基本功能,Qt Gui 模块提供的是所有图形用户界面程序都需要的通用功能。
(3) QtWidgets模块:包含提供一组UI元素,以创建用户界面。
(4) QtNetWork模块:包含用于网络编程的类。
(5) QtXml模块:包含用于处理XML文件的类。
(6) QtOpenGL模块:渲染使用OpenGL库创建的3D或2D图形。
(7) QtSql模块:该模块提供了用于操作数据库的类。

PyQt 安装

安装 PyQt5 和 PyQt5-tools

pip install PyQt5
  • 1
pip install PyQt5-tools
  • 1

配置环境变量

  1. 右击我的电脑->属性->高级->环境变量
    用户变量:新建->变量名:QT_QPA_PLATFORM_PLUGIN_PATH
    变量值:C:\azcx\python\Lib\site-packages\PyQt5\Qt\plugins
    (配置环境变量)
    系统变量:path->编辑->添加
    C:\azcx\python\Lib\site-packages\PyQt5\Qt\plugins
  2. 配置QtDesigner
    打开Pycharm->文件->设置->工具->外部工具
    点击右上角的加号:在设置中,Program(程序)选择PyQt安装目录中designer.exe 路径;Work directory(工作目录)使用变量 F i l e D i r FileDir FileDir
    在这里插入图片描述
  3. 配置 PyUIC
    在设置中,Program(程序)写入python.exe的路径; Parameters(参数)写入
-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
  • 1
Work directory(工作目录)使用变量 $FileDir$
  • 1

在这里插入图片描述
4. 可以通过打开Pycharm->工具->External Tools 打开QtDesigner
在这里插入图片描述

PyQt——GUI设计

使用PyQt进行Python GUI设计
可以直接使用代码设计界面,
也可以先使用Qt Designer进行可视化设计,然后将生成的.ui文件转换成.py文件。使用Qt Designer,可以方便地创建复杂的GUI界面。

利用PyQt创建一个Python GUI一般需要以下几个步骤:(具体内容可以看官方文档)
(1) 使用Qt Designer或代码创建GUI界面;
(2) 在属性编辑器中修改部件的属性;
(3) 使用pyuic工具生成一个python类;
(4) 适当修改GUI对应的python类;
(5) 编写所需的slots(槽函数),并建立信号和槽的连接,运行程序

简单程序示例

from PyQt5 import QtWidgets class MyWindow(QtWidgets.QWidget): #定义窗体类 def __init__(self): #构造函数 super(MyWindow,self).__init__() import sys app=QtWidgets.QApplication(sys.argv) # sys.argv从程序外部获取参数,因为图形编程有时也需要从命令行传递参数给程序 window=MyWindow() window.show() sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面是一个简单的窗口程序,实现效果如下
在这里插入图片描述

layout布局

可以在QtDesigner 中选择需要的布局形式,具体如下所示
在这里插入图片描述
当如上图完成后,即可保存为 .ui 格式的文件,之后利用PyUIC进行转换
在这里插入图片描述
在这里插入图片描述
Ui_Form类默认继承的object类

信号与槽

在GUI编程,当用户改变了一个控件的状态(如按下按钮),此时需要通知另外的控件,也就是实现对象之间的通信,在QT中使用信号与槽的机制来实现
可以说,信号与槽是GUI编程的核心
Attention !
信号只能定义成类变量,在类的最上面声明,而不能定义成对象变量,最直观的就是在定义信号时,没有self

当对象改变其状态时,信号就由该对象发射(emit)出去,并且对象只负责发送信号。 槽用于接收信号,并且槽只是普通的对象成员函数。一个槽并不知道是否有其他信号与自己相连接。 两者通过Qobject对象的connect 绑定

(1) 一个信号可以连接到多个槽,当信号发出后,槽函数都会被调用,但是调用的顺序是随机的

self.pushButton.clicked.connect(self.firtPyQt5_button_click) self.pushButton.clicked.connect(self.firtPyQt5_button_click_2)
  • 1
  • 2

同一个按钮的单击信号分别和槽(函数)firtPyQt5_button_click()、firtPyQt5_button_click_2()相连,当单击“pushButton”控件时,两个函数都被调用

(2)多个信号可以连接到同一个槽,其中任何一个信号发出,槽函数都会被执行

self.buttonOn.clicked.connect(self.showMessage) self.buttonOff.clicked.connect(self.showMessage)
  • 1
  • 2

showMessage()函数同时绑定在两个button的clicked信号上,单击任何一个按钮都将自行showMessage()函数

(3)信号和槽的连接可以被移除,PyQt5提供了disconnect()成员函数来进行解绑

self.pushButton1.clicked.disconnect(self.pushButton.clicked) self.pushButton.clicked.disconnect(self.firtPyQt5_button_click_2)
  • 1
  • 2

信号与槽设置

  1. Edit->Edit Signals/slots
  2. 选中一个控件,拖动鼠标左键
    在这里插入图片描述
编写槽函数
class Ui_Form(object): def setupUi(self, Form): ... self.pushButton.clicked.connect(self.pushButton_2.hide) def retranslateUi(self, Form): ... if __name__=="__main__": import sys app=QtWidgets.QApplication(sys.argv) widget=QtWidgets.QWidget() Ui=Ui_Form() Ui.setupUi(widget) widget.show() sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

from PyQt5 import QtWidgets from signal_slot import Ui_Form import sys class My_signal_slot(QtWidgets.QWidget,Ui_Form): def __init__(self): super(My_signal_slot, self).__init__() self.setupUi(self) #加载窗体 self.pushButton.clicked.connect(self.prn) def prn(self): print("打印测试") if __name__=="__main__": app=QtWidgets.QApplication(sys.argv) main=My_signal_slot() #创建实例 main.show() #使用QWidget的show()方法 sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

总结:
  1. PyQt 信号定义与使用
from PyQt5 import QtCore,QtWidgets #引入模块 # 创建自定义信号,只能定义成类变量 class Signaltest(QtWidgets.QWidget): # 创建信号 mySignal_1 = QtCore.pyqtSignal() # 创建带有str类型参数的信号 mySignal_2 = QtCore.pyqtSignal(str)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. PyQt 槽函数定义与使用
def Slot_mySignal_1(self): #对应的信号无参 pass def Slot_mySignal_2(self, str): #对应的信号有str类型的参数 pass
  • 1
  • 2
  • 3
  • 4
  1. 关联信号与槽
self.mySignal_1.connect(self.Slot_mySignal_1) self.mySignal_2.connect(self.Slot_mySignal_2)
  • 1
  • 2
  1. 发送信号
# 无参数 self.mySignal_1.emit() # 有参数 self.mySignal_2.emit(str)
  • 1
  • 2
  • 3
  • 4
样例
from PyQt5 import QtWidgets,QtCore from def_signal_lot import Ui_Form import sys class Signaltest(QtWidgets.QWidget,Ui_Form): mySignal_1 = QtCore.pyqtSignal() #定义无参数信号 mySignal_2 = QtCore.pyqtSignal(str) #定义参数信号 def __init__(self): super().__init__() self.setupUi(self) #信号与槽链接 self.pushButton.clicked.connect(self.pushbutton_print) self.mySignal_1.connect(self.Slot_mySignal_1) self.mySignal_2.connect(self.Slot_mySignal_2) def pushbutton_print(self): print("点击按钮") self.mySignal_1.emit() #发送不带参数信号 self.mySignal_2.emit("test signal2")#发送带参数信号 def Slot_mySignal_1(self): #槽函数的定义 print("test signal1") def Slot_mySignal_2(self, str):#槽函数的定义 print(str) if __name__=="__main__": app=QtWidgets.QApplication(sys.argv) mytest=Signaltest() mytest.show() sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

小结

今天只是简单的介绍一下Python—GUI编程的一些环境配置和基础的信号与槽的操作,其他的内容后续会陆续分享,欢迎感兴趣的友友持续关注。

此外,本文上面绑定的资源为Python—GUI 的应用实现
(Python学生信息管理系统GUI编程),里面有更多的实践与应用
感兴趣的欢迎下载,讨论

结束语

斜阳洒在了窗前,
夕阳也是幸福的,
在醒着的时间里,
去追寻生命中有意义的事吧,
去找寻属于自己的那束光~

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索