首先聲明個人開發環境是windows+anconda,pyqt使用的是anconda自帶的,沒有單獨再安裝pyqt,下面上pyqt的代碼,具體怎麼實現就不研究了,咱們這裏只研究下怎麼使用pyinstaller打包這個程序css
import sys from PyQt5 import QtWidgets from PyQt5.QtGui import QFont,QIcon#QtWidgets不包含QFont必須調用QtGui from PyQt5 import QtGui,QtCore import random class MessageBox(QtWidgets.QWidget):#繼承自父類QtWidgets.QWidget CloseAllowed=0 def __init__(self,parent = None):#parent = None表明此QWidget屬於最上層的窗口,也就是MainWindows. QtWidgets.QWidget.__init__(self)#由於繼承關係,要對父類初始化 #經過super初始化父類,__init__()函數無self,若直接QtWidgets.QWidget.__init__(self),括號裏是有self的 self.setGeometry(300, 300, 800,800) # setGeometry()方法完成兩個功能--設置窗口在屏幕上的位置和設置窗口自己的大小。它的前兩個參數是窗口在屏幕上的x和y座標。後兩個參數是窗口自己的寬和高 #self.resize(1000, 500) # 設置窗體大小,本行無關緊要。 self.center()#自定義一個居中的函數 self.setFixedSize(self.width(),self.height());#PyQT禁止調整窗口大小和窗口最大化按鈕 #self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)#PyQT禁止窗口最大化按鈕和關閉按鈕 self.setWindowTitle(u'追夢少年') # 僅僅設置窗體標題,不設置位置。 self.setWindowIcon(QIcon('rose.png')) # 調用QIcon構造函數時,咱們須要提供要顯示的圖標的路徑(相對或絕對路徑)。同時注意:使用QIcon類型必須導入此模塊from PyQt5.QtGui import QIcon self.setToolTip(u'追夢少年')#調用setToolTip()方法,該方法接受富文本格式的參數,css之類。 QtWidgets.QToolTip.setFont(QFont('華文楷體', 10))#設置字體以及字體大小 self.label1 = QtWidgets.QLabel(u'<b>小姐姐,觀察你好久了!</b>', self) # 創建一個標籤 self.label1.move(150, 40) # 使此標籤移動到這個部件(260,40)的位置 self.label1.setFont(QFont("Timers", 20));#設置字體與字體大小 self.label2= QtWidgets.QLabel(u'<b>作我女友好很差?</b>', self) # 創建一個標籤 self.label2.move(150, 100) # 使此標籤移動到這個部件(260,100)的位置 self.label2.setFont(QFont("Timers", 20));#設置字體與字體大小 #Qt中提供的調色板QPalette類就是專門用於管理控件的外觀顯示。QPalette類至關於對話框或控件的調色板,管理着控件和窗體的全部顏色。 #每一個窗體和控件都包含一個QPalette對象,在顯示時,對其作相應的設置便可 self.window_pale = QtGui.QPalette()#實例化QPalette類 self.window_pale.setBrush(self.backgroundRole(), QtGui.QBrush(QtGui.QPixmap(r"biu.jpg")))#打開圖片 self.setPalette(self.window_pale)#應用背景色 # setStyleSheet來設置圖形界面的外觀 self.buttonOK = QtWidgets.QPushButton(u'贊成',self) # 由於須要增長按鈕,因此咱們引入了QPushButton類,該按鈕是QPushButton類的一個實例。構造函數的第一個參數是按鈕的標籤。第二個參數是父窗口小部件。父窗口小部件是示例窗口小部件,它是經過QWidget繼承的 self.buttonOK.setFocusPolicy(QtCore.Qt.NoFocus)#按鈕無焦點 # Qt::TabFocus 0x1 接受Tab鍵焦點 # Qt::ClickFocus 0x2 接受鼠標單擊作焦點 # Qt::StrongFocus TabFocus | ClickFocus | 0x8 接受Tab鍵和鼠標單擊作焦點 # Qt::WheelFocus StrongFocus | 0x4 滑輪做爲焦點選中事件 # Qt::NoFocus 0 不接受焦點 self.buttonOK.move(50, 700) # move()方法來指定部件的放置座標,座標的頂點就是窗口的左上角 self.buttonOK.clicked.connect(self.showDialogOK) self.buttonE = QtWidgets.QPushButton(u'考慮考慮',self) # 由於須要增長按鈕,因此咱們引入了QPushButton類,該按鈕是QPushButton類的一個實例。構造函數的第一個參數是按鈕的標籤。第二個參數是父窗口小部件。父窗口小部件是示例窗口小部件,它是經過QWidget繼承的 self.buttonE.setFocusPolicy(QtCore.Qt.NoFocus) # 按鈕無焦點 # Qt::TabFocus 0x1 接受Tab鍵焦點 # Qt::ClickFocus 0x2 接受鼠標單擊作焦點 # Qt::StrongFocus TabFocus | ClickFocus | 0x8 接受Tab鍵和鼠標單擊作焦點 # Qt::WheelFocus StrongFocus | 0x4 滑輪做爲焦點選中事件 # Qt::NoFocus 0 不接受焦點 self.buttonE.move(330, 700) # move()方法來指定部件的放置座標,座標的頂點就是窗口的左上角 self.buttonE.clicked.connect(self.showDialogEE) self.buttonNO = QtWidgets.QPushButton(u'拒絕',self) # 由於須要增長按鈕,因此咱們引入了QPushButton類,該按鈕是QPushButton類的一個實例。構造函數的第一個參數是按鈕的標籤。第二個參數是父窗口小部件。父窗口小部件是示例窗口小部件,它是經過QWidget繼承的 self.buttonNO.setFocusPolicy(QtCore.Qt.NoFocus) # 按鈕無焦點 # Qt::TabFocus 0x1 接受Tab鍵焦點 # Qt::ClickFocus 0x2 接受鼠標單擊作焦點 # Qt::StrongFocus TabFocus | ClickFocus | 0x8 接受Tab鍵和鼠標單擊作焦點 # Qt::WheelFocus StrongFocus | 0x4 滑輪做爲焦點選中事件 # Qt::NoFocus 0 不接受焦點 self.buttonNO.move(610, 700) # move()方法來指定部件的放置座標,座標的頂點就是窗口的左上角 self.buttonNO.clicked.connect(self.showDialogNO) def showDialogOK(self): QtWidgets.QMessageBox.information(self, "歐耶", "愛你,麼麼麼麼麼麼麼噠~~~", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information (self, "歐耶", "餘生請許太太多多指教~~~", QtWidgets.QMessageBox.Ok) self.CloseAllowed = 1 def showDialogEE(self): QtWidgets.QMessageBox.information(self, "別糾結了", "你完了,你媽讓你嫁給我", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "你爸也是這麼說的", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "你奶奶也讓你嫁給我", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "你哥哥也贊成了,你全家都贊成", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "你閨蜜說嫁給我沒錯", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "你爸說不一樣意就打你", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "接受現實吧,我會對你好的", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "你都是個人人了", QtWidgets.QMessageBox.Ok) QtWidgets.QMessageBox.information(self, "別糾結了", "我發誓我會一生只愛你", QtWidgets.QMessageBox.Ok) def showDialogNO(self): self.q = random.randint(0, 650) # 在0-650內生成隨機的X座標 self.w = random.randint(150, 650) # 在150-650內生成隨機的Y座標 self.buttonNO.move(self.q, self.w) #enterEvent事件PyQt自動運行,無需調用 # def enterEvent(self,event):#重寫了鼠標的enterEvent事件,因爲繼承了窗口類,鼠標一進入主窗口便會出發此函數 # self.q=random.randint(0,650)#在0-650內生成隨機的X座標 # self.w=random.randint(150,650)#在150-650內生成隨機的Y座標 # self.buttonNO.move(self.q,self.w) #當咱們關閉一個窗口時,在PyQt中就會觸發一個QCloseEvent的事件,正常狀況下會直接關閉這個窗口, #可是咱們不但願這樣的事情發生,因此咱們須要從新定義QCloseEvent,函數名稱爲closeEvent不可變 def closeEvent(self,event):#函數名固定不可變 if self.CloseAllowed==1: event.accept()#關閉窗口 else: QtWidgets.QMessageBox.information(self, "未做迴應", "小姐姐,請不要逃避!", QtWidgets.QMessageBox.Ok) event.ignore()#忽視點擊X事件 def center(self): screen=QtWidgets.QDesktopWidget().screenGeometry()#獲取屏幕分辨率 #QtWidgets.QDesktopWidget().screenGeometry()中QDesktopWidget()也有括號 size=self.geometry()#獲取窗口尺寸 self.move((screen.width()-size.width())/2,(screen.height()-size.height())/2)#利用move函數窗口居中 app=QtWidgets.QApplication(sys.argv) window=MessageBox() window.show() sys.exit(app.exec_())
注意:裏面有一張圖片是biu.png,要和次代碼放在同一個目錄下,若是不是同一個目錄須要修改此處的路徑,圖片以下:python
pip install pyinstaller
pyinstaller --version
顯示版本號 則證實安裝成功windows
這是以我本地環境爲例子的,若是你目錄和我不一樣請注意修改,而且找到platforms所在的目錄,加入環境變量中bash
注意:必須將加入該環境變量,不然打包後的程序執行時候報錯
This application failed start because it could not find or load the Qt platform plugin "windows inapp
pyinstaller -F -w demo.py
-F:打包爲單文件dom
-w:Windows程序,不顯示命令行窗口,可是若是程序有命令行輸入或輸出,不要帶此項參數!函數
demo.py:要打包成exe文件的腳本文件字體
執行完以後,發如今當前目錄下生成了兩個新目錄:build、dist以及一個文件:demo.spec,demo.spec都是pyinstaller在打包過程當中產生的中間文件,而dist目錄中則能夠看到生成了一個名爲demo.exe的可執行文件,可是直接雙擊該程序會發現,程序中的背景圖片沒有顯示,咱們將C:\ProgramData\Anaconda3\Library\plugins目錄中的imageformats文件夾拷貝至dist目錄中,再次雙擊就可正常運行了ui
感謝北京圖靈學院老師的支持與幫助,感謝!!!! 官網 http://www.tulingxueyuan.com/ 交流QQ羣 246519056命令行