PyQT4 动态加载checkboxs,以及除去checkboxs

经过几天的折腾终于弄好动态加载checkboxs,特此记录:

 

首先上基础UI文件。

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

# Form implementation generated from reading ui file 'auto_lr.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
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_Frame(object):
    def setupUi(self, Frame):
        Frame.setObjectName(_fromUtf8("Frame"))
        Frame.resize(767, 563)
        Frame.setFrameShape(QtGui.QFrame.StyledPanel)
        Frame.setFrameShadow(QtGui.QFrame.Raised)
        self.pushButton = QtGui.QPushButton(Frame)
        self.pushButton.setGeometry(QtCore.QRect(670, 250, 91, 51))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton_2 = QtGui.QPushButton(Frame)
        self.pushButton_2.setGeometry(QtCore.QRect(670, 340, 91, 51))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.textEdit = QtGui.QTextEdit(Frame)
        self.textEdit.setGeometry(QtCore.QRect(20, 410, 721, 141))
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.layoutWidget = QtGui.QWidget(Frame)
        self.layoutWidget.setGeometry(QtCore.QRect(21, 11, 731, 51))
        self.layoutWidget.setObjectName(_fromUtf8("layoutWidget"))
        self.horizontalLayout = QtGui.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.label = QtGui.QLabel(self.layoutWidget)
        self.label.setObjectName(_fromUtf8("label"))
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtGui.QLineEdit(self.layoutWidget)
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.horizontalLayout.addWidget(self.lineEdit)
        self.pushButton_3 = QtGui.QPushButton(self.layoutWidget)
        self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
        self.horizontalLayout.addWidget(self.pushButton_3)
        self.checkBox_4 = QtGui.QCheckBox(Frame)
        self.checkBox_4.setGeometry(QtCore.QRect(20, 140, 71, 16))
        self.checkBox_4.setObjectName(_fromUtf8("checkBox_4"))
        self.layoutWidget_2 = QtGui.QWidget(Frame)
        self.layoutWidget_2.setGeometry(QtCore.QRect(20, 70, 731, 51))
        self.layoutWidget_2.setObjectName(_fromUtf8("layoutWidget_2"))
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.layoutWidget_2)
        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
        self.label_2 = QtGui.QLabel(self.layoutWidget_2)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.horizontalLayout_2.addWidget(self.label_2)
        self.lineEdit_2 = QtGui.QLineEdit(self.layoutWidget_2)
        self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
        self.horizontalLayout_2.addWidget(self.lineEdit_2)
        self.pushButton_5 = QtGui.QPushButton(self.layoutWidget_2)
        self.pushButton_5.setObjectName(_fromUtf8("pushButton_5"))
        self.horizontalLayout_2.addWidget(self.pushButton_5)
        self.pushButton_4 = QtGui.QPushButton(Frame)
        self.pushButton_4.setGeometry(QtCore.QRect(670, 160, 91, 51))
        self.pushButton_4.setObjectName(_fromUtf8("pushButton_4"))

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

    def retranslateUi(self, Frame):
        Frame.setWindowTitle(_translate("Frame", "LR多场景自动串行执行器V1.2", None))
        self.pushButton.setText(_translate("Frame", "执行压测", None))
        self.pushButton_2.setText(_translate("Frame", "停止压测", None))
        self.label.setText(_translate("Frame", "场景目录          ", None))
        self.pushButton_3.setText(_translate("Frame", "浏览", None))
        self.checkBox_4.setText(_translate("Frame", "全选", None))
        self.label_2.setText(_translate("Frame", "Loadrunner安装目录", None))
        self.pushButton_5.setText(_translate("Frame", "浏览", None))
        self.pushButton_4.setText(_translate("Frame", "扫描场景文件", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Frame = QtGui.QFrame()
    ui = Ui_Frame()
    ui.setupUi(Frame)
    Frame.show()
    sys.exit(app.exec_())

 

动态加载代码

#coding=utf8

import sys
import os
from PyQt4 import QtCore, QtGui
from auto_lr_ui_rc import Ui_Frame,_translate,_fromUtf8
from logic import exe_lr


class MainApp(QtGui.QFrame):
    def __init__(self):
        QtGui.QFrame.__init__(self)
        #Frame = QtGui.QFrame()
        self.ui = Ui_Frame()
        self.ui.setupUi(self)
        #self.ui.retranslateUi(self)

        
        self.main_threads=exe_lr.Work_Threads()
        self.scan_thread=exe_lr.Scan_Worker()
        self.ui.checkBox_4.stateChanged.connect(self.select_all_ckbox)
        self.ui.pushButton_3.clicked.connect(self.get_scripter_folder)
        self.ui.pushButton_5.clicked.connect(self.get_lr_folder)
        self.ui.pushButton.clicked.connect(self.start_run_lr)
        self.ui.pushButton_2.clicked.connect(self.stop_lr)
        self.ui.pushButton_4.clicked.connect(self.scan_files)


        self.connect(self.scan_thread, QtCore.SIGNAL("runlr_app_log(QString)"),self.runlr_app_log)
        self.connect(self.main_threads,QtCore.SIGNAL("app_start()"),self.app_start)
        self.connect(self.main_threads,QtCore.SIGNAL("app_end()"),self.app_end)
        self.scrollArea = QtGui.QScrollArea(self)
        self.scrollArea.setGeometry(QtCore.QRect(20, 160, 631, 241))
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
        self.scrollAreaWidgetContents = QtGui.QWidget()
        self.checkBoxs_and_path=[]
        self.ui.pushButton_2.setDisabled(True)
        self.run_se=[]


    def closeEvent(self, event):
    
        # 关闭窗口的事件触发消息框询问,并设置消息框标题,提示信息,选择按键
        reply = QtGui.QMessageBox.question(self, u'信息',
                                           u"你确定退出", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            if self.main_threads.isRunning():
                self.main_threads.exit()
            if self.run_se:
                for r in self.run_se:
                    if r.isRunning():
                        r.terminate_thread()
            event.accept()
        else:
            event.ignore()

    def clear_checkboxs(self,layout):
        check_boxs=self.scrollAreaWidgetContents.findChildren(QtGui.QCheckBox)
        if layout != None and check_boxs:
            for c in check_boxs:
                c.setVisible(False)


    def runlr_app_log(self,text):
        self.ui.textEdit.append(text)

    def scan_lr_exe(self):
        lr_dir=unicode(self.ui.lineEdit_2.text())
        if lr_dir and os.path.isdir(lr_dir):
            self.scan_lr_exe_thread=exe_lr.scan_lr_exe_threads(lr_dir)
            self.scan_lr_exe_thread.render()
            self.connect(self.scan_lr_exe_thread, QtCore.SIGNAL("runlr_app_log(QString)"),self.runlr_app_log)
            self.scan_lr_exe_thread.wait()
            return self.scan_lr_exe_thread.lr_exe_path
        else:
            return 0


    def scan_files(self):
        root_dir=unicode(self.ui.lineEdit.text())
        if os.path.isdir(root_dir):
            self.app_start()
            self.clear_checkboxs(self.scrollArea)
            self.scan_thread.render(root_dir)
            self.scan_thread.wait()
            l=self.scan_thread.check
            n=10
            self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 629, 239))
            self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
 
            for i  in l:
                name= os.path.splitext(os.path.split(i)[-1])[-2]+"      (%s)"%i
                
                self.checkBox = QtGui.QCheckBox(self.scrollAreaWidgetContents)
                self.checkBox.setVisible(True)
                self.checkBox.setGeometry(QtCore.QRect(10, n, 600, 16))
                #self.checkBox.setObjectName(_fromUtf8("checkBox"))
                self.checkBox.setText(_translate("Frame", name, None))
                
                n+=30
             
                self.checkBoxs_and_path.append((self.checkBox,i))
            self.scrollArea.setWidget(self.scrollAreaWidgetContents)
            #print self.checkBoxs
        else:
            self.ui.textEdit.append(u'请先选择一个有效的目录')
        self.app_end()
                
        
    def select_all_ckbox(self):
        all_checkbox_list=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox)]

            
        if self.ui.checkBox_4.isChecked():
            for c in all_checkbox_list:
                c.setChecked(True)
        else:
            for c in all_checkbox_list:
                c.setChecked(False)
           

    def get_scripter_folder(self):
        directory = QtGui.QFileDialog.getExistingDirectory(self,
                u"场景目录")
        if directory:
            self.ui.lineEdit.setText(directory)
    def get_lr_folder(self):
        directory = QtGui.QFileDialog.getExistingDirectory(self,
                u"Loadrunner安装目录")
        if directory:
            self.ui.lineEdit_2.setText(directory)

    def start_run_lr(self):
        text=u"<p>现在要开始生产环境的场景压测了,你确定要开始?</p>" \
        u"<p>点击'确定'开始生产环境的场景压测,点击'取消'就当什么事情都没发生.</p>"
        msg=self.message_box(text)
        self.ui.textEdit.clear()
        lr=self.scan_lr_exe()
        checkbox_list=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox) if c.isChecked()]
        
        if msg:
            self.app_start()
            if lr:
                if checkbox_list:
                    
                    self.run_se=[]
                    for a in self.checkBoxs_and_path:
                        if a[0] in checkbox_list:
                            d=exe_lr.Worker(a[1],lr)
                            self.connect(d, QtCore.SIGNAL("runlr_app_log(QString)"),self.runlr_app_log)
                            self.run_se.append(d)     
                    self.main_threads.render(self.run_se)
      
                    
                else:
                    self.ui.textEdit.append(u'没有找到合适的场景,请先点击<扫描场景文件>进行查找,或者勾选一个场景进行压测')
                    self.app_end()
            else:
                self.ui.textEdit.append(u'无效的loadrunner安装目录或者没有在loadrunner安装目录%s中找到Wlrun.exe执行文件'%lr)
                self.app_end()
    def message_box(self,text):
        msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning,
                u"提示", text,
                QtGui.QMessageBox.NoButton, self)
        msgBox.addButton(u"确认", QtGui.QMessageBox.AcceptRole)
        msgBox.addButton(u"取消", QtGui.QMessageBox.RejectRole)
        if msgBox.exec_() == QtGui.QMessageBox.AcceptRole:
            return 1
        else:
            return 0
    
    def stop_lr(self):
        text=u"<p>现在场景们可能在生产上压测,你确定终止?</p>" \
        u"<p>点击'确定'终止正在压测的场景,点击'取消'就当什么事情都没发生.</p>"
        all_checked_thread=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox) if c.isChecked()]
        if self.message_box(text):
            pass

            
    def change_ui(self,True_or_False):
        all_checkbox_list=[c for c in self.scrollArea.findChildren(QtGui.QCheckBox)]
        for  a in all_checkbox_list:
            a.setDisabled(True_or_False)
        self.ui.checkBox_4.setDisabled(True_or_False)
        self.ui.lineEdit.setDisabled(True_or_False)
        self.ui.lineEdit_2.setDisabled(True_or_False)
        self.ui.pushButton.setDisabled(True_or_False)
        self.ui.pushButton_3.setDisabled(True_or_False)
        self.ui.pushButton_4.setDisabled(True_or_False)
        self.ui.pushButton_5.setDisabled(True_or_False)
  
        
    def app_start(self):
        self.ui.textEdit.clear()
        self.change_ui(True)
        
 
    def app_end(self):
        self.change_ui(False)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MainApp()
    myapp.show()
    sys.exit(app.exec_())

其中,此方法为扫描一个目录,将相关结果取回,并生成checkbox

 

 

  def scan_files(self):
        root_dir=unicode(self.ui.lineEdit.text())
        if os.path.isdir(root_dir):
            self.app_start()
            self.clear_checkboxs(self.scrollArea)
            self.scan_thread.render(root_dir)
            self.scan_thread.wait()
            l=self.scan_thread.check
            n=10
            self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 629, 239))
            self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
 
            for i  in l:
                name= os.path.splitext(os.path.split(i)[-1])[-2]+"      (%s)"%i
                
                self.checkBox = QtGui.QCheckBox(self.scrollAreaWidgetContents)
                self.checkBox.setVisible(True)
                self.checkBox.setGeometry(QtCore.QRect(10, n, 600, 16))
                #self.checkBox.setObjectName(_fromUtf8("checkBox"))
                self.checkBox.setText(_translate("Frame", name, None))
                
                n+=30
             
                self.checkBoxs_and_path.append((self.checkBox,i))
            self.scrollArea.setWidget(self.scrollAreaWidgetContents)
            #print self.checkBoxs
        else:
            self.ui.textEdit.append(u'请先选择一个有效的目录')
        self.app_end()
                

其中此段是添加checkboxs。

for i  in l:
                name= os.path.splitext(os.path.split(i)[-1])[-2]+"      (%s)"%i
                
                self.checkBox = QtGui.QCheckBox(self.scrollAreaWidgetContents)
                self.checkBox.setVisible(True)
                self.checkBox.setGeometry(QtCore.QRect(10, n, 600, 16))
                #self.checkBox.setObjectName(_fromUtf8("checkBox"))
                self.checkBox.setText(_translate("Frame", name, None))
                
                n+=30
             
                self.checkBoxs_and_path.append((self.checkBox,i))
            self.scrollArea.setWidget(self.scrollAreaWidgetContents)

 

self.clear_checkboxs(self.scrollArea)把前一次扫描的结果清除隐藏。self.checkBox.setVisible(True)将本次出现的checkbox设为可见。之前用checkBox.deleteLater()这个方法一直没有起作用。

 

posted @ 2017-03-03 16:15    阅读(2503)  评论(0编辑  收藏  举报