Python PyQt4模块编写的小型GUI程序

from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
import numpy as np
from scipy import stats
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
import random
import math

QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))

class MainWidget(QWidget):
    def __init__(self,parent=None):
        super(MainWidget,self).__init__(parent)
        self.setWindowTitle(self.tr("电子产品寿命分布类型测定"))

        self.figure = plt.figure()
        self.canvas = FigureCanvas(self.figure)
        self.button = QPushButton("作图")
        self.button.clicked.connect(self.plot)


        label1=QLabel(self.tr("加速组灯泡电压V"))
        label2=QLabel(self.tr("加速组寿命T"))
        labelc=QLabel(self.tr("C:"))
        labeld=QLabel(self.tr("D:"))

        label6=QLabel(self.tr("非额定组寿命Tf"))
        label7=QLabel(self.tr("额定电压下寿命Te"))
        label8=QLabel(self.tr("Vf"))
        label9=QLabel(self.tr("Ve"))
        label10=QLabel(self.tr("计算Ve"))

        label16=QLabel(self.tr("非额定组寿命Tf"))
        label17=QLabel(self.tr("额定电压下寿命Te"))
        label18=QLabel(self.tr("Vf:"))
        label19=QLabel(self.tr("Ve:"))

        label40=QLabel(self.tr("输入时间:"))
        label41=QLabel(self.tr("时间单位:小时"))
        label42=QLabel(self.tr("故障概率密度f(t):"))
        label43=QLabel(self.tr("可靠度R(t):"))
        label44=QLabel(self.tr("累积故障概率F(t):"))
        label45=QLabel(self.tr("瞬时故障概率λ(t):"))

        self._40LineEdit1=QLineEdit()
        self._42LineEdit2=QLineEdit()
        self._43LineEdit3=QLineEdit()
        self._44LineEdit4=QLineEdit()
        self._45LineEdit5=QLineEdit()

        self.TFLineEdit1=QLineEdit()
        self.TFLineEdit2=QLineEdit()
        self.TFLineEdit3=QLineEdit()
        self.TFLineEdit4=QLineEdit()
        self.TFLineEdit5=QLineEdit()
        self.TFLineEdit6=QLineEdit()
        self.TFLineEdit7=QLineEdit()
        self.TFLineEdit8=QLineEdit()
        self.TFLineEdit9=QLineEdit()
        self.TFLineEdit10=QLineEdit()
        self.TFLineEdit11=QLineEdit()
        self.TFLineEdit12=QLineEdit()

        self.TELineEdit1=QLineEdit()
        self.TELineEdit2=QLineEdit()
        self.TELineEdit3=QLineEdit()
        self.TELineEdit4=QLineEdit()
        self.TELineEdit5=QLineEdit()
        self.TELineEdit6=QLineEdit()
        self.TELineEdit7=QLineEdit()
        self.TELineEdit8=QLineEdit()
        self.TELineEdit9=QLineEdit()
        self.TELineEdit10=QLineEdit()
        self.TELineEdit11=QLineEdit()
        self.TELineEdit12=QLineEdit()

        self.VfLineEdit=QLineEdit()
        self.VeLineEdit=QLineEdit()

        self.VLineEdit1=QLineEdit()
        self.VLineEdit2=QLineEdit()
        self.VLineEdit3=QLineEdit()
        self.VLineEdit4=QLineEdit()
        self.VLineEdit5=QLineEdit()
        self.VLineEdit6=QLineEdit()

        self.TLineEdit1=QLineEdit()
        self.TLineEdit2=QLineEdit()
        self.TLineEdit3=QLineEdit()
        self.TLineEdit4=QLineEdit()
        self.TLineEdit5=QLineEdit()
        self.TLineEdit6=QLineEdit()

        self.cLineEdit=QLineEdit()
        self.dLineEdit=QLineEdit()


        labelCol=0
        contentCol=2

        leftLayout=QGridLayout()
        leftLayout.addWidget(label1,0,labelCol)
        leftLayout.addWidget(self.VLineEdit1,1,labelCol)
        leftLayout.addWidget(self.VLineEdit2,2,labelCol)
        leftLayout.addWidget(self.VLineEdit3,3,labelCol)
        leftLayout.addWidget(self.VLineEdit4,4,labelCol)
        leftLayout.addWidget(self.VLineEdit5,5,labelCol)
        leftLayout.addWidget(self.VLineEdit6,6,labelCol)

        leftLayout.addWidget(label2,0,contentCol)
        leftLayout.addWidget(self.TLineEdit1,1,contentCol)
        leftLayout.addWidget(self.TLineEdit2,2,contentCol)
        leftLayout.addWidget(self.TLineEdit3,3,contentCol)
        leftLayout.addWidget(self.TLineEdit4,4,contentCol)
        leftLayout.addWidget(self.TLineEdit5,5,contentCol)
        leftLayout.addWidget(self.TLineEdit6,6,contentCol)

        leftLayout.addWidget(label16,10,labelCol)
        leftLayout.addWidget(self.TFLineEdit1,11,labelCol)
        leftLayout.addWidget(self.TFLineEdit2,12,labelCol)
        leftLayout.addWidget(self.TFLineEdit3,13,labelCol)
        leftLayout.addWidget(self.TFLineEdit4,14,labelCol)
        leftLayout.addWidget(self.TFLineEdit5,15,labelCol)
        leftLayout.addWidget(self.TFLineEdit6,16,labelCol)
        leftLayout.addWidget(self.TFLineEdit7,17,labelCol)
        leftLayout.addWidget(self.TFLineEdit8,18,labelCol)
        leftLayout.addWidget(self.TFLineEdit9,19,labelCol)
        leftLayout.addWidget(self.TFLineEdit10,20,labelCol)
        leftLayout.addWidget(self.TFLineEdit11,21,labelCol)
        leftLayout.addWidget(self.TFLineEdit12,22,labelCol)

        leftLayout.addWidget(label17,10,contentCol)
        leftLayout.addWidget(self.TELineEdit1,11,contentCol)
        leftLayout.addWidget(self.TELineEdit2,12,contentCol)
        leftLayout.addWidget(self.TELineEdit3,13,contentCol)
        leftLayout.addWidget(self.TELineEdit4,14,contentCol)
        leftLayout.addWidget(self.TELineEdit5,15,contentCol)
        leftLayout.addWidget(self.TELineEdit6,16,contentCol)
        leftLayout.addWidget(self.TELineEdit7,17,contentCol)
        leftLayout.addWidget(self.TELineEdit8,18,contentCol)
        leftLayout.addWidget(self.TELineEdit9,19,contentCol)
        leftLayout.addWidget(self.TELineEdit10,20,contentCol)
        leftLayout.addWidget(self.TELineEdit11,21,contentCol)
        leftLayout.addWidget(self.TELineEdit12,22,contentCol)
        leftLayout.setColumnStretch(0,1)
        leftLayout.setColumnStretch(1,1)

        CalButton=QPushButton(self.tr("计算C、D"))
        leftLayout.addWidget(CalButton,7,1)
        leftLayout.addWidget(labelc,8,labelCol)
        leftLayout.addWidget(self.cLineEdit,8,1)
        leftLayout.addWidget(labeld,8,contentCol)
        leftLayout.addWidget(self.dLineEdit,8,3)

        CalButton2=QPushButton(self.tr("计算Te"))
        leftLayout.addWidget(CalButton2,23,1)
        leftLayout.addWidget(label18,24,labelCol)
        leftLayout.addWidget(self.VfLineEdit,24,1)
        leftLayout.addWidget(label19,24,contentCol)
        leftLayout.addWidget(self.VeLineEdit,24,3)

        leftLayout.addWidget(label40,26,labelCol)
        leftLayout.addWidget(self._40LineEdit1,26,1)
        leftLayout.addWidget(label41,26,contentCol)
        leftLayout.addWidget(label42,27,labelCol)
        leftLayout.addWidget(self._42LineEdit2,27,1)
        leftLayout.addWidget(label43,27,contentCol)
        leftLayout.addWidget(self._43LineEdit3,27,3)
        leftLayout.addWidget(label44,28,labelCol)
        leftLayout.addWidget(self._44LineEdit4,28,1)
        leftLayout.addWidget(label45,28,contentCol)
        leftLayout.addWidget(self._45LineEdit5,28,3)
        timeButton=QPushButton(self.tr("可靠性特征值计算"))
        leftLayout.addWidget(timeButton,29,1)


        hLayout=QHBoxLayout()
        hLayout.setSpacing(20)

        label30=QLabel(self.tr("软件说明:"))
        self.descTextEdit=QTextEdit()
        self.descTextEdit.setPlainText(self.tr("电子产品寿命分布类型测定实验"))


        label31=QLabel(self.tr("分布确定:"))
        DistributionButton=QPushButton(self.tr("计算"))

        label11=QLabel(self.tr("判定系数:"))
        self.RTextEdit=QTextEdit()
        label12=QLabel(self.tr("P值:"))
        self.PTextEdit=QTextEdit()
        label13=QLabel(self.tr("寿命分布类型:"))
        self.DisTextEdit=QTextEdit()
        label14=QLabel(self.tr("参数估计:"))
        self.ETextEdit=QTextEdit()


        rightLayout=QVBoxLayout()
        rightLayout.setMargin(10)
        rightLayout.addLayout(hLayout)
        rightLayout.addWidget(label30)
        rightLayout.addWidget(self.descTextEdit)

        rightLayout.addWidget(label31)
        rightLayout.addWidget(DistributionButton)
        rightLayout.addWidget(label11)
        rightLayout.addWidget(self.RTextEdit)
        rightLayout.addWidget(label12)
        rightLayout.addWidget(self.PTextEdit)
        rightLayout.addWidget(label13)
        rightLayout.addWidget(self.DisTextEdit)
        rightLayout.addWidget(label14)
        rightLayout.addWidget(self.ETextEdit)

        rightLayout.addWidget(self.canvas)
        rightLayout.addWidget(self.button)

        mainLayout=QGridLayout(self)
        mainLayout.setMargin(15)
        mainLayout.setSpacing(10)
        mainLayout.addLayout(leftLayout,0,1)
        mainLayout.addLayout(rightLayout,0,2)


        self.connect(CalButton,SIGNAL('clicked()'), self.calculate)
        self.connect(CalButton2,SIGNAL('clicked()'), self.calculateTe)
        self.connect(DistributionButton,SIGNAL('clicked()'), self.Distribution)
        self.connect(timeButton,SIGNAL('clicked()'), self.time)



    def calculate(self):
        VLineEdit1 = self.VLineEdit1.text()
        VLineEdit2 = self.VLineEdit2.text()
        VLineEdit3 = self.VLineEdit3.text()
        VLineEdit4 = self.VLineEdit4.text()
        VLineEdit5 = self.VLineEdit5.text()
        VLineEdit6 = self.VLineEdit6.text()

        TLineEdit1 = self.TLineEdit1.text()
        TLineEdit2 = self.TLineEdit2.text()
        TLineEdit3 = self.TLineEdit3.text()
        TLineEdit4 = self.TLineEdit4.text()
        TLineEdit5 = self.TLineEdit5.text()
        TLineEdit6 = self.TLineEdit6.text()

        arrayV=[float(VLineEdit1),float(VLineEdit2),float(VLineEdit3),float(VLineEdit4),float(VLineEdit5),float(VLineEdit6)]
        arrayT=[float(TLineEdit1),float(TLineEdit2),float(TLineEdit3),float(TLineEdit4),float(TLineEdit5),float(TLineEdit6)]

        lnV=np.log(arrayV)
        lnT=np.log(arrayT)

        global number_c
        number_c,number_d = self.leastsq(lnV,lnT)


        self.cLineEdit.setText(str(number_c))
        self.dLineEdit.setText(str(number_d))

    def leastsq(self,x,y):
        meanx = sum(x) / len(x)
        meany = sum(y) / len(y)

        xsum = 0.0
        ysum = 0.0

        for i in range(len(x)):
            xsum += (x[i] - meanx)*(y[i]-meany)
            ysum += (x[i] - meanx)**2

        k = xsum/ysum
        b = meany - k*meanx
        c = -k
        d = np.exp(-b)

        return  c,d   #返回拟合的两个参数值


    def calculateTe(self):#计算Te
        TFLineEdit1 = self.TFLineEdit1.text()   #获取TF文本框内容
        TFLineEdit2 = self.TFLineEdit2.text()
        TFLineEdit3 = self.TFLineEdit3.text()
        TFLineEdit4 = self.TFLineEdit4.text()
        TFLineEdit5 = self.TFLineEdit5.text()
        TFLineEdit6 = self.TFLineEdit6.text()
        TFLineEdit7 = self.TFLineEdit7.text()
        TFLineEdit8 = self.TFLineEdit8.text()
        TFLineEdit9 = self.TFLineEdit9.text()
        TFLineEdit10 = self.TFLineEdit10.text()
        TFLineEdit11 = self.TFLineEdit11.text()
        TFLineEdit12 = self.TFLineEdit12.text()

        VfLineEdit=self.VfLineEdit.text()   # 获取VF,VE
        VeLineEdit=self.VeLineEdit.text()

        global TELineEdit1,TELineEdit2,TELineEdit3,TELineEdit4,TELineEdit5,TELineEdit6,TELineEdit7,TELineEdit8,TELineEdit9,TELineEdit10,TELineEdit11,TELineEdit12
        TELineEdit1 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit1)#计算TE
        TELineEdit2 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit2)
        TELineEdit3 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit3)
        TELineEdit4 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit4)
        TELineEdit5 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit5)
        TELineEdit6 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit6)
        TELineEdit7 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit7)
        TELineEdit8 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit8)
        TELineEdit9 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit9)
        TELineEdit10 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit10)
        TELineEdit11 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit11)
        TELineEdit12 = 1 / 3600 * (float(VfLineEdit) / float(VeLineEdit))**number_c*float(TFLineEdit12)

        self.TELineEdit1.setText(str(TELineEdit1))#设置计算结果文本
        self.TELineEdit2.setText(str(TELineEdit2))
        self.TELineEdit3.setText(str(TELineEdit3))
        self.TELineEdit4.setText(str(TELineEdit4))
        self.TELineEdit5.setText(str(TELineEdit5))
        self.TELineEdit6.setText(str(TELineEdit6))
        self.TELineEdit7.setText(str(TELineEdit7))
        self.TELineEdit8.setText(str(TELineEdit8))
        self.TELineEdit9.setText(str(TELineEdit9))
        self.TELineEdit10.setText(str(TELineEdit10))
        self.TELineEdit11.setText(str(TELineEdit11))
        self.TELineEdit12.setText(str(TELineEdit12))

    def Distribution(self):
        array_Te = [TELineEdit1,TELineEdit2,TELineEdit3,TELineEdit4,TELineEdit5,TELineEdit6,TELineEdit7,TELineEdit8,TELineEdit9,TELineEdit10,TELineEdit11,TELineEdit12]
        array_Te.sort()
        n = len(array_Te)
        fn = [(i+0.7) / (n+0.4) for i in range(n)]

        array_fn = np.array(fn)
        em = np.log(1 / (1 - array_fn))
        slope, intercept, r_value1, p_value1, slope_std_error = stats.linregress(array_Te,em)

        z = np.log(array_fn / (1 - array_fn))
        slope, intercept, r_value2, p_value2, slope_std_error = stats.linregress(np.log(array_Te),z)

        wei = np.log(em)
        slope, intercept, r_value3, p_value3, slope_std_error = stats.linregress(np.log(array_Te),wei)

        r = max(r_value1,r_value2*0.8,r_value3)

        if r == r_value1:
            sum = 0
            for i in array_Te:
                sum = sum + i
                λ = len(array_Te) / sum
            r1 = r_value1
            p1 = p_value1
            dis1 = "指数分布"
        elif r == r_value2*0.8:
            μ,σ = stats.norm.fit(array_Te)
            r1 = r_value2
            p1 = p_value2
            dis1 = "正态分布"
        else:
            params = stats.exponweib.fit(array_Te, floc=0, f0=1)
            shape = params[1]
            scale = params[3]
            r1 = r_value3
            p1 = p_value3
            dis1 = "威布尔分布"

        self.RTextEdit.setText(str(r1))
        self.PTextEdit.setText(str(p1))
        self.DisTextEdit.setText(dis1)

        global lamda,flags,m_2,n_2

        if dis1 == "指数分布":#参数估计
            sum = 0
            for i in array_Te:

                sum = sum + i
                lamda = len(array_Te) / sum
                flags = 1
                self.ETextEdit.setText("λ = " + str(lamda))
        elif dis1 == "正态分布":
            μ,σ = stats.norm.fit(array_Te)
            self.ETextEdit.setText("μ = " + str(μ) +
                                   "\nσ = " + str(σ))
        else:

            params = stats.exponweib.fit(array_Te, floc=0, f0=1)
            flags = 2
            m_2 = params[1]
            n_2 = params[3]
            self.ETextEdit.setText("m = " + str(m_2)
                                   + "\nη = " + str(n_2))


    def plot(self):
        flag = flags
        if flag == 1:
            t = np.arange(0.0 ,10.0 / lamda ,0.01)
            s1 = lamda*(t - t + 1)
            s2 = np.exp(-lamda*t)
            s3 = 1 - np.exp(-lamda*t)
            s4 = lamda*np.exp(-lamda*t)

            ax1 = self.figure.add_subplot(221)#分割出四个图
            ax2 = self.figure.add_subplot(222)
            ax3 = self.figure.add_subplot(223)
            ax4 = self.figure.add_subplot(224)

            ax1.hold(False)
            ax2.hold(False)
            ax3.hold(False)
            ax4.hold(False)

            ax1.plot(t, s1)
            ax1.set_ylabel("r(t)")
            ax2.plot(t, s2)
            ax2.set_ylabel("R(t)")
            ax3.plot(t, s3)
            ax3.set_ylabel("F(t)")
            ax4.plot(t, s4)
            ax4.set_ylabel("f(t)")

            # 更新canvas
            self.canvas.draw()
        else:
            t = np.arange(0.0 ,5.0 ,0.01)
            m = m_2
            n = n_2

            s5 = ((m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m)) / (np.exp(-(t / n)**m))
            s6 = np.exp(-(t / n)**m)
            s7 = 1 - np.exp(-(t / n)**m)
            s8 = (m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m)

            ax5 = self.figure.add_subplot(221)#分割出四个图
            ax6 = self.figure.add_subplot(222)
            ax7 = self.figure.add_subplot(223)
            ax8 = self.figure.add_subplot(224)

            ax5.hold(False)
            ax6.hold(False)
            ax7.hold(False)
            ax8.hold(False)

            ax5.plot(t, s5)
            ax5.set_ylabel("r(t)")
            ax6.plot(t, s6)
            ax6.set_ylabel("R(t)")
            ax7.plot(t, s7)
            ax7.set_ylabel("F(t)")
            ax8.plot(t, s8)
            ax8.set_ylabel("f(t)")

            # refresh canvas
            self.canvas.draw()

    def time(self):
        timeLineEdit = self._40LineEdit1.text()
        t = float(timeLineEdit)
        if flags ==1:
            lamdal = lamda
            r = lamdal
            R = np.exp(-lamdal*t)
            F = 1 - np.exp(-lamdal*t)
            f = lamdal*np.exp(-lamdal*t)

            self._42LineEdit2.setText(str(f))
            self._43LineEdit3.setText(str(R))
            self._44LineEdit4.setText(str(F))
            self._45LineEdit5.setText(str(r))

        else:
            m = m_2
            n = n_2
            f = (m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m)
            R = np.exp(-(t / n)**m)
            F = 1 - np.exp(-(t / n)**m)
            r = ((m / n)*(t / n)**(m - 1)*np.exp(-(t / n)**m)) / (np.exp(-(t / n)**m))

            self._42LineEdit2.setText(str(f))
            self._43LineEdit3.setText(str(R))
            self._44LineEdit4.setText(str(F))
            self._45LineEdit5.setText(str(r))

app=QApplication(sys.argv)
main=MainWidget()
main.show()
app.exec_()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值