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打開圖片文件並顯示在圖片顯示欄中。