PyQt5系列教程(五)制作fastboot烧写器

/

软硬件环境

  • Windows 7
  • Python 3.4.2
  • PyQt 5.5.1
  • PyCharm 5.0.2

前言

fastboot是针对Android设备的一种刷机方式,它比recovery更底层,刷机速度更快。本文要完成的这个项目就是用PyQt5来给fastboot加个GUI层,使操作更加简单方便。

PyQt5Fastboot\_OverView

需求分析

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

PyQt5 command

本工程主要实现的是fastboot的烧录功能,其它的像获取、设置相关信息就没有涉及,有需要的话就自己去添加。

还有一个比较特殊的需求就是烧录的镜像需要修改的情况,我这里称它位BBCB,它的一部分数据由用户输入的。

界面设计

使用QtDesigner来设计,这里只用了label、pushButton、lineedit,还有就是水平布局、垂直布局和菜单栏,还是比较简单。

代码编写

在QThread中更新UI

利用信号和槽机制。首先创建一个class,继承自QThread,在需要更新UI的时候发送一个信号

  1. class detectDeviceThread(QThread):
  2. detectSignal = pyqtSignal(object)
  3. def __int__(self):
  4. QThread.__init__(self)
  5. def run(self):
  6. while True:
  7. deviceNum = lj_list_device_id(self)
  8. self.detectSignal.emit(deviceNum)
  9. time.sleep(3)

在UI层面,绑定信号和槽,然后实现该槽,UI的更新就在槽里执行。

  1. def onDeviceDetected(self,data):
  2. '''
  3. 检测到Android设备上线后的操作
  4. :return:
  5. '''
  6. font = QtGui.QFont()
  7. font.setFamily("微软雅黑 Light")
  8. font.setPointSize(12)
  9. font.setBold(True)
  10. self.textBrowser_device_id.setFont(font)
  11. if(common.PREVIOUS_DATA != data):
  12. common.PREVIOUS_DATA = data
  13. self.textBrowser_device_id.setText(data)
  14. if not data.strip():
  15. common.FLAG_DEVICE_ONLINE = False
  16. else:
  17. common.FLAG_DEVICE_ONLINE = True
  18. def startDetectDevice(self):
  19. '''
  20. 开启线程,检测Android设备上线
  21. :return:
  22. '''
  23. self.detectThread = detectDeviceThread()
  24. self.detectThread.detectSignal.connect(self.onDeviceDetected)
  25. self.detectThread.start()

struct处理二进制数据

我这里需要变更BBCB镜像的某几个字节(类似于C语言中的结构体数据类型)的数据,需要使用到struct这个模块。来看段代码

  1. fp = open("toc\\nvram.toc","rb+")
  2. fp.seek(common.BBCB_OFFSET + 2,os.SEEK_SET)
  3. manufacturer_id = fp.read(1)
  4. manufacturer_id_new = int(self.lineEdit_manu_id.text())
  5. if(manufacturer_id != manufacturer_id_new):
  6. logging.debug("newmanufacturer_id: " + str(manufacturer_id_new))
  7. fp.seek(-1,os.SEEK_CUR)
  8. fp.write(struct.pack("B",manufacturer_id_new))
  9. fp.flush()

首先是打开文件,进行文件定位,然后将要写入的数据按照特定的格式写入文件。struct中支持的格式如下表所示

struct format

在上例中,是将manufacturer_id_new的值以格式”B”,也就是C语言里的unsigned char写入到文件中。依照上表,如果是一个长度为5的字符串,格式应该是”5s”

logging模块的使用

这里使用python自带的logging作为日志系统。因为需要在多个模块内(多个文件)使用,我们在工程入口处进行全局的初始化

  1. def initLogConfiguration():
  2. '''
  3. 初始化日志配置
  4. '''
  5. logging.basicConfig(level = logging.DEBUG,
  6. filename = common.LOGFILE,
  7. filemode = 'a+',
  8. format = '%(asctime)s - %(filename)s - line %(lineno)-4d - %(levelname)s - %(message)s',
  9. datefmt = '%m-%d %H:%M')

这里是输出到文件,同样你也可以输出到控制台,通过stream参数指定,如果同时指定了filename和stream,logging会忽略stream。初始化完毕后,在其它需要输出log的模块就直接使用就可以了

  1. logging.debug("some message")

跨平台

主要就是判断当前平台,然后进行不同方式的处理。这里使用platform库

  1. import platform
  2. PLATFORM_SYSTEM = platform.system()
  3. OS_MAC = (PLATFORM_SYSTEM == "Darwin")
  4. OS_WIN = (PLATFORM_SYSTEM == "Windows")
  5. OS_LINUX = (PLATFORM_SYSTEM == "Linux")

源码地址

https://github.com/djstava/PyQt5Fastboot

转载请注明作者和出处,并添加本页链接。
原文链接:http://xugaoxiang.com/post/29

给我留言