zoukankan      html  css  js  c++  java
  • PYQT4 Python GUI 编写与 打包.exe程序

    工作中需要开发一个小工具,简单的UI界面可以很好的提高工具的实用性,由此开启了我的第一次GUI开发之旅,下面将自己学习的心得记录一下,也做为学习笔记吧!!!

     参考:http://www.qaulau.com/books/PyQt4_Tutorial/index.html

    一,Python GUI开发之PYQT4

    1,首先安装PYQT4

         可以在 http://qunying.jb51.net:81/201704/tools/PyQt4_py2.7_x64_jb51.rar 这里,获得PyQt4的下载,请注意选择正确的Python版本和Python的位数。

    下载解压之后,双击安装文件,下一步安装即可,选择好Python27的路径。

    在 :C:Python27Libsite-packagesPyQt4 (自动转换成你自己的路径)下面找到 ,这个程序即GUI开发的工具界面。(打开它你就可以拖拖拽拽实现GUI的开发了),如下图:

     选择好窗口类型,点击“创建”就可以生成空白的窗口界面,你就可以在上面开发你自己的UI界面了。

    2,将.ui 文件转换成.py的代码文件:

    编辑好ui界面后,点击保存,会生成一个.ui格式的文件。

    在CMD下执行如下命令:pyuic4 xxx.ui -o xxx.py    这样就会生成相应的Python代码文件。

     3. 从你的IDE中打开Python代码,对其进行功能实现即可.在这里贴出我的代码,仅供参考学习

    首先,我做的是一个实现usb自动通断的工具;界面是这样的

    然后,代码如下:

    # -*- coding: utf-8 -*-
    
    import os,sys
    from PyQt4 import QtCore, QtGui
    import ctypes
    import time
    import threading
    
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
    
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _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"))
            #以上代码都是自动生成的,没有什么难度
    #下面的代码是主要是对控件功能的实现
    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", "初始状态", None)) self.label_6.setText(_translate("Dialog", "间隔(s)", None)) self.label_7.setText(_translate("Dialog", "切换次数", None)) self.radioButton.setText(_translate("Dialog", "接通/断开", None)) self.pushButton.setText(_translate("Dialog", "点击执行", 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 = resDict dllPath = 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) #连接USB print("连接 USB " + self.resDict[res]) def disconnectUsb(self): res = self.objdll.USBPLUG_Set(self.hdl, 0) #断开USB print("断开 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的相关使用,这里应用的比较简单,更加深入的使用还需要继续学习。。。

    二,将.py 文件打包成.exe可执行程序

    这里我用到的Pyinstaller这个模块,首先,需要安装pyinstaller; 安装方法推荐 使用 pip install pyinstaller(由于这个功能的实现还需要依赖一些其他的库,pip比较省事)

    安装完成后,我们可以在如下路径找到Pyinstaller应用程序:C:Python27Scripts

    参考链接:http://jingyan.baidu.com/article/a378c960b47034b3282830bb.html

    比较直接的方法就是使用Pyinstaller应用程序调用待发布脚本

     即执行:pyinstaller.exe  -w -F xxxxxxx.py

    -w: 直接发布的exe应用带命令行调试窗口,在指令内加入-w命令可以屏蔽掉命令框(调试阶段可不加-w, 最终发布时加入-w参数)

    -F: 这里是大写。使用-F指令可以把应用打包成一个独立的exe文件,否则是一个带各种dll和依赖文件的文件夹

    -p :这个指令后面可以增加pyinstaller搜索模块的路径。因为应用打包涉及的模块很多。这里可以自己添加路径。不过经过笔者测试,site-packages目录下都是可以被识别的,一般不需要再手动添加

  • 相关阅读:
    [译] 如何用ps制作火焰字
    Sublimetext gitHub 问题收集
    微博置顶
    迅雷评分效果
    phpstorm 3.0.3 git bug
    javascript,jQuery书籍
    dom 的添加或事件绑定
    ext源码阅读 DomHelper createHtml,insertHtml
    用于WebKit的CSS诀窍图片版
    二级下拉菜单
  • 原文地址:https://www.cnblogs.com/gaigaige/p/7593184.html
Copyright © 2011-2022 走看看