程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PyQt5系列教程(五)制作fastboot燒寫器

PyQt5系列教程(五)制作fastboot燒寫器

編輯:關於PHP編程

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的時候發送一個信號

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 = Truedef 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中支持的格式如下表所示

struct format

在上例中,是將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 platformPLATFORM_SYSTEM = platform.system()OS_MAC = (PLATFORM_SYSTEM == "Darwin")OS_WIN = (PLATFORM_SYSTEM == "Windows")OS_LINUX = (PLATFORM_SYSTEM == "Linux") 

源碼地址

https://github.com/djstava/PyQt5Fastboot

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved