예제 #1
0
class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self._options = {}
        self._count = 0
        self._size = 0
        self._netType = '_wifi'
        self._message_box_count = 0
        self._lastTotal = 0
        self._export = None
        self._items = []
        self._model=[]
        self._last_adb_err_time = 0
        _helpAction = QPushButton('帮助')
        _helpAction.clicked.connect(self.onHelpClick)
        _helpAction.setFlat(True)
        _helpAction.setAutoFillBackground(True)
        _palette = QPalette()
        _palette.setColor(QPalette.ButtonText, QColor('#1E90FF'))
        _palette.setColor(QPalette.Button, QColor('#DCDCDC'))
        _helpAction.setPalette(_palette)
        _aboutAction = QPushButton('关于')
        _aboutAction.clicked.connect(self.onAboutClick)
        _aboutAction.setFlat(True)
        _aboutAction.setAutoFillBackground(True)
        _palette = QPalette()
        _palette.setColor(QPalette.ButtonText, QColor('#1E90FF'))
        _palette.setColor(QPalette.Button, QColor('#DCDCDC'))
        _aboutAction.setPalette(_palette)
        self.toolbar = self.addToolBar('help')
        self.toolbar.addWidget(_helpAction)
        self.toolbar.addSeparator()
        self.toolbar.addWidget(_aboutAction)
        _widget = QWidget()
        self.layout = QVBoxLayout(_widget)
        self.setCentralWidget(_widget)
        self.resize(600, 200)
        self.setWindowTitle('性能监控')
        self.setOptionLayout()

    def setOptionLayout(self):
        self._titleLayout = QVBoxLayout()
        self.newCheckBtn(CPU, NETWORK)
        self.newCheckBtn(FPS, BATTERY)
        self.newCheckBtn(MEMORY, TEMPERATURE)
        self.newCheckBtn(TOTAL_MEMORY, TOTAL_CPU)
        self.newInput()
        _hLayout = QHBoxLayout()
        _checkbox = QCheckBox('导出Excel文件', self)
        _checkbox.stateChanged.connect(self.onExportChanged)
        _hLayout.addWidget(_checkbox)
        self._titleLayout.addLayout(_hLayout)
        btn = QPushButton('开始')
        btn.clicked.connect(self.onStart)
        self._titleLayout.addWidget(btn)
        self.layout.addLayout(self._titleLayout)

    def check(self):
        print('Checking...')
        if not remnant:
            QMessageBox.warning(self, '警告:软件到期!', '请关注微信公众号 "测试一般不一般" ,\n进行软件更新,谢谢~')
            self.close()
            sys.exit(1)
        print('OK...')

    def onHelpClick(self):
        QMessageBox.information(self, '帮助', '请关注微信公众号: "测试一般不一般" ,\n查看性能监控工具使用测试说明~')

    def onAboutClick(self):
        QMessageBox.information(self, '关于', '版本号 : {}\n日期 : {}'.format(identify.VERSION, identify.DATE))

    def onNetworkChanged(self, state):
        if state == Qt.Checked:
            self._netType = '_local'
        else:
            self._netType = '_wifi'

    def onExportChanged(self, state):
        self._export = state

    def newInput(self):
        layout = QHBoxLayout()
        self._App__pkg_edit = QLineEdit()
        self._App__pkg_edit.setPlaceholderText('包名')
        self._App__pkg_edit.setText('com.tct.launcher')#com.tct.live
        self._App__serial_edit = QLineEdit()
        self._App__serial_edit.setPlaceholderText('设备号(单设备,可不输)')
        layout.addWidget(self._App__pkg_edit)
        layout.addWidget(self._App__serial_edit)
        self._titleLayout.addLayout(layout)

    def newCheckBtn(self, name1, name2):
        layout = QHBoxLayout()
        btn = QPushButton(name1)
        btn.setCheckable(True)
        btn.clicked[bool].connect(self.onNetworkCheck)
        layout.addWidget(btn)
        btn2 = QPushButton(name2)
        btn2.setCheckable(True)
        btn2.clicked[bool].connect(self.onNetworkCheck)
        layout.addWidget(btn2)
        self._titleLayout.addLayout(layout)

    def onStart(self):
        items = [k if k != 'network' else k + self._netType for k, v in self._options.items() if v]
        _it = 'network' + self._netType
        self._networkIndex = utils.listFind(items, _it) + 1
        self._fpsIndex = utils.listFind(items, 'fps') + 1
        if self._networkIndex > 0:
            items.append(_it + '_speed')
            items.append('network_all_speed')
        items.insert(0, 'timestamp')
        items.append('curActivity')
        self._curIndex = len(items) - 1
        if len(items) <= 1:
            QMessageBox.warning(self, '警告!', '一项指标都没选!')
            return
        pkg = self._App__pkg_edit.text()
        if not pkg:
            QMessageBox.warning(self, '错误!', '包名没有传入!')
            return
        serial = self._App__serial_edit.text()
        data = (items, pkg, serial)
        clearLayout(self._titleLayout)
        self._size = len(items)
        _windowSize = 130 * self._size
        _windowSize = _windowSize if _windowSize > 500 else 500
        self.resize(_windowSize, 500)
        self.setWorkerLayout(items)
        self.startThreads(data)

    def onReset(self):
        self.onClearModels()
        self.abortWorkers()
        adb.cpuHasRun = False
        clearLayout(self.layout)
        self.resize(600, 200)
        self.setOptionLayout()

    def onNetworkCheck(self, pressed):
        source = self.sender()
        name = NAMES[source.text()]
        self._options[name] = pressed

    def setWorkerLayout(self, items):
        self._titleLine = [F_NAMES[it] for it in items]
        _hLayout = QHBoxLayout()
        if self._export:
            self.exportBtn = QPushButton('导出')
            self.exportBtn.setEnabled(False)
            self.exportBtn.clicked.connect(self.onExport)
            _hLayout.addWidget(self.exportBtn)
        self.clearBtn = QPushButton('清空')
        self.clearBtn.clicked.connect(self.onClearModels)
        _hLayout.addWidget(self.clearBtn)
        self.exitBtn = QPushButton('停止')
        self.exitBtn.clicked.connect(self.abortWorkers)
        _hLayout.addWidget(self.exitBtn)
        self.resetBtn = QPushButton('重置')
        self.resetBtn.clicked.connect(self.onReset)
        self.resetBtn.setEnabled(False)
        _hLayout.addWidget(self.resetBtn)
        _timeLayout = QHBoxLayout()
        self._start_time = time.time()
        self._startLabel = QLabel('开始 :' + time.strftime('%H:%M:%S', time.localtime()))
        self._totalLabel = QLabel('总耗时 :')
        self.startTotalLabel = QLabel('初始流量 :')
        self.endTotalLabel = QLabel('总流量 :')
        _timeLayout.addWidget(self._startLabel)
        _timeLayout.addWidget(self._totalLabel)
        _timeLayout.addWidget(self.startTotalLabel)
        _timeLayout.addWidget(self.endTotalLabel)
        groupBox = QGroupBox('性能')
        self._treeView = QTreeView()
        self._treeView.setRootIsDecorated(True)
        self._treeView.setAutoScroll(True)
        self._treeView.setAlternatingRowColors(True)
        tree_layout = QHBoxLayout()
        tree_layout.addWidget(self._treeView)
        groupBox.setLayout(tree_layout)
        self._model = QStandardItemModel(0, self._size, self)
        for index in range(self._size):
            self._model.setHeaderData(index, Qt.Horizontal, F_NAMES[items[index]])

        self._treeView.setModel(self._model)
        self.layout.addLayout(_hLayout)
        self.layout.addLayout(_timeLayout)
        self.layout.addWidget(groupBox)
        if self._networkIndex > 0:
            self.startTotalLabel.setText('初始流量 :0k')

    def onClearModels(self):
        if self._count == 0:
            return
        self._model.removeRows(0,self._count)
        self._count = 0

    def onExport(self):
        try:
            data = Dataset(*self._items, **{'headers': self._titleLine})
            fileName = time.strftime('%m-%d-%H_%M_%S', time.localtime()) + '-performance.xls'
            with open(fileName, 'wb') as (f):
                f.write(data.export('xls'))
                QMessageBox.information(self, '导出成功!', 'Excel文件名为' + fileName)
        except Exception as err:
            try:
                QMessageBox.warning(self, '导出异常!', str(err))
            finally:
                err = None
                del err

    def addModel(self, items):
        # if self._count > 1000:
        #     self.onClearModels()
        # else:
        if self._networkIndex > 0:
            self._lastTotal = items[self._networkIndex]
            items[self._networkIndex] = utils.number_format(items[self._networkIndex])
        self._model.insertRow(self._count)
        for index in range(self._size):
            self._model.setData(self._model.index(self._count, index), items[index])

        if self._fpsIndex > 0:
            if float(items[self._fpsIndex] > 16.66):
                self._model.item(self._count, self._fpsIndex).setForeground(QBrush(QColor(255, 0, 0)))
        if not items[self._curIndex].startswith(';'):
            self._model.item(self._count, self._curIndex).setForeground(QBrush(QColor(255, 0, 0)))
            items[self._curIndex] += '(out)'
        else:
            items[self._curIndex] = items[self._curIndex].replace(';', '')
            self._model.setData(self._model.index(self._count, self._curIndex), items[self._curIndex])
        self._items.append(items)
        self._count += 1
        self._treeView.scrollToBottom()

    def startThreads(self, data):
        worker = Worker(1)
        worker.setData(data)
        thread = QThread()
        worker.moveToThread(thread)
        worker.sigStep.connect(self.onWorkerStep)
        worker.sigInit.connect(self.onInitCompleted)
        worker.sigAdbErr.connect(self.onAdbErr)
        thread.started.connect(worker.work)
        thread.start()
        self.thread = thread
        self.worker = worker

    def onInitCompleted(self):
        print('数据初始化结束!!!')

    @pyqtSlot(list)
    def onWorkerStep(self, items: list):
        self.addModel(items)

    def abortWorkers(self):
        if self._export:
            self.exportBtn.setEnabled(True)
        self.clearBtn.setEnabled(False)
        self.exitBtn.setEnabled(False)
        self.resetBtn.setEnabled(True)
        adb.cpuHasRun = False
        total = time.time() - self._start_time
        self._totalLabel.setText('总耗时 : %s' % utils.time2hms(int(total)))
        if self._networkIndex > 0:
            self.endTotalLabel.setText('总流量 : {}'.format(utils.kbFormat(self._lastTotal)))
        self.worker.abort()
        self.thread.quit()

    def onAdbErr(self, err):
        if self._message_box_count > 0:
            return
        self._message_box_count += 1
        reply = QMessageBox.question(self, 'adb连接错误!', err, QMessageBox.Yes)
        if reply == QMessageBox.Yes:
            self._message_box_count -= 1