日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用pyinstaller打包pyqt程序

發布時間:2025/3/8 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用pyinstaller打包pyqt程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

首先聲明我的開發環境是windows+anconda,pyqt使用的是anconda自帶的,沒有單獨再安裝pyqt,下面上pyqt的代碼,具體怎么實現就不研究了,我們這里只研究下怎么使用pyinstaller打包這個程序

import sys from PyQt5 import QtWidgets from PyQt5.QtGui import QFont,QIcon#QtWidgets不包含QFont必須調用QtGui from PyQt5 import QtGui,QtCore import randomclass MessageBox(QtWidgets.QWidget):#繼承自父類QtWidgets.QWidgetCloseAllowed=0def __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 QIconself.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 = 1def 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,要和次代碼放在同一個目錄下,如果不是同一個目錄需要修改此處的路徑,圖片如下:

  • 安裝pyinstaller
  • pip install pyinstaller
  • 查看安裝結果,運行命令
  • pyinstaller --version

    顯示版本號 則證明安裝成功

  • 我的電腦右鍵--屬性--高級--環境變量 在系統變量中 新建一個 名稱為 QT_QPA_PLATFORM_PLUGIN_PATH 的環境變量,值為C:\ProgramData\Anaconda3\Library\plugins\platforms
  • 這是以我本地環境為例子的,如果你目錄和我不同請注意修改,并且找到platforms所在的目錄,加入環境變量中

    注意:必須將加入該環境變量,否則打包后的程序執行時候報錯

    This application failed start because it could not find or load the Qt platform plugin "windows in

  • 執行打包命令
  • pyinstaller -F -w demo.py

    -F:打包為單文件

    -w:Windows程序,不顯示命令行窗口,但是如果程序有命令行輸入或輸出,不要帶此項參數!

    demo.py:要打包成exe文件的腳本文件

    執行完之后,發現在當前目錄下生成了兩個新目錄:build、dist以及一個文件:demo.spec,demo.spec都是pyinstaller在打包過程中產生的中間文件,而dist目錄中則可以看到生成了一個名為demo.exe的可執行文件,但是直接雙擊該程序會發現,程序中的背景圖片沒有顯示,我們將C:\ProgramData\Anaconda3\Library\plugins目錄中的imageformats文件夾拷貝至dist目錄中,再次雙擊就可正常運行了

    感謝北京圖靈學院老師的支持與幫助,感謝!!!! 官網 http://www.tulingxueyuan.com/ 交流QQ群 246519056

    轉載于:https://my.oschina.net/u/3273360/blog/1845382

    總結

    以上是生活随笔為你收集整理的使用pyinstaller打包pyqt程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。