emmm, 前段时间上课有个小作业,需要制作一个界面用来搭载深度学习模型,由于是python写的tensorflow,所以就用python做个简单的GUI。
这里推荐PyQt5进行界面编写。
关于PyQt的一些坑:
1,由于只是制作一些简单的界面,所以并不推荐使用Qtdesigner以及Qt。原因:首先安装复杂,其次pycharm收费。留学党用个盗版会被查,所以就不冒这个风险了。
2,关于C++,java等界面转python界面,虽然有各种不同种类的类似MFC的拖拽流界面编辑,但转python总会出问题,而对于没有学习过pyqt5或者python GUI的人来说,自己写比调BUG更简单。
3,关于pyqt5封装成.exe文件,如果用的是沙箱例如anaconda之类云云,或者不用沙箱,直接下载安装一个python3的IDLE,windows电脑点图标就能直接运行文件,比封装方便多了,而且更便于演示。mac的话就算封装了也打不开。
下面进入正题:
-
PyQt5 安装
很简单,直接pip3 install pyqt5
如果对版本有要求的话:
pip3 install pyqt5==5.8 等等。
安装成功的话,import PyQt5 不报错,注意大小写。 -
个人推荐sublime,第一个界面程序。
pyqt5 主窗口,直接copy就行了。
// 主界面
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
#* from PyQt5.QtGui import QIcon
class Ui_mainWindow(object):
def setupUi(self, mainWindow):
mainWindow.setObjectName("mainWindow")
mainWindow.setWindowModality(QtCore.Qt.WindowModal)
mainWindow.resize(100,100)#可拖拽,界面大小
# mainWindow.setFixedSize(100,100)#不可拖拽,界面大小
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "主界面标题"))
#* mainWindow.setWindowIcon(QIcon('图片.png'))
#* 在主界面标题前面插入图片,需要图片和程序在同一路径。
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
ui = Ui_mainWindow()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec_())
以后所有的操作都是在这个界面上进行添加的,由于没有什么图片,就不弄icon了。
如果需要添加icon,加上带有*的代码就行,在此不做赘述。
- 添加按钮
这段代码,需要多少个按钮,复制粘贴几次就行,注意修改按钮前缀标注。
self.pushButton = QtWidgets.QPushButton(self.centralWidget)
self.pushButton.setGeometry(QtCore.QRect(10, 10, 10, 60))
#坐标为 按钮的(X,Y)坐标以及(A,B)按钮宽度和高度。
self.pushButton.setObjectName("界面按钮显示文字")
self.pushButton.setText("按钮")
// 按钮
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
#* from PyQt5.QtGui import QIcon
class Ui_mainWindow(object):
def Ui(self, mainWindow):
mainWindow.setObjectName("mainWindow")
mainWindow.setWindowModality(QtCore.Qt.WindowModal)
mainWindow.resize(200,200)
self.centralWidget = QtWidgets.QWidget(mainWindow)
self.centralWidget.setObjectName("centralWidget")
self.pushButton1 = QtWidgets.QPushButton(self.centralWidget)
self.pushButton1.setGeometry(QtCore.QRect(10, 10, 100, 60))
self.pushButton1.setObjectName("button1")
self.pushButton1.setText("按钮1")
self.pushButton2 = QtWidgets.QPushButton(self.centralWidget)
self.pushButton2.setGeometry(QtCore.QRect(10, 100, 100, 60))
self.pushButton2.setObjectName("button1")
self.pushButton2.setText("按钮2")
mainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "主界面标题"))
#* mainWindow.setWindowIcon(QIcon('图片.png'))
#* 在主界面标题前面插入图片,需要图片和程序在同一路径。
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
ui = Ui_mainWindow()
ui.Ui(mainWindow)
mainWindow.show()
sys.exit(app.exec_())
一点可能会用到的功能:
1,self.pushButton.setFlat(True) 算是一个按钮事件,但是内嵌了代码,直接调用就好,这行代码是说当某个按钮被按住时,Ture表示被按住。如果设置了其他按钮设置,会在按钮被按下时直接显示,一般情况不显示。
2,按钮中文本的字体改变等等依次是,字体格式,加粗,大小,颜色,下划线。
3,修改按钮底色背景色等等
4,按钮前加入icon,类似于主窗口的icon
font = QtGui.QFont()
font.setFamily('微软雅黑')
font.setBold(True)
font.setPointSize(13)
font.setWeight(75)
self.pushButton1.setFont(font)
self.pushButton1.setFlat(True)
self.pushButton1.setStyleSheet("background-color: rgb(164, 185, 255);"
"border-color: rgb(170, 150, 163);"
"font: 75 12pt \"Arial Narrow\";"
"color: rgb(126, 255, 46);")
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.pushButton1.setIcon(icon)
self.pushButton1.setIconSize(QtCore.QSize(10, 10))
self.pushButton1.setAutoRepeatDelay(50)
- 添加label
label翻译为标签,不是特别准确,他不是一个窗口最上方的那一条控件。而是窗口中的文本或者图片视频,都可以用label来进行添加。但一般使用是添加文字标注,图片一般会使用graphicsView,接下来会讲。
首先定义一个标签
self.label = QtWidgets.QLabel(self.centralWidget)
self.label.setGeometry(QtCore.QRect(10, 0, 100, 60))
self.label.setText("标签显示文字")
self.label.setObjectName("label")
结合第三节中的按钮,我们给两个按钮上放加上lable的文字说明:
//标签
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_mainWindow(object):
def Ui(self, mainWindow):
mainWindow.setObjectName("mainWindow")
mainWindow.setWindowModality(QtCore.Qt.WindowModal)
mainWindow.resize(200,200)
self.centralWidget = QtWidgets.QWidget(mainWindow)
self.centralWidget.setObjectName("centralWidget")
self.pushButton1 = QtWidgets.QPushButton(self.centralWidget)
self.pushButton1.setGeometry(QtCore.QRect(10, 30, 100,60))
self.pushButton1.setObjectName("button1")
self.pushButton1.setText("按钮1")
self.label1 = QtWidgets.QLabel(self.centralWidget)
self.label1.setGeometry(QtCore.QRect(30, 0, 100, 60))
self.label1.setText("这是按钮1")
self.label1.setObjectName("label1")
self.pushButton2 = QtWidgets.QPushButton(self.centralWidget)
self.pushButton2.setGeometry(QtCore.QRect(10, 120, 100, 60))
self.pushButton2.setObjectName("button1")
self.pushButton2.setText("按钮2")
self.label2 = QtWidgets.QLabel(self.centralWidget)
self.label2.setGeometry(QtCore.QRect(30, 90, 100, 60))
self.label2.setText("这是按钮2")
self.label2.setObjectName("label2")
mainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "主界面标题"))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
ui = Ui_mainWindow()
ui.Ui(mainWindow)
mainWindow.show()
sys.exit(app.exec_())
- 添加一个图片打开窗口。
graphicsView是一个图片打开窗口,设置了窗口大小之后,打开的图片大小只能被放置在这个窗口中。
self.graphicsView1 = QtWidgets.QGraphicsView(self.centralWidget)
self.graphicsView.setGeometry(QtCore.QRect(10, 90, 100, 100))
self.graphicsView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.graphicsView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.graphicsView.setObjectName("graphicsView")
第三节和第四节一起
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_mainWindow(object):
def Ui(self, mainWindow):
mainWindow.setObjectName("mainWindow")
mainWindow.setWindowModality(QtCore.Qt.WindowModal)
mainWindow.resize(200,200)
self.centralWidget = QtWidgets.QWidget(mainWindow)
self.centralWidget.setObjectName("centralWidget")
self.pushButton1 = QtWidgets.QPushButton(self.centralWidget)
self.pushButton1.setGeometry(QtCore.QRect(10, 30, 100,60))
self.pushButton1.setObjectName("button1")
self.pushButton1.setText("按钮1")
self.label1 = QtWidgets.QLabel(self.centralWidget)
self.label1.setGeometry(QtCore.QRect(30, 0, 100, 60))
self.label1.setText("这是按钮1")
self.label1.setObjectName("label1")
self.graphicsView1 = QtWidgets.QGraphicsView(self.centralWidget)
self.graphicsView1.setGeometry(QtCore.QRect(10, 90, 100, 100))
self.graphicsView1.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.graphicsView1.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.graphicsView1.setObjectName("graphicsView")
mainWindow.setCentralWidget(self.centralWidget)
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "主界面标题"))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
ui = Ui_mainWindow()
我们将在下一节讲解按钮的触发事件。
使用按钮1打开图片文件并显示在图片显示栏中。