PyQt5系列教程(五)制作fastboot烧写器
软硬件环境
- Windows 7
- Python 3.4.2
- PyQt 5.5.1
- PyCharm 5.0.2
前言
fastboot是针对Android设备的一种刷机方式,它比recovery更底层,刷机速度更快。本文要完成的这个项目就是用PyQt5来给fastboot加个GUI层,使操作更加简单方便。

需求分析
首先要清楚fastboot能做些什么,通过在cmd里输入fastboot命令就可以查看它的帮助信息

本工程主要实现的是fastboot的烧录功能,其它的像获取、设置相关信息就没有涉及,有需要的话就自己去添加。
还有一个比较特殊的需求就是烧录的镜像需要修改的情况,我这里称它为BBCB,它的一部分数据是由用户输入的。
界面设计
使用QtDesigner来设计,这里只用了label、pushButton、lineedit,还有就是水平布局、垂直布局和菜单栏,还是比较简单。
代码编写
在QThread中更新UI
利用信号和槽机制。首先创建一个class,继承自QThread,在需要更新UI的时候发送一个信号
class detectDeviceThread(QThread):
detectSignal = pyqtSignal(object)
def __int__(self):
QThread.__init__(self)
def run(self):
while True:
deviceNum = lj_list_device_id(self)
self.detectSignal.emit(deviceNum)
time.sleep(3)
在UI层面,绑定信号和槽,然后实现该槽,UI的更新就在槽里执行。
def onDeviceDetected(self,data):
'''
检测到Android设备上线后的操作
:return:
'''
font = QtGui.QFont()
font.setFamily("微软雅黑 Light")
font.setPointSize(12)
font.setBold(True)
self.textBrowser_device_id.setFont(font)
if(common.PREVIOUS_DATA != data):
common.PREVIOUS_DATA = data
self.textBrowser_device_id.setText(data)
if not data.strip():
common.FLAG_DEVICE_ONLINE = False
else:
common.FLAG_DEVICE_ONLINE = True
def startDetectDevice(self):
'''
开启线程,检测Android设备上线
:return:
'''
self.detectThread = detectDeviceThread()
self.detectThread.detectSignal.connect(self.onDeviceDetected)
self.detectThread.start()
struct处理二进制数据
我这里需要变更BBCB镜像的某几个字节(类似于C语言中的结构体数据类型)的数据,需要使用到struct这个模块。来看段代码
fp = open("toc\\nvram.toc","rb+")
fp.seek(common.BBCB_OFFSET + 2,os.SEEK_SET)
manufacturer_id = fp.read(1)
manufacturer_id_new = int(self.lineEdit_manu_id.text())
if(manufacturer_id != manufacturer_id_new):
logging.debug("newmanufacturer_id: " + str(manufacturer_id_new))
fp.seek(-1,os.SEEK_CUR)
fp.write(struct.pack("B",manufacturer_id_new))
fp.flush()
首先是打开文件,进行文件定位,然后将要写入的数据按照特定的格式写入文件。struct中支持的格式如下表所示

在上例中,是将manufacturer_id_new的值以格式”B”,也就是C语言里的unsigned char写入到文件中。依照上表,如果是一个长度为5的字符串,格式应该是”5s”
logging模块的使用
这里使用python自带的logging作为日志系统。因为需要在多个模块内(多个文件)使用,我们在工程入口处进行全局的初始化
def initLogConfiguration():
'''
初始化日志配置
'''
logging.basicConfig(level = logging.DEBUG,
filename = common.LOGFILE,
filemode = 'a+',
format = '%(asctime)s - %(filename)s - line %(lineno)-4d - %(levelname)s - %(message)s',
datefmt = '%m-%d %H:%M')
这里是输出到文件,同样你也可以输出到控制台,通过stream参数指定,如果同时指定了filename和stream,logging会忽略stream。初始化完毕后,在其它需要输出log的模块就直接使用就可以了
logging.debug("some message")
跨平台
主要就是判断当前平台,然后进行不同方式的处理。这里使用platform库
import platform
PLATFORM_SYSTEM = platform.system()
OS_MAC = (PLATFORM_SYSTEM == "Darwin")
OS_WIN = (PLATFORM_SYSTEM == "Windows")
OS_LINUX = (PLATFORM_SYSTEM == "Linux")
源码地址
https://github.com/djstava/PyQt5Fastboot
PyQt5系列教程(五)制作fastboot烧写器的更多相关文章
- [译]Godot系列教程五 - 制作Godot编辑器插件
制作插件 下文仅针对2.1版本. 关于插件 插件是为编辑器扩展出更多有用工具的重要方式.它可以完全用GDScript和标准场景开发,甚至都不需重新加载编辑器就可生效.不像模块,你无需创建C++代码.也 ...
- PyQt5系列教程
PyQt5系列教程(一)Mac OS X下搭建Python3.5.1+PyQt5开发环境PyQt5系列教程(二)利用QtDesigner设计UI界面PyQt5系列教程(三)用py2exe进行程序打包P ...
- NGUI系列教程五(角色信息跟随)
在一些网络游戏中,我们常常可以看到角色的上方显示着角色的名称,等级,血量等信息.它们可以跟随角色移动,并且可以显示和隐藏.今天我们就来学习一下这些功能的实现方法.1. 新建unity工 程,导入NGU ...
- PyQt5系列教程(二)利用QtDesigner设计UI界面
软硬件环境 OS X EI Capitan Python 3.5.1 PyQt 5.5.1 PyCharm 5.0.1 前言 在PyQt5系列教程的第一篇http://blog.csdn.net/dj ...
- CRL快速开发框架系列教程五(使用缓存)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- Android Studio系列教程五--Gradle命令详解与导入第三方包
Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(五) Data Access Application Block 企业库数据库访问模块通过抽象工厂模式,允许用户 ...
- 【转】PyQt5系列教程(七)控件
PyQt5系列教程(七)控件 软硬件环境 Windows 10 Python 3.4.2 PyQt 5.5.1 PyCharm 5.0.4 前言 控件是PyQt应用程序的基石.PyQt5自带很多不 ...
随机推荐
- Java回顾之集合
在这篇文章里,我们关注Java中的集合(Collection).集合是编程语言中基础的一部分,Java自JDK早期,就引入了Java Collection Framework.设计JCF的那个人,后来 ...
- 利用Minhash和LSH寻找相似的集合(转)
问题背景 给出N个集合,找到相似的集合对,如何实现呢?直观的方法是比较任意两个集合.那么可以十分精确的找到每一对相似的集合,但是时间复杂度是O(n2).当N比较小时,比如K级,此算法可以在接受的时间范 ...
- 递归--练习2--noi6261汉诺塔
递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制: 1000ms 内存限制: 65536kB 描述 约19世纪末,在欧州 ...
- C#对象初始或器-Chapter3 P38
protected string GetMessage() { //如何构造和初始化泛型集合库中的一个数组和两个类. Product myProduct = ,Name="Kayak&quo ...
- ES6学习一 JS语言增强篇
一 背景 JavaScript经过二十来年年的发展,由最初简单的交互脚本语言,发展到今天的富客户端交互,后端服务器处理,跨平台(Native),以及小程序等等的应用.JS的角色越来越重要,处理场景越来 ...
- Alpha阶段第2周/共2周 Scrum立会报告+燃尽图 04
作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2287] 版本控制:https://git.coding.net/liuyy08 ...
- jQuery插件开发——全屏切换插件
这个插件包含三个部分:HTML结构.CSS代码和JS代码. HTML结构是固定的,结构如下: <!--全屏滚动--> <div class="fullpage-contai ...
- C++11_ 右值引用
版权声明:本文为博主原创文章,未经博主允许不得转载. 由于右值所产生的临时变量问题一直是一种诟病,C++11中引入了右值引用这个核心语言机制,来提升运行期性能. 首先我先说明一下什么是左值和右值: 左 ...
- HDU 1358
http://acm.hdu.edu.cn/showproblem.php?pid=1358 求某个前缀的周期,用Next求循环节的题目 #include <iostream> #incl ...
- .Net脱壳工具 de4dot参数说明/简易教程
de4dot /? 帮助原文 使用方法 de4dot "d:\xx.exe" -p xc -p xc 指定壳类型 , 这里是xc,表示Xenocode壳.这样会在exe的相同目录 ...