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 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你知道嵌入式,那你看过这个吗?

大家好,因为最近各种原因,我身边的很多同事都转行摆地摊了,可能因为那是一份自由的职业,摆地摊可以从事的范围很广,也不用起早贪黑了,而且收入并不低。也是因为这样,很多嵌入式方面的岗位越来越…

mvc一对多模型表单的快速构建

功能需求描述 Q:在实际的开发中,经常会遇到一个模型中包含有多个条目的表单。如何将数据提交到后台? A: 以数组的形式提交到后台就Ok了(真的那么简单么,如果再嵌套一层呢?) A2:拆分多个模型,映射就没啥问题…

c语言中 if(x) 、if(0) 、if(1)

解释if 语句里面包含真和非真&#xff0c;但是如果我们没有写清楚真和非真的话&#xff0c;会如何呢&#xff1f;if(x)相当于if(x ! 0)如果是指针的话&#xff0c;相当于if(x ! NULL)而if(1)相当于if(1 ! 0)还有if(0)相当于if(0 ! 0)举个例子#include<stdio.h> int main(…

看Linus骂人,真解气

感受下Linus骂人的感觉吧&#xff0c; 这样你会觉得工作中遇到的那些不愉快就算个鸟事背景一个Linux主线的内核维护者提交了一份patch&#xff0c;并说明问题产生的原因是因为应用传的音频有问题。Linus回复如下你他娘的给老子闭嘴&#xff01;这是一个内核bug好不好&#xff0…

不就是要个30K的薪资,他还问我Nginx调优

我是一个运维“老鸟”&#xff0c;目前在到处找工作阶段。周三刚面试完一家公司&#xff0c;还是非常中意的公司。结果是我中意公司&#xff0c;公司不中意我&#xff0c;妥妥的黄了。面试完我才知道&#xff0c;Linux云计算工程师必须能精通20多个企业级服务器优化。我之前不是…

android导出apk文件_Android测试工具入门介绍(三)

介绍一款牛逼的测试框架Drozer&#xff0c;一款可以检测Android一些公共漏洞的工具&#xff08;可能远不止这些、还可以继续挖掘&#xff09;&#xff0c;还可以生成shellcode&#xff0c;进行安卓设备的远程exploit。附下载地址&#xff1a;https://github.com/mwrlabs/drozer…

bomb炸弹

今天看到的一个Linux shell命令&#xff0c;但是我先说下&#xff0c;这个命令是危险的&#xff0c;所以没事的时候不要随便执行&#xff0c;出现了各种危险不要怪我没有提前告诉你哈。DANGER!命令代码:(){ :|: & };:命令解析1:() 意思是定义了一个函数&#xff0c;这个函数…

kindle的xray怎么用_Xray简单使用教程

Xray简单使用教程0X00下载xray 为单文件二进制文件&#xff0c;无依赖&#xff0c;也无需安装&#xff0c;下载后直接使用。下载地址为&#xff1a;注意&#xff1a; 不要直接 clone 仓库&#xff0c;xray 并不开源&#xff0c;仓库内不含源代码&#xff0c;直接下载构建的二进…

文件方式实现完整的英文词频统计实例(9.27)

1.读入待分析的字符串 2.分解提取单词 3.计数字典 4.排除语法型词汇 5.排序 6.输出TOP(20) 文本代码如下&#xff1a; girlRemembering me, Discover and see All over the world, Shes known as a girl To those who a free, The mind shall be key Forgotten as the past Ca…

UNUSED参数,这个宏,很秀

前言你们有没有在写代码的时候&#xff0c;遇到有的参数&#xff0c;从函数体里面传进来&#xff0c;但是又用不上&#xff0c;所以就不引用&#xff0c;但是不引用&#xff0c;在编译的时候&#xff0c;就会提示错误。是不是很尴尬&#xff0c;我们不使用&#xff0c;并不是错…

利用Python对文件进行批量重命名——以图片文件为例

效果如下&#xff1a;0001号用户的第 i 张图片 代码&#xff1a; import osclass ImageRename():def __init__(self):self.path C:/Users/lbpeng/Desktop/test/chictopia2/images1/fashioninmysoul/fulldef rename(self):filelist os.listdir(self.path)totalnum len(fileli…

mysql双重分组没有值也要显示_mysql 统计数据,按照日期分组,把没有数据的日期也展示出来...

因为业务需求&#xff0c;要统计每天的新增用户并且要用折线图的方式展示。如果其中有一天没有新增用户的话&#xff0c;这一天就是空缺的&#xff0c;在绘制折线图的时候是不允许的&#xff0c;所有要求把没有数据的日期也要在图表显示。查询2019-01-10------2019-01-20日的新…

我一个专科生,还有未来吗?

今天分享一个星球里面的讨论你好&#xff0c;我加入这个星球也算比较久了在此之前也一直都是在观望&#xff0c;我是一个19年因为高考失利而没有选择复读的专科生&#xff0c;我选择的专业是嵌入式技术与应用&#xff0c;最近不知道为什么特别迷茫&#xff0c;在选择读专科之前…

mysql查询数据库第一条记录_SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)...

Sqlserver 获取每组中的第一条记录在日常生活方面&#xff0c;我们经常需要记录一些操作&#xff0c;类似于日志的操作&#xff0c;最后的记录才是有效数据&#xff0c;而且可能它们属于不同的方面、功能下面&#xff0c;从数据库的术语来说&#xff0c;就是查找出每组中的一条…

Linux select/poll机制原理分析

转载一篇文章&#xff0c;讲解select和poll机制的&#xff0c;分享给大家。前言Read the fucking source code! --By 鲁迅A picture is worth a thousand words. --By 高尔基1. 概述Linux系统在访问设备的时候&#xff0c;存在以下几种IO模型&#xff1a;Blocking IO Model&am…

SSM框架的搭建学习(1)---MyBatis的环境搭建

SSM(SpringSpringMVCMyBatis)框架为当今最为流行的WEB开发框架之一,基本上涉及数据库的一些增删改查操作都可以借用此框架,本尊此前接的一个小公司关于楼宇空调监控指标的项目就是基于此框架,只不过当时框架已经被别人搭建好,只等我去添砖加瓦,并没有从头开始对此框架进行着手搭…

argv python 提示输入_Python解释器

一、Python解释器我们编写的Python代码都要放在Python解释器上运行&#xff0c;解释器是代码与计算机硬件之间的软件逻辑层。当我们在操作系统上安装好Python之后&#xff0c;它就包含了保证Python运行的最小化组件&#xff1a;解释器 和 标准库。根据选用的Python版本的不同&a…

高阶篇:8.1)开模前评审及提交资料;

本章目的&#xff1a;明确开模前需要提交的资料&#xff0c;确保开模一次性成功。 在现有机械行业制作技术的大环境下&#xff0c;除却必要的机加工零件之外&#xff0c;大部分的零件量产都需要开模制作。如塑胶、钣金、压铸、粉末冶金、锻造等。 但是模具是很贵的&#xff08;…

Android系统充电系统介绍-预防手机充电爆炸

1、锂电池介绍锂离子电池由日本索尼公司于1990年最先开发成功。它是把锂离子嵌入碳&#xff08;石油焦炭和石墨&#xff09;中形成负极&#xff08;传统锂电池用锂或锂合金作负极&#xff09;。正极材料常用LixCoO2 ,也用 LixNiO2 &#xff0c;和LixMnO4 &#xff0c;电解液用L…

Linux物理内存初始化

背景Read the fucking source code! --By 鲁迅A picture is worth a thousand words. --By 高尔基说明&#xff1a;Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 介绍让我们思考…