在我们进行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()