PYQT4 Python GUI 编写与 打包.exe程序
工作中需要開(kāi)發(fā)一個(gè)小工具,簡(jiǎn)單的UI界面可以很好的提高工具的實(shí)用性,由此開(kāi)啟了我的第一次GUI開(kāi)發(fā)之旅,下面將自己學(xué)習(xí)的心得記錄一下,也做為學(xué)習(xí)筆記吧!!!
?參考:http://www.qaulau.com/books/PyQt4_Tutorial/index.html
一,Python GUI開(kāi)發(fā)之PYQT4
1,首先安裝PYQT4
? ? ?可以在 http://qunying.jb51.net:81/201704/tools/PyQt4_py2.7_x64_jb51.rar?這里,獲得PyQt4的下載,請(qǐng)注意選擇正確的Python版本和Python的位數(shù)。
下載解壓之后,雙擊安裝文件,下一步安裝即可,選擇好Python27的路徑。
在 :C:\Python27\Lib\site-packages\PyQt4 (自動(dòng)轉(zhuǎn)換成你自己的路徑)下面找到?,這個(gè)程序即GUI開(kāi)發(fā)的工具界面。(打開(kāi)它你就可以拖拖拽拽實(shí)現(xiàn)GUI的開(kāi)發(fā)了),如下圖:
?
?選擇好窗口類(lèi)型,點(diǎn)擊“創(chuàng)建”就可以生成空白的窗口界面,你就可以在上面開(kāi)發(fā)你自己的UI界面了。
2,將.ui 文件轉(zhuǎn)換成.py的代碼文件:
編輯好ui界面后,點(diǎn)擊保存,會(huì)生成一個(gè).ui格式的文件。
在CMD下執(zhí)行如下命令:pyuic4 xxx.ui -o xxx.py ? ?這樣就會(huì)生成相應(yīng)的Python代碼文件。
?3. 從你的IDE中打開(kāi)Python代碼,對(duì)其進(jìn)行功能實(shí)現(xiàn)即可.在這里貼出我的代碼,僅供參考學(xué)習(xí)
首先,我做的是一個(gè)實(shí)現(xiàn)usb自動(dòng)通斷的工具;界面是這樣的
然后,代碼如下:
# -*- coding: utf-8 -*-import os,sys from PyQt4 import QtCore, QtGui import ctypes import time import threadingtry:_fromUtf8 = QtCore.QString.fromUtf8 except AttributeError:def _fromUtf8(s):return stry:_encoding = QtGui.QApplication.UnicodeUTF8def _translate(context, text, disambig):return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError:def _translate(context, text, disambig):return QtGui.QApplication.translate(context, text, disambig)class Ui_Dialog(object):def setupUi(self, Dialog):Dialog.setObjectName(_fromUtf8("Dialog"))Dialog.resize(397, 244)self.groupBox_3 = QtGui.QGroupBox(Dialog)self.groupBox_3.setGeometry(QtCore.QRect(10, 20, 381, 211))self.groupBox_3.setFocusPolicy(QtCore.Qt.WheelFocus)self.groupBox_3.setAcceptDrops(False)self.groupBox_3.setAutoFillBackground(True)self.groupBox_3.setInputMethodHints(QtCore.Qt.ImhNone)self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))self.label_5 = QtGui.QLabel(self.groupBox_3)self.label_5.setGeometry(QtCore.QRect(10, 30, 51, 21))self.label_5.setLineWidth(1)self.label_5.setMidLineWidth(1)self.label_5.setTextFormat(QtCore.Qt.AutoText)self.label_5.setAlignment(QtCore.Qt.AlignCenter)self.label_5.setWordWrap(True)self.label_5.setMargin(0)self.label_5.setObjectName(_fromUtf8("label_5"))self.label_6 = QtGui.QLabel(self.groupBox_3)self.label_6.setGeometry(QtCore.QRect(10, 70, 51, 21))self.label_6.setLineWidth(1)self.label_6.setMidLineWidth(1)self.label_6.setTextFormat(QtCore.Qt.AutoText)self.label_6.setAlignment(QtCore.Qt.AlignCenter)self.label_6.setWordWrap(True)self.label_6.setMargin(0)self.label_6.setObjectName(_fromUtf8("label_6"))self.spinBox = QtGui.QSpinBox(self.groupBox_3)self.spinBox.setGeometry(QtCore.QRect(80, 70, 70, 22))self.spinBox.setMaximum(10000)self.spinBox.setValue(60)self.spinBox.setObjectName(_fromUtf8("spinBox"))self.label_7 = QtGui.QLabel(self.groupBox_3)self.label_7.setGeometry(QtCore.QRect(10, 110, 51, 21))self.label_7.setLineWidth(1)self.label_7.setMidLineWidth(1)self.label_7.setTextFormat(QtCore.Qt.AutoText)self.label_7.setAlignment(QtCore.Qt.AlignCenter)self.label_7.setWordWrap(True)self.label_7.setMargin(0)self.label_7.setObjectName(_fromUtf8("label_7"))self.spinBox_2 = QtGui.QSpinBox(self.groupBox_3)self.spinBox_2.setGeometry(QtCore.QRect(80, 110, 70, 22))self.spinBox_2.setMaximum(10000)self.spinBox_2.setValue(2)self.spinBox_2.setObjectName(_fromUtf8("spinBox_2"))self.radioButton = QtGui.QRadioButton(self.groupBox_3)self.radioButton.setGeometry(QtCore.QRect(80, 30, 89, 21))self.radioButton.setAutoRepeat(False)self.radioButton.setObjectName(_fromUtf8("radioButton"))self.pushButton = QtGui.QPushButton(self.groupBox_3)self.pushButton.setGeometry(QtCore.QRect(280, 110, 70, 21))self.pushButton.setObjectName(_fromUtf8("pushButton"))self.progressBar = QtGui.QProgressBar(self.groupBox_3)self.progressBar.setGeometry(QtCore.QRect(10, 170, 361, 23))self.progressBar.setProperty("value", 0)self.progressBar.setObjectName(_fromUtf8("progressBar"))#以上代碼都是自動(dòng)生成的,沒(méi)有什么難度#下面的代碼是主要是對(duì)控件功能的實(shí)現(xiàn)
self.radioButton.toggled.connect(self.changeUSBstatus)self.pushButton.clicked.connect(lambda:self.usbSwitchThreads()) # self.pushButton.connect(self.pushButton, SIGNAL("clicked"),self.changeUSBstatus()) # QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.pushButton.toggle) self.retranslateUi(Dialog)QtCore.QMetaObject.connectSlotsByName(Dialog)def retranslateUi(self, Dialog):Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))self.groupBox_3.setTitle(_translate("Dialog", "USB通斷控制", None))self.label_5.setText(_translate("Dialog", "初始狀態(tài)", None))self.label_6.setText(_translate("Dialog", "間隔(s)", None))self.label_7.setText(_translate("Dialog", "切換次數(shù)", None))self.radioButton.setText(_translate("Dialog", "接通/斷開(kāi)", None))self.pushButton.setText(_translate("Dialog", "點(diǎn)擊執(zhí)行", None))def changeUSBstatus(self):if self.radioButton.isChecked():USBcontrol().connectUsb()else:USBcontrol().disconnectUsb()def stopUsbSwitch(self):self.spinBox_2.setValue(0)def excuteUsbSwitch(self):self.pTime=self.spinBox.value()self.eTimes=self.spinBox_2.value()self.progressBar.setMinimum(0) self.progressBar.setMaximum(self.eTimes)for i in range(self.eTimes): time.sleep(int(self.pTime))USBcontrol().connectUsb()time.sleep(int(self.pTime))USBcontrol().disconnectUsb() self.progressBar.setValue(i+1) def usbSwitchThreads(self):threadsList=[]t = threading.Thread(target=self.excuteUsbSwitch,args=() )threadsList.append(t)for t in threadsList:t.setDaemon(True)t.start() class USBcontrol:def __init__(self):resDict={0:"成功",1:""}self.resDict = resDictdllPath = os.path.abspath(os.path.dirname(__file__))self.objdll = ctypes.windll.LoadLibrary(dllPath+r'\usbplug.dll')self.hdl = self.objdll.USBPLUG_Open(1)def connectUsb(self):res = self.objdll.USBPLUG_Set(self.hdl, 1) #連接USBprint("連接 USB " + self.resDict[res])def disconnectUsb(self):res = self.objdll.USBPLUG_Set(self.hdl, 0) #斷開(kāi)USBprint("斷開(kāi) USB " + self.resDict[res]) def __del__(self):self.objdll.USBPLUG_Close(self.hdl)if __name__ == "__main__": app = QtGui.QApplication(sys.argv) Form=QtGui.QWidget()main=Ui_Dialog()main.setupUi(Form)Form.show()sys.exit(app.exec_())
?ok, 以上就是pyqt4的相關(guān)使用,這里應(yīng)用的比較簡(jiǎn)單,更加深入的使用還需要繼續(xù)學(xué)習(xí)。。。
二,將.py 文件打包成.exe可執(zhí)行程序
這里我用到的Pyinstaller這個(gè)模塊,首先,需要安裝pyinstaller; 安裝方法推薦 使用 pip install pyinstaller(由于這個(gè)功能的實(shí)現(xiàn)還需要依賴一些其他的庫(kù),pip比較省事)
安裝完成后,我們可以在如下路徑找到Pyinstaller應(yīng)用程序:C:\Python27\Scripts\
參考鏈接:http://jingyan.baidu.com/article/a378c960b47034b3282830bb.html
比較直接的方法就是使用Pyinstaller應(yīng)用程序調(diào)用待發(fā)布腳本
即執(zhí)行:pyinstaller.exe ?-w -F xx\xx\xxx.py
-w:?直接發(fā)布的exe應(yīng)用帶命令行調(diào)試窗口,在指令內(nèi)加入-w命令可以屏蔽掉命令框(調(diào)試階段可不加-w, 最終發(fā)布時(shí)加入-w參數(shù))
-F:?這里是大寫(xiě)。使用-F指令可以把應(yīng)用打包成一個(gè)獨(dú)立的exe文件,否則是一個(gè)帶各種dll和依賴文件的文件夾
-p :這個(gè)指令后面可以增加pyinstaller搜索模塊的路徑。因?yàn)閼?yīng)用打包涉及的模塊很多。這里可以自己添加路徑。不過(guò)經(jīng)過(guò)筆者測(cè)試,site-packages目錄下都是可以被識(shí)別的,一般不需要再手動(dòng)添加
轉(zhuǎn)載于:https://www.cnblogs.com/gaigaige/p/7593184.html
總結(jié)
以上是生活随笔為你收集整理的PYQT4 Python GUI 编写与 打包.exe程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JS 上传图片
- 下一篇: python win32 窗口截图