ubuntu中配置pyqt4环境教程


Posted in Python onDecember 27, 2017

相机校准前需要设置wifi的mac地址和切换校准模式,之前写的命令行工具,去了工厂发现使用可能有障碍,就做了个小应用程序,用了两种方法,先看一下第一种(不想选择的)

使用Tkinter做图形界面

Tkinter写界面麻烦,文档资料也不是很多,这里只做代码展示

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
from Tkinter import *      # 导入 Tkinter 库
from tkMessageBox import *
import httplib
import re
 
class MainWindow:
  def __init__(self):
    root = Tk()
    root.title("工具")
    width = 500
    height = 300
    screenwidth = root.winfo_screenheight()
    screenheight = root.winfo_screenheight()
    size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
    root.geometry(size)
    root.minsize(width, height)
    root.maxsize(width, height)
 
    Label(root, height=4, width=14, text="扫描数据:").grid(row=0, column=0, sticky=W)
 
    self.name = StringVar()
    Entry(root, width=30, textvariable=self.name).grid(row=0, column=1, columnspan=2)
 
    b1 = Button(root, text="发送MAC数据", height=4, width=10, command=self.send)
    b1.grid(row=2, column=0, sticky=E)
 
    b2 = Button(root, text="切换校准模式", height=4, width=10, command=self.close)
    b2.grid(row=2, column=1, sticky=E)
 
    b3 = Button(root, text="清空", height=4, width=10, command=self.clear)
    b3.grid(row=2, column=2, sticky=E)
 
    root.mainloop()
 
  def send(self):
    if self.name.get() == '':
      showwarning("输入为空", "参数不能为空,请重新操作!")
    else:
      result = re.sub(r"(?<=\w)(?=(?:\w\w)+$)", " ", self.name.get())
      self.httpSend(result)
 
  def close(self):
    self.httpDisconnect()
 
  def clear(self):
    self.name.set('')
 
  # 创建HTTP连接
  def httpSend(self, mac):
    httpClient = None
    # 进行操作
 
  # 创建HTTP连接
  def httpDisconnect(self):
    httpClient = None
    # 进行操作
 
if __name__ == '__main__':
  MainWindow()

使用PyQt4做图形界面

大学时候自学过一点Qt4.8.4的东西,所以比较倾向于用pyqt开发,跨平台,而且资料也比较齐全,特别是Qt脱离诺基亚后这几年发展迅猛,很多公司都开始采用Qt来开发图形界面应用了

首先配置环境

sudo apt-get install python-pip python2.7-dev libqt4-dev libqt4-dbg libqt4-gui libqt4-sql qt4-dev-tools qt4-doc qt4-designer qt4-qtconfig pyqt4-dev-tools

然后看代码

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import sys
import httplib
import re
from PyQt4.QtCore import *
from PyQt4.QtGui import * #这里为了偷懒,用到啥导入啥
 
class MainWindow(QWidget):
 def __init__(self,parent=None):
 QWidget.__init__(self,parent)
 self.setWindowTitle(u'工具')
 mac = QLabel(u'扫描数据:')
 
 self.macEdit = QLineEdit()
 
 grid = QGridLayout()
 grid.addWidget(mac,1,0)
 grid.addWidget(self.macEdit,1,1)
 
 clear = QPushButton(u'清空')
 send = QPushButton(u'发送')
 disconnect = QPushButton(u'断开')
 
 grid.addWidget(clear,2,1)
 grid.addWidget(send,3,1)
 grid.addWidget(disconnect,4,1)
 
 self.setLayout(grid)
 self.resize(550,200)
 screen = QDesktopWidget().screenGeometry()
 size = self.geometry()
 self.move((screen.width()-size.width())/2,(screen.height()-size.height())/2)
 self.connect(clear, SIGNAL('clicked()'), self.clearAction)
 self.connect(send, SIGNAL('clicked()'), self.sendAction)
 self.connect(disconnect, SIGNAL('clicked()'), self.httpDisconnect)
 
 def clearAction(self):
 self.macEdit.clear()
 
 def sendAction(self):
 macText = self.macEdit.text()
 if macText == '':
 msgBox = QMessageBox(QMessageBox.Warning,u'输入为空',u'参数不能为空,请重新操作!')
 msgBox.exec_()
 else:
 result = re.sub(r"(?<=\w)(?=(?:\w\w)+$)", " ", unicode(macText))
 # print(u'mac地址为:%s' % result)
 self.httpSend(result)
 
 # 创建HTTP连接
 def httpSend(window,mac):
 httpClient = None
 try:
 response = httpClient.getresponse()
 if response.status == 200 and response.reason == 'OK':
 msgBox = QMessageBox(QMessageBox.Information,u'设置成功',u'相机MAC地址设置成功,请等待相机重新启动!')
 msgBox.exec_() 
 except Exception, e:
 # print e
 msgBox = QMessageBox(QMessageBox.Warning,u'操作失败',u'操作失败,请重新操作!')
 msgBox.exec_()
 finally:
 if httpClient:
 httpClient.close()
 
 # 创建HTTP连接
 def httpDisconnect(window):
 httpClient = None
 try:
 response = httpClient.getresponse()
 if response.status == 200 and response.reason == 'OK':
 msgBox = QMessageBox(QMessageBox.Information,u'断开成功',u'现在相机已经进入校准模式,可以进行校准!')
 msgBox.exec_() 
 except Exception, e:
  # print e
 msgBox = QMessageBox(QMessageBox.Warning,u'操作失败',u'操作失败,请重新操作!')
 msgBox.exec_()
 finally:
 if httpClient:
 httpClient.close()
#main
if __name__:
 app = QApplication(sys.argv)
  window = MainWindow()
  window.show()
  sys.exit(app.exec_())

安装打包程序

pip install pyinstaller

也可以源码安装,下载源码包,然后进入包目录,执行下面的命令(需要安装setuptools):

python setup.py install

安装完后,检查安装成功与否:

pyinstaller --version

安装成功后,就可以使用下面的命令了:

pyinstaller : 打包可执行文件的主要命令,详细用法下面会介绍。

pyi-archive_viewer : 查看可执行包里面的文件列表。

pyi-bindepend : 查看可执行文件依赖的动态库(.so或.dll文件)

pyi-… : 等等。

pyinstaller的语法:

pyinstaller [options] script [script ...] | specfile

最简单的用法,在和myscript.py同目录下执行命令:

pyinstaller pyqt.py

然后会看到新增加了两个目录build和dist,dist下面的文件就是可以发布的可执行文件,对于上面的命令你会发现dist目录下面有一堆文 件,各种都动态库文件和myscrip可执行文件。有时这样感觉比较麻烦,需要打包dist下面的所有东西才能发布,万一丢掉一个动态库就无法运行了,好 在pyInstaller支持单文件模式,只需要执行:

pyinstaller -F pyqt.py

你会发现dist下面只有一个可执行文件,这个单文件就可以发布了,可以运行在你正在使用的操作系统类似的系统的下面。

当然,pyinstaller还有各种选项,有通用选项,如-d选项用于debug,了解pyInstaller执行的过程;还有一些针对不同平台的选项,具体用法可以访问PyInstaller官方WIKI。

PyInstaller的原理简介

PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望 成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运行者的机器上不用安装python和你的脚本依赖的库。在Linux操作系 统下,它主要用的binutil工具包里面的ldd和objdump命令。

PyInstaller输入你指定的的脚本,首先分析脚本所依赖的其他脚本,然后去查找,复制,把所有相关的脚本收集起来,包括Python解析器,然后把这些文件放在一个目录下,或者打包进一个可执行文件里面。

可以直接发布输出的整个文件夹里面的文件,或者生成的可执行文件。你只需要告诉用户,你的应用App是自我包含的,不需要安装其他包,或某个版本的Python,就可以直接运行了。

需要注意的是,PyInstaller打包的执行文件,只能在和打包机器系统同样的环境下。也就是说,不具备可移植性,若需要在不同系统上运行,就必须针对该平台进行打包。

来看一下最后的界面

ubuntu中配置pyqt4环境教程

Python 相关文章推荐
简单介绍Python中的filter和lambda函数的使用
Apr 07 Python
Python反转序列的方法实例分析
Mar 21 Python
Python中作用域的深入讲解
Dec 10 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
jupyter notebook 中输出pyecharts图实例
Apr 23 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
为什么说python更适合树莓派编程
Jul 20 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
PYTHON InceptionV3模型的复现详解
May 06 Python
Python中Threading用法详解
Dec 27 #Python
SVM基本概念及Python实现代码
Dec 27 #Python
Python自定义函数定义,参数,调用代码解析
Dec 27 #Python
详解用Python处理HTML转义字符的5种方式
Dec 27 #Python
Python中使用支持向量机(SVM)算法
Dec 26 #Python
Python中支持向量机SVM的使用方法详解
Dec 26 #Python
详解python中的 is 操作符
Dec 26 #Python
You might like
使用PHP维护文件系统
2006/10/09 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
javascript实现类似超链接的效果
2014/12/26 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
python求素数示例分享
2014/02/16 Python
Python文件夹与文件的操作实现代码
2014/07/13 Python
python中split方法用法分析
2015/04/17 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python全栈知识点总结
2019/07/01 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
Django中FilePathField字段的用法
2020/05/21 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
酒店办公室文员岗位职责
2013/12/18 职场文书
局机关干部群众路线个人对照检查材料思想汇报
2014/10/05 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
Golang实现可重入锁的示例代码
2022/05/25 Golang
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android