前言

Python标准库更多的适合处理后台任务,唯一的图形库tkinter使用起来很不方便,所以后来出现了针对Python图形界面开发的扩展库,今天老猿要介绍的是主流Python图形界面扩展库之一的PyQt。

在介绍PyQt之前,必须先简单介绍一下Qt。Qt是一个C++可视化开发平台,是一个跨平台的C++图形用户界面应用程序框架(C++ GUI),能够为应用程序开发者提供建立图形用户界面所需的功能。Qt是完全面向对象的、易扩展,可应用于组件编程,并可以用于嵌入式开发。它是目前流行的Linux桌面环境KDE 的基础,是Linux和嵌入式操作系统下的主流图形界面开发环境,其最大优势在于只需编写一次代码,就能编译部署在任何操作系统和硬件上。因为擅长图形界面开发,如今更扩展到移动及嵌入式设备开发。对于商业软件公司来说极具价值,可以广泛应用于物联网特别是智能汽车、智能制造业等的研发。

PyQt是一个创建Python GUI应用程序的工具包,是Qt和Python结合的一个产物,可以说是为了将Qt的功能用于Python开发的一个Qt的Python包装器。它是Python编程语言和Qt库的成功融合。

PyQt的整个程序开发框架,老猿认为主要包括如下部分:

图形界面编辑的工具:Qt Designer
不同部分信息交换机制:信号和槽
界面操作的事件及捕获机制
一套控制界面显示和数据存储分离以及映射的机制:Model/View架构
通过这些重要的工具和框架机制,开发人员可以设计对应的GUI图形化界面、定义不同部件的操作及响应、捕获部件或应用的消息以及实现界面显示组件和数据存储组件的联动,从而构造完整的应用程序框架。
 

一、功能测试界面实现代码

UI_ZJ.py

# -*- coding: utf-8 -*-

from PyQt4 import QtGui,Qt
import re
from Main_ZJ import *
from Queue import Queue     #队列

try:
    _fromUtf8 = QtCore.QString.fromUtf8     #将utf8编码赋值变量
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

#创建主窗口类
class Ui_Form(object):
    #拖拽控件描述
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))       #设置窗口名
        Form.resize(1099, 620)      #设置窗口大小
        self.centralwidget = QtGui.QWidget(Form)            #创建控件对象
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)    #窗口改变是可以伸展和搜索
        sizePolicy.setHorizontalStretch(100)
        sizePolicy.setVerticalStretch(100)
        sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
        Form.setSizePolicy(sizePolicy)
        Form.setMinimumSize(QtCore.QSize(0, 0))
        Form.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.horizontalLayout = QtGui.QHBoxLayout(Form)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.groupBox = QtGui.QGroupBox(Form)
        self.groupBox.setSizePolicy(sizePolicy)
        self.groupBox.setMinimumSize(QtCore.QSize(500, 300))
        self.groupBox.setAlignment(QtCore.Qt.AlignJustify|QtCore.Qt.AlignVCenter)
        self.groupBox.setFlat(False)
        self.groupBox.setCheckable(False)
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.groupBox1 = QtGui.QGroupBox(self.groupBox)
        self.groupBox1.setGeometry(QtCore.QRect(10, 100, 231, 161))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(self.groupBox1.sizePolicy().hasHeightForWidth())
        self.groupBox1.setSizePolicy(sizePolicy)
        self.groupBox1.setTitle(_fromUtf8(""))
        self.groupBox1.setObjectName(_fromUtf8("groupBox1"))
        self.label = QtGui.QLabel(self.groupBox1)
        self.label.setGeometry(QtCore.QRect(10, 10, 72, 15))
        font = QtGui.QFont()
        font.setPointSize(9)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))
        self.Select_PD = QtGui.QComboBox(self.groupBox1)
        self.Select_PD.setGeometry(QtCore.QRect(100, 10, 121, 22))
        self.Select_PD.setObjectName(_fromUtf8("Select_PD"))
        self.Telnet = QtGui.QCheckBox(self.groupBox1)
        self.Telnet.setGeometry(QtCore.QRect(100, 130, 71, 19))
        self.Telnet.setObjectName(_fromUtf8("Telnet"))
        self.SSH = QtGui.QCheckBox(self.groupBox1)
        self.SSH.setGeometry(QtCore.QRect(180, 130, 61, 19))
        self.SSH.setObjectName(_fromUtf8("SSH"))
        self.SSH.setChecked(1)
        self.label_13 = QtGui.QLabel(self.groupBox1)
        self.label_13.setGeometry(QtCore.QRect(10, 130, 72, 15))
        self.label_13.setObjectName(_fromUtf8("label_13"))
        self.Host_IP = QtGui.QLineEdit(self.groupBox1)
        self.Host_IP.setGeometry(QtCore.QRect(100, 40, 121, 21))
        self.Host_IP.setObjectName(_fromUtf8("Host_IP"))
        self.label_3 = QtGui.QLabel(self.groupBox1)
        self.label_3.setGeometry(QtCore.QRect(10, 40, 72, 15))
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.label_4 = QtGui.QLabel(self.groupBox1)
        self.label_4.setGeometry(QtCore.QRect(10, 100, 91, 16))
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.Server_IP = QtGui.QLineEdit(self.groupBox1)
        self.Server_IP.setGeometry(QtCore.QRect(100, 100, 121, 21))
        self.Server_IP.setObjectName(_fromUtf8("Server_IP"))
        self.groupBox_4 = QtGui.QGroupBox(self.groupBox)
        self.groupBox_4.setGeometry(QtCore.QRect(10, 270, 231, 181))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBox_4.sizePolicy().hasHeightForWidth())
        self.groupBox_4.setSizePolicy(sizePolicy)
        self.groupBox_4.setObjectName(_fromUtf8("groupBox_4"))
        self.label_9 = QtGui.QLabel(self.groupBox_4)
        self.label_9.setGeometry(QtCore.QRect(10, 20, 72, 15))
        self.label_9.setObjectName(_fromUtf8("label_9"))
        self.label_10 = QtGui.QLabel(self.groupBox_4)
        self.label_10.setGeometry(QtCore.QRect(10, 50, 72, 15))
        self.label_10.setObjectName(_fromUtf8("label_10"))
        self.label_11 = QtGui.QLabel(self.groupBox_4)
        self.label_11.setGeometry(QtCore.QRect(10, 80, 72, 15))
        self.label_11.setObjectName(_fromUtf8("label_11"))
        self.label_12 = QtGui.QLabel(self.groupBox_4)
        self.label_12.setGeometry(QtCore.QRect(10, 110, 72, 15))
        self.label_12.setObjectName(_fromUtf8("label_12"))
        self.Boot = QtGui.QLineEdit(self.groupBox_4)
        self.Boot.setGeometry(QtCore.QRect(100, 20, 121, 21))
        self.Boot.setObjectName(_fromUtf8("Boot"))
        self.Kernel = QtGui.QLineEdit(self.groupBox_4)
        self.Kernel.setGeometry(QtCore.QRect(100, 50, 121, 21))
        self.Kernel.setObjectName(_fromUtf8("Kernel"))
        self.APP = QtGui.QLineEdit(self.groupBox_4)
        self.APP.setGeometry(QtCore.QRect(100, 80, 121, 21))
        self.APP.setObjectName(_fromUtf8("APP"))
        self.Config = QtGui.QLineEdit(self.groupBox_4)
        self.Config.setGeometry(QtCore.QRect(100, 110, 121, 21))
        self.Config.setObjectName(_fromUtf8("Config"))
        self.MAC = QtGui.QLineEdit(self.groupBox_4)
        self.MAC.setGeometry(QtCore.QRect(100, 140, 121, 21))
        self.MAC.setObjectName(_fromUtf8("MAC"))
        self.label_14 = QtGui.QLabel(self.groupBox_4)
        self.label_14.setGeometry(QtCore.QRect(10, 140, 101, 16))
        self.label_14.setObjectName(_fromUtf8("label_14"))
        self.groupBox_5 = QtGui.QGroupBox(self.groupBox)
        self.groupBox_5.setGeometry(QtCore.QRect(10, 460, 231, 111))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBox_5.sizePolicy().hasHeightForWidth())
        self.groupBox_5.setSizePolicy(sizePolicy)
        self.groupBox_5.setObjectName(_fromUtf8("groupBox_5"))
        self.Upgrade = QtGui.QCheckBox(self.groupBox_5)
        self.Upgrade.setGeometry(QtCore.QRect(10, 20, 91, 19))
        self.Upgrade.setObjectName(_fromUtf8("Upgrade"))
        self.Test = QtGui.QCheckBox(self.groupBox_5)
        self.Test.setGeometry(QtCore.QRect(10, 50, 91, 19))
        self.Test.setObjectName(_fromUtf8("Test"))
        self.Test.setChecked(1)
        self.Modify_IP = QtGui.QCheckBox(self.groupBox_5)
        self.Modify_IP.setGeometry(QtCore.QRect(110, 50, 91, 19))
        self.Modify_IP.setObjectName(_fromUtf8("Modify_IP"))
        self.Format_Disk = QtGui.QCheckBox(self.groupBox_5)
        self.Format_Disk.setGeometry(QtCore.QRect(110, 20, 111, 19))
        self.Format_Disk.setObjectName(_fromUtf8("Format_Disk"))
        self.Rsync = QtGui.QCheckBox(self.groupBox_5)
        self.Rsync.setGeometry(QtCore.QRect(10, 80, 91, 19))
        self.Rsync.setObjectName(_fromUtf8("Rsync"))
        self.Shipout = QtGui.QCheckBox(self.groupBox_5)
        self.Shipout.setGeometry(QtCore.QRect(110, 80, 91, 19))
        self.Shipout.setObjectName(_fromUtf8("Shipout"))
        self.Start = QtGui.QPushButton(self.groupBox)
        self.Start.setGeometry(QtCore.QRect(990, 550, 71, 31))
        self.Start.setObjectName(_fromUtf8("Start"))
        self.Stop = QtGui.QPushButton(self.groupBox)
        self.Stop.setGeometry(QtCore.QRect(900, 550, 71, 31))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.Stop.sizePolicy().hasHeightForWidth())
        self.Stop.setSizePolicy(sizePolicy)
        self.Stop.setObjectName(_fromUtf8("Stop"))
        self.text = QtGui.QTextEdit(self.groupBox)
        self.text.setGeometry(QtCore.QRect(250, 10, 821, 531))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.text.sizePolicy().hasHeightForWidth())
        self.text.setSizePolicy(sizePolicy)
        self.text.setSizeIncrement(QtCore.QSize(99, 100))
        self.text.setBaseSize(QtCore.QSize(100, 100))
        self.text.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.text.setAutoFillBackground(True)
        self.text.setObjectName(_fromUtf8("text"))
        self.Current_Test = QtGui.QLabel(self.groupBox)
        self.Current_Test.setGeometry(QtCore.QRect(250, 550, 431, 31))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.Current_Test.setFont(font)
        self.Current_Test.setText(_fromUtf8(""))
        self.Current_Test.setObjectName(_fromUtf8("Current_Test"))
        self.name = QtGui.QLabel(self.groupBox)
        self.name.setGeometry(QtCore.QRect(10, 10, 231, 41))        #设置标签大小与位置
        self.name.setText(_fromUtf8(""))
        self.name.setTextFormat(QtCore.Qt.AutoText)
        self.name.setAlignment(QtCore.Qt.AlignCenter)
        self.name.setObjectName(_fromUtf8("name"))      #设置标签名
        self.name_2 = QtGui.QLabel(self.groupBox)
        self.name_2.setGeometry(QtCore.QRect(10, 60, 231, 31))
        self.name_2.setText(_fromUtf8(""))
        self.name_2.setTextFormat(QtCore.Qt.AutoText)
        self.name_2.setAlignment(QtCore.Qt.AlignCenter)
        self.name_2.setObjectName(_fromUtf8("name_2"))
        self.SN = QtGui.QLineEdit(self.groupBox)
        self.SN.setGeometry(QtCore.QRect(110, 170, 121, 21))
        self.SN.setObjectName(_fromUtf8("SN"))
        self.Lab_SN_3 = QtGui.QLabel(self.groupBox)
        self.Lab_SN_3.setGeometry(QtCore.QRect(20, 170, 91, 16))
        self.Lab_SN_3.setObjectName(_fromUtf8("Lab_SN_3"))
        self.horizontalLayout.addWidget(self.groupBox)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    #将所有控件调用utf8编码重新编译并设置显示文字
    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))       #设置窗口标题
        self.label.setText(_translate("Form", "LRU:", None))       #设置标签显示文字
        self.Telnet.setText(_translate("Form", "Telnet", None))
        self.SSH.setText(_translate("Form", "SSH", None))
        self.label_13.setText(_translate("Form", "Connection:", None))
        self.label_3.setText(_translate("Form", "LRU address:", None))
        self.label_4.setText(_translate("Form", "Server Address:", None))
        self.groupBox_4.setTitle(_translate("Form", "Upgrade Burning", None))
        self.label_9.setText(_translate("Form", "Packages:", None))
        self.label_10.setText(_translate("Form", "Kernel:", None))
        self.label_11.setText(_translate("Form", "APP:", None))
        self.label_12.setText(_translate("Form", "Config:", None))
        self.label_14.setText(_translate("Form", "MAC(后六位):", None))
        self.groupBox_5.setTitle(_translate("Form", "Test items", None))
        self.Upgrade.setText(_translate("Form", "Upgrade", None))
        self.Test.setText(_translate("Form", "Test", None))
        self.Modify_IP.setText(_translate("Form", "Modify IP", None))
        self.Shipout.setText(_translate("Form", "Factory", None))
        self.Start.setText(_translate("Form", "Start Test", None))
        self.Stop.setText(_translate("Form", "End Test", None))
        self.Lab_SN_3.setText(_translate("Form", "SN:", None))
        self.Format_Disk.setText(_translate("Form", "Formatting", None))
        self.Rsync.setText(_translate("Form", "Synchronous Data", None))


class Windows(QtGui.QWidget):
    def __init__( self,ID="", parent = None):
        super(Windows, self ).__init__(parent)
        #self.thread = Main_Test()
        self.ID= ID
        self.new = Ui_Form()        #创建Ui_Form对象
        self.new.setupUi(self)      #调用setupUi方法
        self.data = Queue()         #创建一个队列对象
        self.Main_Test = Main_Test(self.data)       #创建Main_Test对象
        self.Consumer = Consumer(self.data)         #创建一个Consumer对象
        self.setWindowTitle(u"xxxxxx限公司-功能测试")        #设置窗口标题
        self.setWindowFlags(Qt.Qt.MSWindowsFixedSizeDialogHint)         #禁止对话框放大缩小
        self.new.name.setText("<font color=black><font size = 8>%s</font>" % u"GNS")
        self.new.name_2.setText("<font color=black><font size = 4>%s</font>" % u"LRU ATE")
        self.group = QtGui.QButtonGroup(self)
        self.group.setExclusive(True)               #容器内的选项框只能选择一种
        self.group.addButton(self.new.Test)
        self.group.addButton(self.new.Upgrade)
        self.group.addButton(self.new.Modify_IP)
        self.group.addButton(self.new.Format_Disk)
        self.group.addButton(self.new.Rsync)
        self.group.addButton(self.new.Shipout)
        self.group1 = QtGui.QButtonGroup(self)
        self.group1.setExclusive(True)
        self.group1.addButton(self.new.Telnet)
        self.group1.addButton(self.new.SSH)

        self.new.Select_PD.addItem("GNS")

        self.new.Rsync.setDisabled(1)           #设置同步数据不可用
        self.new.Format_Disk.setDisabled(1)     #设置硬盘格式化不可用
        self.new.Upgrade.setDisabled(1)         #设置升级不可用
        self.new.Modify_IP.setDisabled(1)
        self.new.Shipout.setDisabled(1)

        self.new.label.setToolTip(u'LRU')  # 鼠标悬停提示
        self.new.label_3.setToolTip(u'LRU地址')
        self.new.label_4.setToolTip(u'服务器地址')
        self.new.label_13.setToolTip(u'连接方式')
        self.new.groupBox_4.setToolTip(u'升级烧录')
        self.new.groupBox_5.setToolTip(u'测试项目')
        self.new.Upgrade.setToolTip(u'升级')
        self.new.Test.setToolTip(u'测试')
        self.new.Modify_IP.setToolTip(u'修改IP')
        self.new.Shipout.setToolTip(u'出厂配置')
        self.new.Start.setToolTip(u'开始测试')
        self.new.Stop.setToolTip(u'结束测试')
        self.new.Lab_SN_3.setToolTip(u'SN')
        self.new.Format_Disk.setToolTip(u'硬盘格式化')
        self.new.Rsync.setToolTip(u'同步数据')

        #self.setWindowFlags(Qt.Qt.FramelessWindowHint)
        #窗口居中显示
        #desktop =QtGui.QApplication.desktop()
        #width = desktop.width()
        #height = desktop.height()
        #self.move((width - self.width())/2, (height - self.height())/2)

        #界面信号传递
        self.new.Start.setStyleSheet("QPushButton{">self.new.Stop.setStyleSheet("QPushButton{">self.connect(self.new.Start, QtCore.SIGNAL('clicked()'), self.Start)        #连接信号槽Start Test函数
        self.connect(self.new.Boot,QtCore.SIGNAL('selectionChanged()'),self.Get_Filename)   #连接升级文件选择方法
        self.connect(self.new.Kernel,QtCore.SIGNAL('selectionChanged()'),self.Get_Filename)
        self.connect(self.new.APP,QtCore.SIGNAL('selectionChanged()'),self.Get_Filename)
        self.connect(self.new.Config,QtCore.SIGNAL('selectionChanged()'),self.Get_Filename)
        self.connect(self.new.Test,QtCore.SIGNAL('clicked()'),self.select)          #连接测试选择框方法
        self.connect(self.new.Upgrade,QtCore.SIGNAL('clicked()'),self.select)       #连接升级选择框方法
        self.connect(self.new.Modify_IP,QtCore.SIGNAL('clicked()'),self.select)     #连接修改IP选择框方法
        self.connect(self.new.Format_Disk,QtCore.SIGNAL('clicked()'),self.select)   #连接硬盘格式化选择框方法
        self.connect(self.new.Shipout,QtCore.SIGNAL('clicked()'),self.select)       #连接出厂配置选择框方法
        self.new.Select_PD.currentIndexChanged.connect(self.GNS_select)

        self.connect(self.Main_Test,QtCore.SIGNAL('error'), self.error)             #主测试程序与设置测试错误消息显示为红色
        self.connect(self.Main_Test,QtCore.SIGNAL('output(QString)'),self.SlotAdd)  #主测试程序与测试信息追加到文本框中
        self.connect(self.Main_Test,QtCore.SIGNAL('stop'),self.SlotStop)            #主测试程序与测试信息终止
        self.connect(self.Main_Test,QtCore.SIGNAL('input'),self.input_ip_address)   #主测试程序与提示IP地址输入
        self.connect(self.Main_Test,QtCore.SIGNAL('ship'),self.Ship_Out_Address)    #主测试程序与提示外部地址输入
        self.connect(self.Main_Test,QtCore.SIGNAL('Prompt'),self.Prompt)            #主测试程序与消息选择框
        self.connect(self.new.Stop,QtCore.SIGNAL('clicked()'),self.Stop)            #主测试程序与测试程序终止
        self.connect(self.Main_Test, QtCore.SIGNAL('color'), self.Cell_Color)       #主测试程序与开始控件颜色设置
        self.connect(self.Main_Test, QtCore.SIGNAL('pass'), self.Cell_Pass)         #主测试程序与设置测试信息显示为绿色
        self.connect(self.Main_Test, QtCore.SIGNAL('dis_message'), self.display_test_information)   #主测试程序与设置测试信息显示为蓝色

    #变量定义
    def Var(self):
        self.select_PD =self.new.Select_PD.currentText()
        self.tn = self.new.Telnet
        self.SSH = self.new.SSH
        self.Host_IP =str(self.new.Host_IP.text())
        self.Server_IP=str(self.new.Server_IP.text())
        self.SN = self.new.SN.text()
        self.MAC = '5C:E0:CA:'+ self.new.MAC.text()
        self.Boot = self.new.Boot.text()
        self.Kernel = self.new.Kernel.text()
        self.APP = self.new.APP.text()
        self.Config = self.new.Config.text()
        self.Upgrade = self.new.Upgrade
        self.Test = self.new.Test
        self.Modify_IP = self.new.Modify_IP
        self.Format_Disk = self.new.Format_Disk
        self.Rsync = self.new.Rsync
        self.Shipout = self.new.Shipout

    #控件状态设置
    def select(self):
        self.new.MAC.setDisabled(1)             #设置为不可用状态
        self.new.Boot.setDisabled(1)
        self.new.Kernel.setDisabled(1)
        self.new.APP.setDisabled(1)
        self.new.Config.setDisabled(1)
        self.new.SN.setDisabled(1)
        self.new.Server_IP.setDisabled(1)
        if self.new.Shipout.isChecked():        #检测出厂配置是否选中
            self.new.Config.setDisabled(0)      #设置为可用状态
            self.new.Server_IP.setDisabled(0)   #设置为可用状态
        elif self.new.Upgrade.isChecked():      #检测升升级是否选中
            self.new.MAC.setDisabled(0)         #设置为可用状态
            self.new.Boot.setDisabled(0)
            self.new.Kernel.setDisabled(0)
            self.new.APP.setDisabled(0)
            self.new.Config.setDisabled(0)
            self.new.Server_IP.setDisabled(0)
        elif self.new.Test.isChecked():         #检测测试是否选中
            self.new.SN.setDisabled(0)          #设置为可用状态
            self.new.Server_IP.setDisabled(0)

    def GNS_select(self,message):
        if message !=9:
            self.new.Format_Disk.setDisabled(1)
            self.new.Rsync.setDisabled(1)

    #开始控件颜色设置
    def Cell_Color(self, message):
        self.new.Start.setStyleSheet(message)

    #设置测试信息显示为绿色
    def Cell_Pass(self,message):
        self.new.text.append("<font color=green><font size = 4>%s</font>" % message)

    #设置测试错误消息显示为红色
    def error(self,message):
        if message !="":
            self.new.text.append("<font color=red><font size = 4>%s</font>" %message)

    #设置测试信息显示为蓝色
    def display_test_information(self,message):
        self.new.text.append("<font color=blue><font size = 4>%s</font>"%message)

    #提示IP地址输入
    def input_ip_address(self,message):
        if message != " ":
            Input_IP_address,OK=QtGui.QInputDialog.getText(self, U"Input IP",message,QtGui.QLineEdit.Normal, "")    #弹框Input IP
            match ="^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
            if re.match(match,Input_IP_address):
                self.Main_Test.Input_IP_address = Input_IP_address
                self.Main_Test.isWait = False
            else:
                return self.input_ip_address(u"The IP address format is incorrectly entered. The format should be:x.x.x.x")

    #提示外部地址输入
    def Ship_Out_Address(self,message):
        if message != " ":
            Ship_Out_Address,OK=QtGui.QInputDialog.getText(self, U"Input IP",message,QtGui.QLineEdit.Normal, "")
            self.Main_Test.Ship_Out_Address=Ship_Out_Address
            self.Main_Test.isWait=False

    #消息选择框
    def Prompt(self,message):
        reply= QtGui.QMessageBox.information(self,u"提示框", message, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            self.Main_Test.isWait=False         #消息提示选择框为Yes,测试继续进行
        else:
            self.Stop()

    #测试信息追加到文本框中
    def SlotAdd(self, message):
        self.new.text.append(message)       #数据追加到文本显示框
        self.new.text.moveCursor(QtGui.QTextCursor.End)     #设置光标移动到文本框末尾

    #测试信息终止
    def SlotStop(self,message):
        if message == False:
            self.Consumer.working = False
            self.new.Start.setEnabled(True)
            self.new.Start.setText(u'Start Test')
            self.new.Start.setStyleSheet("QPushButton{">#测试程序终止
    def Stop(self):
        self.Consumer.working = False
        self.Main_Test.working = False
        self.new.Start.setEnabled(True)
        self.new.Start.setText(u'Start Test')
        self.new.Start.setStyleSheet("QPushButton{">#Start Test
    def Start(self):
        self.new.Start.setEnabled(False)        #设置Start Test控件为不可用状态
        self.new.Start.setStyleSheet("QPushButton{">#设置测试中的按钮为黄色
        self.new.Start.setText(u"test...")          #设置控件显示为"测试中"
        self.Time = time.strftime("%Y%m%d-%H%M%S", time.localtime())        #接收并格式化返回本地时间
        self.Var()              #调用变量定义函数
        self.new.Current_Test.clear()       #清空之前数据
        self.new.text.setText(u"ID:" + self.ID)
        self.new.text.append(u"PD:" + self.select_PD)
        self.new.text.append(u"SN:" + self.SN)
        self.Consumer.working = True
        match ="^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"  #正则表达式
        if re.match(match,self.Host_IP):    #匹配设备IP
            if self.Test.isChecked():       #检测测试选择框是否选中
                thread.start_new_thread(self.Main_Test.Script_Start,(self.select_PD, self.SN,self.Time, self.Host_IP, self.Server_IP))  #产生新线程1
                thread.start_new_thread(self.Consumer.write_log, (self.select_PD, self.SN, self.Time))  #产生新线程2
            elif self.Shipout.isChecked():      #检测出厂配置选择框是否选中
                thread.start_new_thread(self.Main_Test.Ship_Out, (self.select_PD,self.Host_IP, self.Config, self.Server_IP))
            elif self.Upgrade.isChecked():      #检测升级选中框是否选中
                thread.start_new_thread(self.Main_Test.upgrade,(self.select_PD, self.Host_IP,self.Boot,self.Kernel,self.APP,self.Config, self.MAC,self.Server_IP))
            elif self.Format_Disk.isChecked():  #检测格式化选中框是否选中
                thread.start_new_thread(self.Main_Test.Format_Disk,(self.select_PD,self.Host_IP))
            elif self.Modify_IP.isChecked():    #检测修改IP选中框是否选中
                thread.start_new_thread(self.Main_Test.Modify_IP, (self.select_PD,self.Host_IP))

        else:
            QtGui.QMessageBox.warning(self,u"提示",u"Device address error",QtGui.QMessageBox.Yes , QtGui.QMessageBox.No)    #提示消息框提示
            self.new.Start.setEnabled(True)             #设置控件为可用状态
            self.new.Start.setText(u'Start Test')          #设置控件显示Start Test
            self.new.Start.setStyleSheet("QPushButton{">#设置控件颜色

    #升级文件
    def Get_Filename(self):
        if not os.path.exists(os.getcwd()+ "\\TFTPFILE"):       #判断当前目录文件夹是否存在
            os.makedirs(os.getcwd()+ "\\TFTPFILE")              #若目录不存在,递归创建文件夹
        Path = os.getcwd()+ "\\TFTPFILE\\"
        filename = QtGui.QFileDialog.getOpenFileName(self,u"打开文件",  Path,  "All Files (*)")     #打开文件
        name = os.path.basename(str(filename))      #获取文件名
        if 'boot' in name:
            self.new.Boot.setText(name)     #boot单选框显示boot文件名
        elif 'kernel' in name:
            self.new.Kernel.setText(name)
        elif 'con' in name:
            self.new.Config.setText(name)
        else :
            self.new.APP.setText(name)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    windows = Windows()
    windows.show()
    sys.exit(app.exec_())



二、功能测试界面展示




python pyqt QTabWidget 详解 python qtquick_python