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爬虫之HTTP异常处理
Nov 05 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
python实现redis三种cas事务操作
Dec 19 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
Python3的socket使用方法详解
Feb 18 Python
Python unittest discover批量执行代码实例
Sep 08 Python
PyQt实现计数器的方法示例
Jan 18 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自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
jquery操作checkbox示例分享
2014/07/21 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
js闭包学习心得总结
2018/04/17 Javascript
小程序实现留言板
2018/11/02 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
Python更换pip源方法过程解析
2020/05/19 Python
Python接收手机短信的代码整理
2020/08/02 Python
python cookie反爬处理的实现
2020/11/01 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
村级环境卫生整治方案
2014/05/04 职场文书
交通安全标语
2014/06/06 职场文书
办理房产过户的委托书
2014/09/14 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
React中的Context应用场景分析
2021/06/11 Javascript
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript