因在项目的进程中需要开发一个GUI程序,故开始对GUI编程进行学习,选择使用基于Python的PyQt5框架或者C++的MFC框架进行开发,大致了解后选择PyQt5框架进行开发,至于MFC。。。择日再学(明日复明日?)。故在此记录一些学习进程并分享个人拙见,以便之后温故知新,也欢迎各位读者指正!
言归正转。GUI是用户图形界面程序的简称,开发GUI的方法有很多,由于Python的快速普及和发展,利用PyQt5框架进行开发是性价比很高的一个选择。
基本环境:Windows 10 专业版、Python 3.7、编辑器选择:Pycharm
PyQt5对Python是一个第三方包,需要下载(如果你是Anaconda好像自带了PyQt5模块),可在cmd中使用pip直接对其进行安装,除此之外,还需安装一个叫pyqt5-tools的模块,若想安装汉化或嫌下载速度太慢,可使用国内的源进行下载。(注意:pip下载pyqt5-tools时均为小写)
具体可参照博客:https://blog.csdn.net/AzureMouse/article/details/90338961
PyQt5的简单使用:
先来看一个简单的demo。
import sys
from PyQt5.QtWidgets import QApplication,QWidget
if __name__ == '__main__':
# 创建一个程序的类
app = QApplication(sys.argv)
# 创建一个空的窗口
w = QWidget()
# 改变窗口的尺寸
w.resize(1000,600)
# 移动窗口位置(基于电脑屏幕的中心)
w.move(300,300)
# 设置窗口的名字
w.setWindowTitle("first")
# 显示窗口
w.show()
# GUI程序运行的基本主循环
sys.exit(app.exec_())
这个程序运行后会产生一个简单的空白窗口。其中:参数sys.argv是指:sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键,所以那些试图从代码来说明它作用的解释一直没看明白。因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。sys.exit(app.exec_()):app.exec_()的存在使得,软件不会闪退。为什么会这样,是因为app.exec_()的含义是,最后一个窗口关闭后,程序才停止。(引自CSDN博客)
基于PyQt5模块可以用代码直接的产生对话窗口,但是单纯的只靠代码创建一个GUI程序其工作量过于巨大,所以使用QTdesigner进行辅助开发。
程序界面如下:
左边为工具箱,可向创建后的窗口(若关闭对话可使用:文件-新建-创建)拖动控件进行GUI窗口的可视化开发,如此便比直接用代码生成GUI程序更加高效。
将QTdesigner添加到Pycharm(在Pycharm中打开QTdesigner软件)
步骤为:File - Settings - Tools - External Tools 点击加号进行配置:
其中:Name是你给你添加的工具取的名字,Description是对其的描述,可各自进行设置。至于下面三个参数可参考如下:
配置格式转化工具(将.ui文件转化为.py文件)
使用QTdesigner创建的文件为ui格式的文件,需将其转化为py文件才可进行后期的GUI程序开发
这里推荐两种转化方式:方法一:cmd 命令行转到文件对应路径,使用对应命令方法:
python -m PyQt5.uic.pyuic test.ui -o test1.py
(转文件路径没有反应时可以使用:cd /d D:\ )
方法二:配置到Pycharm中直接转化,仍是配置额外工具(同上),参数参考如下:
Program D:\PycharmProject\venv\Scripts\python.exe
Arguments -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
Working Directory D:\PycharmProject\pythonGUI\pyqt5
设置完成后即可在Pycharm直接使用扩展工具,此处提醒两点:1.Program中的python路径的环境所包含的模块中应包含PyQt5,比如:你的PyQt5在文件夹Anaconda中,而你的python运行环境却是官方基础python(只有基础模块),这类情况转化会失败,应选择含PyQt5模块的python.exe,或者将PyQt5整个文件夹复制到你选择的python环境的:venv\Lib\site-packages;2.只能对设置的working Directory路径下的文件进行转化。
使用扩展工具:右键选择External Tools即可直接使用,在对ui进行转化时切记一定要选择中文件再单击右键选择扩展工具,否则会出错。选中ui文件右键使用PyUIC工具即可在同目录下生成一个同名py文件。
可视化进行窗口设计:
保存到工程目录:
自动转化出来的demo1.py文件如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'demo1.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# 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_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(30, 170, 112, 34))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(30, 250, 112, 34))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(50, 320, 112, 34))
self.pushButton_3.setObjectName("pushButton_3")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(280, 220, 105, 22))
self.checkBox.setObjectName("checkBox")
self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
self.radioButton.setGeometry(QtCore.QRect(280, 300, 132, 22))
self.radioButton.setObjectName("radioButton")
self.commandLinkButton = QtWidgets.QCommandLinkButton(self.centralwidget)
self.commandLinkButton.setGeometry(QtCore.QRect(280, 140, 263, 52))
self.commandLinkButton.setObjectName("commandLinkButton")
self.toolButton = QtWidgets.QToolButton(self.centralwidget)
self.toolButton.setGeometry(QtCore.QRect(470, 340, 52, 24))
self.toolButton.setObjectName("toolButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 30))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.pushButton_2.setText(_translate("MainWindow", "PushButton"))
self.pushButton_3.setText(_translate("MainWindow", "PushButton"))
self.checkBox.setText(_translate("MainWindow", "CheckBox"))
self.radioButton.setText(_translate("MainWindow", "RadioButton"))
self.commandLinkButton.setText(_translate("MainWindow", "CommandLinkButton"))
self.toolButton.setText(_translate("MainWindow", "..."))
编写运行程序
import sys
import demo1
from PyQt5.QtWidgets import QApplication,QMainWindow
if __name__ == "__main__":
# 设置一个空类,建立一个空窗口mainW
app = QApplication(sys.argv)
mainW = QMainWindow()
# 要对窗口进行设置,增减控件和增减功能等,这些功能都有由类:Ui_MainWindow进行完成
ui = demo1.Ui_MainWindow()
# 类中的函数setupUi(self, MainWindow): 参数是指需要一个窗口作为参数,即需要往哪个窗口上添加控件
# 此出选择的窗口是先前建立的空白窗口mainW,即在mainW上添加控件
ui.setupUi(mainW)
# 显示窗口
mainW.show()
# GUI程序运行主循环
sys.exit(app.exec_())
运行结果为:
欢迎各位读者在评论区批评指正!!!