原创|PYQT5|编程经验|爬坑|分享|4|python进阶操作:多个控件使用同一个函数入口

        在我们进行PYQT5进行编程的时候,当界面设计完毕,通常需要将控件与代码中的相应的函数事件一一对应。如果控件比较少,可能还没什么,但是,随着后续软件项目的需求和功能逐步增多,是非常不利于后续维护的,而且这种方式,不利于后续的扩展。

        如果要比较好的解决这种问题,在开始设计时,就需要有一个比较好的架构设计。比较好的一个办法是,针对多个同质或者同类型的控件,调用一个统一的入口,后续进行维护时,只用维护较少的程序入口就行,实现数据分离。

以下是本人日常编程中的一个实例,特此记录下来,便于以后参考学习。

测试场景:

多个按钮控件进行不同版本的DFU升级操作。

分析步骤:

1.目前只有不到10个版本需要进行更新操作,后续可以根据使用者的需求,进行扩充;

2.可以在配置文件中,配置版本号,程序初始化时,读取配置文件,并显示为按钮控件名;

3.默认情况下,这些按钮控件都是不可见的;如果版本号不为空,且版本号有效,则对应的按钮控件会显示在程序界面上;

4.多个按钮调用同一个入口函数,并根据使用者的点击操作,获取当前被点击的按钮名字,再执行相应的函数,并进行DFU升级操作,从而实现多个按钮调用同一个入口函数,但是可以自动实现不同的功能;

函数调用实例

#按钮连接函数
self.toolButton_BatchRun_DFU_1.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_2.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_3.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_4.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_5.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_6.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_7.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_8.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_9.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_10.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_11.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_12.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_13.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_14.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_15.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_16.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_17.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_18.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_19.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_20.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_21.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_22.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_23.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_24.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_25.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_26.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_27.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_28.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_29.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-
self.toolButton_BatchRun_DFU_30.clicked.connect(self.BatchRun_g2_DFU)  # 按钮链接-

具体实现函数

    def BatchRun_g2_DFU(self):
        global UserMode
        global Bridge_BT_ID
        if UserMode != 1:
            self.logOut("软件未注册或者已过期,请注册后,再重新打开此软件...")
            return
        
        
        button = w.sender()
        button_name=button.objectName()
        print('button={}'.format(button))
        print('button_name={}'.format(button_name))
        
        button_title = button.text()
        self.logOut('button_title={}'.format(button_title))

        
        ota_name=''
        try:
            ota_name='ota'+str(int(str(button_title).split('(')[1].replace(')','').replace('.','')))
            self.logOut('ota_name={}'.format(ota_name))
            
            #判断版本号
            if 'ota' not in ota_name:
                return 0
        except BaseException as get_err:
            self.logOut('button_title={},获取版本号错误...'.format(button_title))
            return -1
            
      
        
        if not button.isCheckable():
            if self.dialog_YesNo('正在操作:{},是否进行DFU更新?\n更新对象:\n{}\nDFU包名:{}'.format(Bridge_BT_ID,button_title,ota_name)) == 1:
                threading.Thread(target=self.BatchRun_g2_DFU_thread,args=(ota_name,button_title,Bridge_BT_ID,)).start()
        
    def BatchRun_g2_DFU_thread(self,ota_name='',button_title='',Bridge_BT_ID=''):
        global folderName
        global RunFlag

        try:
            self.save_user_config()
            # 获取需要添加的LockID列表
    
            LockID_List = self.get_Batch_LockList()
    
            self.logOut('-' * 100)

            WaitTimes_DFU  = int(self.spinBox_WaitTimes_DFU.value())
            SleepTime_DFU  = int(self.spinBox_SleepTime_DFU.value())
            RunFlag = 1
            # for runCount in range(1, RunTimes + 1):
            if RunFlag == 0:
                return -1
    
            self.logOut('-' * 100)
    
            self.logOut('button_title= {}'.format(button_title))
            self.logOut('开始执行 BatchRun_g2_DFU_thread 操作,Bridge_BT_ID= {},ota_name= {}'.format(Bridge_BT_ID,ota_name))
    
            startTime = IDP_EFG_requests_HRD.getTime(1)
            # Pin_Input = self.textEdit_DeletePassword_Show.toPlainText()
            
            result = IDP_EFG_requests_HRD.bridge_g2_DFU(str(ota_name),Bridge_BT_ID)
            self.logOut('Request返回结果=\n{}'.format(IDP_EFG_requests_HRD.show))
            self.logOut('命令返回结果= {}'.format(result))
            endTime = IDP_EFG_requests_HRD.getTime(1)
            spent_times = IDP_EFG_requests_HRD.date_time_count_ms(endTime, startTime)
            self.logOut('开始执行时间= {} ,结束执行时间= {} ,总共花费时间= {} 秒'.format(startTime, endTime, spent_times))
            self.logOut('-' * 100)
    
            folderName = "\\API_test_Logs"
            SaveLogFileName = "\\Bridge_BatchRun_g2_DFU_thread_log.log"
            self.writeFile(self.getDT() + " [info] " + "--------" + "\n", folderName, SaveLogFileName)
            self.writeFile(self.getDT() + " [info] " + "button_title= {} ".format(button_title) + "\n", folderName, SaveLogFileName)
            self.writeFile(self.getDT() + " [info] " + '开始执行,Bridge_BT_ID= {} 的DFU 操作,ota_name= {}'.format(Bridge_BT_ID,ota_name) + "\n", folderName,SaveLogFileName)
            self.writeFile(self.getDT() + " [info] " + "返回结果= {}".format(str(result)) + "\n", folderName,SaveLogFileName)
            self.writeFile(self.getDT() + " [info] " + '开始执行时间= {} ,'.format(startTime) + '结束执行时间= {} ,'.format(endTime) + '总共花费时间= {} 秒'.format(spent_times) + "\n", folderName, SaveLogFileName)
    
            
            self.logOut('-' * 100)
            self.logOut_dfu(string_color('-' * 100, '0000FF'))
            self.logOut('Bridge_BT_ID={},开始DFU操作,DFU过程中,WIFI灯会不断闪烁绿灯,请等待程序自动完成,完成后Bridge会自动重启...'.format(Bridge_BT_ID))
            self.logOut_dfu('Bridge_BT_ID={},开始DFU操作,DFU过程中,WIFI灯会不断闪烁绿灯,请等待程序自动完成,完成后Bridge会自动重启...'.format(Bridge_BT_ID))
            self.logOut('Bridge_BT_ID={},请等待重启后WIFI灯显示常亮绿色状态后继续...'.format(Bridge_BT_ID))
            self.logOut_dfu('Bridge_BT_ID={},请等待重启后WIFI灯显示常亮绿色状态后继续...'.format(Bridge_BT_ID))
            
            for r in range(1, WaitTimes_DFU+1):
                if RunFlag == 0:
                    return 0
                self.logOut(string_color('Bridge_BT_ID={},等待30秒,第 {}/{} 次...'.format(Bridge_BT_ID,r,WaitTimes_DFU),'0000FF'))
                self.logOut_dfu(string_color('Bridge_BT_ID={},等待30秒,第 {}/{} 次...'.format(Bridge_BT_ID,r,WaitTimes_DFU),'0000FF'))
                self.logOut(string_color('Bridge_BT_ID={},当前共计已等待 {} 秒...'.format(Bridge_BT_ID,(r-1)*30),'FF00FF'))
                self.logOut_dfu(string_color('Bridge_BT_ID={},当前共计已等待 {} 秒...'.format(Bridge_BT_ID,(r-1)*30),'FF00FF'))
                sleep(int(SleepTime_DFU))
                
            
            DFU_endTime = IDP_EFG_requests_HRD.getTime(1)
            DFU_spent_times = IDP_EFG_requests_HRD.date_time_count_ms(DFU_endTime, startTime)

            self.logOut('-' * 100)
            self.logOut('开始执行时间= {} ,结束执行时间= {} ,总共花费时间= {} 秒'.format(startTime, DFU_endTime, DFU_spent_times))
            self.logOut_dfu('开始执行时间= {} ,结束执行时间= {} ,总共花费时间= {} 秒'.format(startTime, DFU_endTime, DFU_spent_times))
            
            self.logOut(string_color('DFU已完成,Bridge_BT_ID={}...'.format(Bridge_BT_ID),'00FFFF'))
            self.logOut_dfu(string_color('DFU已完成,Bridge_BT_ID={}...'.format(Bridge_BT_ID),'00FFFF'))
            
            self.logOut(string_color('Bridge_BT_ID={},请等待设备重启完成...'.format(Bridge_BT_ID),'00FFFF'))
            self.logOut_dfu(string_color('Bridge_BT_ID={},请等待设备重启完成...'.format(Bridge_BT_ID),'00FFFF'))
            
            self.logOut(string_color('-'*100,'0000FF'))
            self.logOut_dfu(string_color('-'*100,'0000FF'))
            self.logOut('-' * 100)
        except Exception as e:
            self.logOut('BatchRun_g2_DFU_thread 失败,失败信息= {}'.format(e))

函数说明

主要的实现函数为:

        button = w.sender()
        button_name=button.objectName()
        print('button={}'.format(button))
        print('button_name={}'.format(button_name))
        
        button_title = button.text()
        self.logOut('button_title={}'.format(button_title))

        
        ota_name=''
        try:
            ota_name='ota'+str(int(str(button_title).split('(')[1].replace(')','').replace('.','')))
            self.logOut('ota_name={}'.format(ota_name))
            
            #判断版本号
            if 'ota' not in ota_name:
                return 0
        except BaseException as get_err:
            self.logOut('button_title={},获取版本号错误...'.format(button_title))
            return -1
            
      
        
        if not button.isCheckable():
            if self.dialog_YesNo('正在操作:{},是否进行DFU更新?\n更新对象:\n{}\nDFU包名:{}'.format(Bridge_BT_ID,button_title,ota_name)) == 1:
                threading.Thread(target=self.BatchRun_g2_DFU_thread,args=(ota_name,button_title,Bridge_BT_ID,)).start()

上一篇:SAP S4HANA LTMC Practice - the first shot


下一篇:Python游戏开发,pygame模块,Python实现五子棋联机对战小游戏