工作中需要开发一个小工具,简单的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:\Python27\Lib\site-packages\PyQt4 (自动转换成你自己的路径)下面找到 ,这个程序即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 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"))#以上代码都是自动生成的,没有什么难度        #下面的代码是主要是对控件功能的实现        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 = 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) #断开USBprint("断开 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:\Python27\Scripts\

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

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

 即执行:pyinstaller.exe  -w -F xx\xx\xxx.py

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

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

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

转载于:https://www.cnblogs.com/gaigaige/p/7593184.html

PYQT4 Python GUI 编写与 打包.exe程序相关推荐

  1. Python实现圣诞树、打包exe过程和遇到的问题

    Python实现圣诞树.打包exe过程和遇到的问题 昨天看到CSDN推荐的Python生成圣诞树的博客,想着圣诞节也没给女朋友送过什么礼物,决定这个python脚本改成可执行文件然后作为她今年的礼物( ...

  2. 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次

    基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 文章目录 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 一.前言 ...

  3. pyinstaller打包exe程序闪退问题修复

    pyinstaller打包exe程序,点击程序,闪退,问题原因: pyinstaller版本过低 升级 pip install --upgrade pyinstaller pyinstaller从4. ...

  4. Python使用py2exe打包exe程序

    py2exe可以将Python程序打包成exe程序,使得可以在没有Python环境的机器上运行. 首先编写一个hello_test.py文件: from time import sleepif __n ...

  5. python开发web应用打包exe,python开发web应用程序

    python做web开发有哪些好处和不足 python适合Web开发吗?当然!python涉及的面十分广泛,不过使用python进行开发,你需要先掌握python的基础知识,然后学习python We ...

  6. Python实现多个excel文件合并源码及打包exe程序

    ##以下是源码filecombine.py,比较简单,有相应说明,也是结合别的代码自己修改的,用到的包需要提前装好. # -*- coding: utf-8 -*- import xlrd impor ...

  7. pyinstaller打包exe程序教程推荐及需要注意的点

    Python PyInstaller安装和使用教程(详解版) http://c.biancheng.net/view/2690.html 1.pyinstaller打包程序中出错是正常的,报错要注意看 ...

  8. python启动远端 exe_python打包exe开机自动启动的实例(windows)

    一.背景 简单的写个.exe程序,没必要去学习mfc.c++等,可以学习python.python可以轻易的调用windows的api,轻松的实现你想干的事.下面就是实现打包的exe文件开机自动运行. ...

  9. Anaconda使用pyinstaller打包exe程序体积过大

    现象 使用的是Anaconda进行包管理,由于pyinstaller默认使用系统python环境变量来打包的,因此如果系统使用的python环境安装了太多的包,会导致最终输出的exe程序太大了,达到2 ...

最新文章

  1. 中国电子学会图形化四级编程题:加减法混合运算器
  2. linux查看某个端口是被哪个进程占用的
  3. VTK:创建字母频率的条形图用法实战
  4. 2021高考襄阳四中成绩查询,襄阳四中2020年高考成绩怎么样(高考喜报)
  5. Mysql递归查询,无限级上下级菜单
  6. 智能语音识别转文字字幕实时上屏直播系统
  7. stylesheettheme和 theme 的区别
  8. Redis远程连接出现An existing connection was forcibly closed by the remote host.远程主机强制关闭现有连接
  9. AX 2009 删除已经发出领料单的订单行
  10. 金蝶K3案例实验实际成本前台操作
  11. html最多显示两行,css 实现两行或多行文本溢出显示省略号(...)
  12. 为什么英语会有主格和宾格之分?比如:I、me
  13. 用PS通道消除人物脸部斑点的磨皮, 有什么技巧
  14. 同态加密在联邦计算中的应用
  15. 指标类数据标准如何定义?
  16. 第55篇 Chrome扩展USB开发(一)及PHP研究 Saturday
  17. 英语二-常用写作范文参考
  18. x86, x86-64, i386, IA32, IA64 区别
  19. Java——(高斯消去法/列主元消去法/LU消去)求解方程
  20. 2021-2027全球与中国操作面板市场现状及未来发展趋势

热门文章

  1. js理解 call( ) | apply( ) | caller( ) | callee( )
  2. Oracle 协议适配器错误
  3. xflash里的hello world程序
  4. linux逻辑卷管理
  5. [javaSE] 看博客学习java并发编程
  6. PHP--字符串处理函数
  7. Oracle conn 协议适配器错误解决
  8. easyui验证:validatebox
  9. 《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》...
  10. 技术QA:如何安装并启用BITS和WebDAV?