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:\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 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:\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程序的更多相关文章
- pyinstaller 打包exe程序读不到配置文件No such file
挺久没更新博客的,一来之前是觉得才疏学浅,记录下来的太简单没人看.二来时间上不是很充裕(不是借口,有时间打游戏,没时间总结) 偶然有一次发现同事在搜索解决问题的时候正在看我博客的解决思路,很奇妙的感觉 ...
- PyQt4 Python GUI窗体应用程序
目录 目录 前言 软件环境 PyQT简介 Setup PyCharm Setup SIP Setup PyQt4 测试PyQt是否安装成功 常见错误 最后 前言 还是一句老话,公司要什么我就做什么.这 ...
- [python学习笔记] pyinstaller打包pyqt5程序无法运行
问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...
- Java GUI使用exe4j打包exe文件
exe4j下载地址:http://blog.csdn.net/cciii/article/details/17083531 1. 在MyEclipse将java项目打包成可执行jar文件.项目结构如 ...
- inno setup 打包exe程序
inno setup 用于打包生成安装程序, 是通过的一个脚本 可以将 exe 执行文件以安装的形式,解压,添加依赖,创建快捷方式. 例如,我们写了个winform,我们怎么通过安装的形式,给客户的机 ...
- pyinstaller打包exe程序各种坑!!!
pyinstaller打包python成exe可执行程序,各种报错,各种坑,在次记录下 一.pyinstaller打包报错for real_module_name, six_moduleAttribu ...
- Window10 Electron 开发环境搭建及打包exe程序
1.安装 Electron 首先要安装Node.js (安装方法:https://www.cnblogs.com/inkwhite/p/9685520.html) 我这里已经安装好了. 2:安 ...
- Python 之pyinstaller模块打包成exe文件
一.安装pyinstaller pip install pyinstaller 二.下载安装pyinstaler运行时所需要的windows扩展pywin32 https://github.com/m ...
- pyinstaller将python编写的打卡程序打包成exe
编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...
随机推荐
- tornado相关文章
http://www.linuxzen.com/shi-yong-tornadojin-xing-wang-luo-yi-bu-bian-cheng.html http://cloudaice.com ...
- HDU-6156 Palindrome Function(数位DP)
一.题目 二.思路 1.这是很明显的数位DP: 2.和以往数位DP不同的是,这里带了个进制进来,而以往做是纯十进制下或者纯二进制下做操作.但是,不管多少进制,原理都是一样的: 3.这里有个小坑,题目中 ...
- 操作表单域中的value值
HTML <form action=""> <input type="radio" name="sex" value=&q ...
- html链接路径
html链接的相对路径与绝对路径 绝对路径 完整的一个路径就是绝对路径,即包含schema://host[:port#]/path/.../[?query-string][#anchor] 例:htt ...
- 项目管理工具maven(一)
1 Maven的概述 1.1 依赖管理 就是对jar包的统一管理 可以节省空间 1.2 项目一键构建 编码 编译 测试(junit) 运行 打包 部署 一个 tomcat:run就能把项目 ...
- TNS:no listener error in Oracle XE after changing computer name
This morning at work when trying to log on to my computer I noticed not my username on login screen ...
- 7 MySQL--记录的增删改查
MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的DML语言 ...
- Create a Basic Shader in Shader Forge
[Create a Basic Shader in Shader Forge] 1.打开ShaderForge.Window-> Shader Forge.(打开速度较慢) 2.通过NewSha ...
- intellij idea运行Android程序时报错;Unable to locate adb within SDK
环境:intellij idea15 问题:运行Android时报错Throwable:Unable to locate adb within SDK 解决方法:在SDK安装目录的\platfor ...
- Python help() 函数
Python help() 函数 Python 内置函数 描述 help() 函数用于查看函数或模块用途的详细说明. 语法 help 语法: help([object]) 参数说明: object ...