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通过select实现异步IO的方法
Jun 04 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
tornado 多进程模式解析
Jan 15 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
Python 异步协程函数原理及实例详解
Nov 13 Python
Django 自动生成api接口文档教程
Nov 19 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 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实现的短网址算法分享
2014/06/20 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
PHP文件操作方法汇总
2015/07/01 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
accesskey 提交
2006/06/26 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
Python实现把xml或xsl转换为html格式
2015/04/08 Python
Python实现线程状态监测简单示例
2018/03/28 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
python 实现多维数组(array)排序
2020/02/28 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
电气工程师岗位职责
2014/01/01 职场文书
韩国商务邀请函
2014/01/14 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
家长会邀请书
2014/01/25 职场文书
2014组织生活会方案
2014/05/19 职场文书
经典演讲稿开场白
2014/08/25 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
家长通知书家长意见
2015/06/03 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
美元符号 $
2022/02/17 杂记