工作中需要开发一个小工具,简单的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自动通断的工具;界面是这样的

然后,代码如下:

  1. # -*- coding: utf-8 -*-
  2.  
  3. import os,sys
  4. from PyQt4 import QtCore, QtGui
  5. import ctypes
  6. import time
  7. import threading
  8.  
  9. try:
  10. _fromUtf8 = QtCore.QString.fromUtf8
  11. except AttributeError:
  12. def _fromUtf8(s):
  13. return s
  14.  
  15. try:
  16. _encoding = QtGui.QApplication.UnicodeUTF8
  17. def _translate(context, text, disambig):
  18. return QtGui.QApplication.translate(context, text, disambig, _encoding)
  19. except AttributeError:
  20. def _translate(context, text, disambig):
  21. return QtGui.QApplication.translate(context, text, disambig)
  22.  
  23. class Ui_Dialog(object):
  24.  
  25. def setupUi(self, Dialog):
  26. Dialog.setObjectName(_fromUtf8("Dialog"))
  27. Dialog.resize(397, 244)
  28. self.groupBox_3 = QtGui.QGroupBox(Dialog)
  29. self.groupBox_3.setGeometry(QtCore.QRect(10, 20, 381, 211))
  30. self.groupBox_3.setFocusPolicy(QtCore.Qt.WheelFocus)
  31. self.groupBox_3.setAcceptDrops(False)
  32. self.groupBox_3.setAutoFillBackground(True)
  33. self.groupBox_3.setInputMethodHints(QtCore.Qt.ImhNone)
  34. self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
  35. self.label_5 = QtGui.QLabel(self.groupBox_3)
  36. self.label_5.setGeometry(QtCore.QRect(10, 30, 51, 21))
  37. self.label_5.setLineWidth(1)
  38. self.label_5.setMidLineWidth(1)
  39. self.label_5.setTextFormat(QtCore.Qt.AutoText)
  40. self.label_5.setAlignment(QtCore.Qt.AlignCenter)
  41. self.label_5.setWordWrap(True)
  42. self.label_5.setMargin(0)
  43. self.label_5.setObjectName(_fromUtf8("label_5"))
  44. self.label_6 = QtGui.QLabel(self.groupBox_3)
  45. self.label_6.setGeometry(QtCore.QRect(10, 70, 51, 21))
  46. self.label_6.setLineWidth(1)
  47. self.label_6.setMidLineWidth(1)
  48. self.label_6.setTextFormat(QtCore.Qt.AutoText)
  49. self.label_6.setAlignment(QtCore.Qt.AlignCenter)
  50. self.label_6.setWordWrap(True)
  51. self.label_6.setMargin(0)
  52. self.label_6.setObjectName(_fromUtf8("label_6"))
  53. self.spinBox = QtGui.QSpinBox(self.groupBox_3)
  54. self.spinBox.setGeometry(QtCore.QRect(80, 70, 70, 22))
  55. self.spinBox.setMaximum(10000)
  56. self.spinBox.setValue(60)
  57. self.spinBox.setObjectName(_fromUtf8("spinBox"))
  58. self.label_7 = QtGui.QLabel(self.groupBox_3)
  59. self.label_7.setGeometry(QtCore.QRect(10, 110, 51, 21))
  60. self.label_7.setLineWidth(1)
  61. self.label_7.setMidLineWidth(1)
  62. self.label_7.setTextFormat(QtCore.Qt.AutoText)
  63. self.label_7.setAlignment(QtCore.Qt.AlignCenter)
  64. self.label_7.setWordWrap(True)
  65. self.label_7.setMargin(0)
  66. self.label_7.setObjectName(_fromUtf8("label_7"))
  67. self.spinBox_2 = QtGui.QSpinBox(self.groupBox_3)
  68. self.spinBox_2.setGeometry(QtCore.QRect(80, 110, 70, 22))
  69. self.spinBox_2.setMaximum(10000)
  70. self.spinBox_2.setValue(2)
  71. self.spinBox_2.setObjectName(_fromUtf8("spinBox_2"))
  72. self.radioButton = QtGui.QRadioButton(self.groupBox_3)
  73. self.radioButton.setGeometry(QtCore.QRect(80, 30, 89, 21))
  74. self.radioButton.setAutoRepeat(False)
  75. self.radioButton.setObjectName(_fromUtf8("radioButton"))
  76. self.pushButton = QtGui.QPushButton(self.groupBox_3)
  77. self.pushButton.setGeometry(QtCore.QRect(280, 110, 70, 21))
  78. self.pushButton.setObjectName(_fromUtf8("pushButton"))
  79.  
  80. self.progressBar = QtGui.QProgressBar(self.groupBox_3)
  81. self.progressBar.setGeometry(QtCore.QRect(10, 170, 361, 23))
  82. self.progressBar.setProperty("value", 0)
  83. self.progressBar.setObjectName(_fromUtf8("progressBar"))
  84. #以上代码都是自动生成的,没有什么难度
    #下面的代码是主要是对控件功能的实现
    self.radioButton.toggled.connect(self.changeUSBstatus)
  85. self.pushButton.clicked.connect(lambda:self.usbSwitchThreads())
  86.  
  87. # self.pushButton.connect(self.pushButton, SIGNAL("clicked"),self.changeUSBstatus())
  88. # QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.pushButton.toggle)
  89.  
  90. self.retranslateUi(Dialog)
  91. QtCore.QMetaObject.connectSlotsByName(Dialog)
  92.  
  93. def retranslateUi(self, Dialog):
  94. Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
  95. self.groupBox_3.setTitle(_translate("Dialog", "USB通断控制", None))
  96. self.label_5.setText(_translate("Dialog", "初始状态", None))
  97. self.label_6.setText(_translate("Dialog", "间隔(s)", None))
  98. self.label_7.setText(_translate("Dialog", "切换次数", None))
  99. self.radioButton.setText(_translate("Dialog", "接通/断开", None))
  100. self.pushButton.setText(_translate("Dialog", "点击执行", None))
  101.  
  102. def changeUSBstatus(self):
  103. if self.radioButton.isChecked():
  104. USBcontrol().connectUsb()
  105. else:
  106. USBcontrol().disconnectUsb()
  107.  
  108. def stopUsbSwitch(self):
  109. self.spinBox_2.setValue(0)
  110.  
  111. def excuteUsbSwitch(self):
  112.  
  113. self.pTime=self.spinBox.value()
  114. self.eTimes=self.spinBox_2.value()
  115. self.progressBar.setMinimum(0)
  116. self.progressBar.setMaximum(self.eTimes)
  117. for i in range(self.eTimes):
  118. time.sleep(int(self.pTime))
  119. USBcontrol().connectUsb()
  120. time.sleep(int(self.pTime))
  121. USBcontrol().disconnectUsb()
  122. self.progressBar.setValue(i+1)
  123.  
  124. def usbSwitchThreads(self):
  125. threadsList=[]
  126. t = threading.Thread(target=self.excuteUsbSwitch,args=() )
  127. threadsList.append(t)
  128. for t in threadsList:
  129. t.setDaemon(True)
  130. t.start()
  131.  
  132. class USBcontrol:
  133. def __init__(self):
  134. resDict={
  135. 0:"成功",
  136. 1:""}
  137. self.resDict = resDict
  138. dllPath = os.path.abspath(os.path.dirname(__file__))
  139. self.objdll = ctypes.windll.LoadLibrary(dllPath+r'\usbplug.dll')
  140. self.hdl = self.objdll.USBPLUG_Open(1)
  141.  
  142. def connectUsb(self):
  143. res = self.objdll.USBPLUG_Set(self.hdl, 1) #连接USB
  144. print("连接 USB " + self.resDict[res])
  145. def disconnectUsb(self):
  146. res = self.objdll.USBPLUG_Set(self.hdl, 0) #断开USB
  147. print("断开 USB " + self.resDict[res])
  148. def __del__(self):
  149. self.objdll.USBPLUG_Close(self.hdl)
  150.  
  151. if __name__ == "__main__":
  152. app = QtGui.QApplication(sys.argv)
  153. Form=QtGui.QWidget()
  154. main=Ui_Dialog()
  155. main.setupUi(Form)
  156. Form.show()
  157. 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目录下都是可以被识别的,一般不需要再手动添加

PYQT4 Python GUI 编写与 打包.exe程序的更多相关文章

  1. pyinstaller 打包exe程序读不到配置文件No such file

    挺久没更新博客的,一来之前是觉得才疏学浅,记录下来的太简单没人看.二来时间上不是很充裕(不是借口,有时间打游戏,没时间总结) 偶然有一次发现同事在搜索解决问题的时候正在看我博客的解决思路,很奇妙的感觉 ...

  2. PyQt4 Python GUI窗体应用程序

    目录 目录 前言 软件环境 PyQT简介 Setup PyCharm Setup SIP Setup PyQt4 测试PyQt是否安装成功 常见错误 最后 前言 还是一句老话,公司要什么我就做什么.这 ...

  3. [python学习笔记] pyinstaller打包pyqt5程序无法运行

    问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...

  4. Java GUI使用exe4j打包exe文件

    exe4j下载地址:http://blog.csdn.net/cciii/article/details/17083531 1.  在MyEclipse将java项目打包成可执行jar文件.项目结构如 ...

  5. inno setup 打包exe程序

    inno setup 用于打包生成安装程序, 是通过的一个脚本 可以将 exe 执行文件以安装的形式,解压,添加依赖,创建快捷方式. 例如,我们写了个winform,我们怎么通过安装的形式,给客户的机 ...

  6. pyinstaller打包exe程序各种坑!!!

    pyinstaller打包python成exe可执行程序,各种报错,各种坑,在次记录下 一.pyinstaller打包报错for real_module_name, six_moduleAttribu ...

  7. Window10 Electron 开发环境搭建及打包exe程序

    1.安装 Electron 首先要安装Node.js     (安装方法:https://www.cnblogs.com/inkwhite/p/9685520.html) 我这里已经安装好了. 2:安 ...

  8. Python 之pyinstaller模块打包成exe文件

    一.安装pyinstaller pip install pyinstaller 二.下载安装pyinstaler运行时所需要的windows扩展pywin32 https://github.com/m ...

  9. pyinstaller将python编写的打卡程序打包成exe

    编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...

随机推荐

  1. TCL数据类型

    原始数据类型在Tcl中是字符串,我们常常可以找到字符串和引用在Tcl语言中.这些原始数据类型依次创建复合数据类型列表和关联数组.在Tcl中,数据类型可以表示不仅是简单Tcl的对象,但也可以代表相同的句 ...

  2. c#静态构造函数与构造函数

    构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧. 静态构造函数是在构造函数方法前面添加了stat ...

  3. 20165233 Java第八、十五章学习总结

    20165233 2017-2018-2 <Java程序设计>第六周学习总结 教材学习内容总结 ch08 基础:String类 重点:StringTokenizer类.Scanner类:获 ...

  4. Java下LDAP操作的资料

    话说LDAP真是个诡异的protocol(或者数据库,或者服务,whatever...),没有一个特别形象的spec.这里列出一些筛选出的还可以的文档,都是oracle的: https://docs. ...

  5. 【CentOS 6.5】【转】新版本linux生成xorg.conf

    新版本的linux如何生成xorg.conf 较新版本的linux系统都已经没有xorg.conf文件,但是有时候为了对显示做微调或为了支持多屏显示等原因,还需要手工生成一个xorg.conf,然后根 ...

  6. FireDAC 汉字字段名称过滤

    [FireDAC][Stan][Eval]-107. Invalid character found [ 拼音码 like '%A%' ] 英文字段名称过滤正常 汉字字段名过滤报错. 莫非不支持汉字字 ...

  7. 可视化库-Matplotlib-3D图(第四天)

    1. 画三维图片图 axes = Axes3D(fig)这一步将二维坐标转换为三维坐标,axes.plot_surface() import matplotlib.pyplot as plt impo ...

  8. 开源地理空间基金会OSGeo简介

    开源地理空间基金会 OSGeo 相关站点: OSGeo官方站点:http://www.osgeo.org/home OSGeo中国中心:http://www.osgeo.cn/ OSGeo GitHu ...

  9. DOCKER windows 7 详细安装教程

    DOCKER windows安装 编者: xiaym 日期:2015年1月20日 排版工具: 马克飞象 QQ: 252536711 DOCKER windows安装 1.下载程序包 2. 设置环境变量 ...

  10. x64位windows 2003 server中“Server 对象 错误 'ASP 0177 : 800700c1' Server.CreateObject 失败”问题

    给朋友看一个老asp网站图片不能上传问题,试过网上各种办法都提示: Server 对象 错误 'ASP 0177 : 800700c1' Server.CreateObject 失败 最终问题出在x6 ...