2021-07-16

使用pyqt5 编写一个脚本程序,程序用途:为一个国产贴片机生产对应需要的格式文件,根据cadence的水晶BOM和位置文件


使用pyqt5 编写一个脚本程序,程序用途:为一个国产贴片机生产对应需要的格式文件,根据cadence的水晶BOM和位置文件。主程序

'''
Author: your name
Date: 2021-06-23 14:09:00
LastEditTime: 2021-07-16 10:43:27
LastEditors: Please set LastEditors
Description: In User Settings Edit
FilePath: \mounter\deal_bom_data.py
'''
# from PyQt5.QtWidgets import (QAbstractItemView, QWidget, QTableWidget, QHBoxLayout,QVBoxLayout, 
#                             QApplication, QTableWidgetItem,QLineEdit, QPushButton,
#                             QFileDialog, QMainWindow)


from PyQt5.QtWidgets import (QApplication, QTableWidgetItem, QFileDialog, QMainWindow)

from PyQt5.QtCore import QDir, bom   #, QRect
# import sys

# import docx
# from PyQt5.QtCore import pyqtSlot 
from mounter_qt_20210623 import Ui_MainWindow
import pandas as pd
from docx import Document
import re
from win32com import client as wc
import copy
import time 
import os 
import numpy as np

class Table(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(Table, self).__init__(parent)
        self.cadence_bom_file_data = None       #保存导入BOM文件的数据
        self.cadence_bom_config_file_data = None       #配置好料站之后,保存配置好的所有数据
        self.cadence_ic_position_mesage = None   #用于保存器件的位置信息

        self.tip_mouth_excel_file_data = None       #保存导入位置文件的数据

        self.save_config_welded_station_data = None  #保存配号是否焊接的数据

        self.save_config_tip_mounter_data = None  #保存配置好的吸盘类型

        self.project_name = None
        # self.cadence_bom_file_data = None       #保存导入BOM文件的数据
        self.setupUi(self)

        self.open_bom_file_push_button.clicked.connect(self.open_bom_file_push_button_function)            #打开BOM文件信号槽函数  

        self.open_position_file_push_button.clicked.connect(self.open_position_file_push_button_function)  #打开位置文件信号槽函数  

        self.configuration_and_generate_file.clicked.connect(self.configuration_and_generate_file_function)  #配置文件和生产不和要求的文件的信号槽函数  

        self.open_configure_tip_mounter_file_push_button.clicked.connect(self.open_configure_tip_mounter_file_push_button_function)    #配置信号贴片机的吸头槽函数

        self.config_tip_mounter_pushButton.clicked.connect(self.config_tip_mounter_pushButton_function)  ##配置料站号 

        self.configuration_welded_station_push_button.clicked.connect(self.configuration_welded_station_push_button_function)   #配置芯片焊接状态

        self.configure_tip_mounter_station_push_button.clicked.connect(self.configure_tip_mounter_station_push_button_function)  #配置贴片机吸嘴型号

            
    
    def open_bom_file_push_button_function(self):
        '''
        #打开BOM文件,并且处理bom文件数据
        
        #设置打开文件格式
        # QFileDialog(self, '打开文件', 'doc文件(*.doc);;docx文件(*.docx)')
        # '葵花宝典','../','所有文件(*.*);;Python文件(*.py);;图片(*.png *.jpg)'
        # ( 父控件 , '对话框标题', '文件路径' , ' 过滤器名称1(*.后缀名1 *.后缀名2 g);;过滤器名称2(*.后缀名1 *.后缀名2 ) ')
        
        '''


        # dlg = QFileDialog(self, '打开文件','./', '*.doc;;*.docx')  #设置导入文件的类型
        
        dlg = QFileDialog(self, '打开文件','D:/BOM/', '*.doc;;*.docx')  #设置导入文件的类型,打开制定位置

        dlg.setFileMode(QFileDialog.AnyFile)  #设置打开文件格式
        dlg.setFilter(QDir.Files)

        if dlg.exec_():
            filenames = dlg.selectedFiles()
            f = open(filenames[0], 'r')
            #导入文件数据

            docx_file_name = self.doc_file_save_as_docx(f.name)
            # print(docx_file_name)

            if docx_file_name == None:
                self.show_all_mesage.append('请先关闭文件,再操作!!!')
                return 

            res = re.search('\.docx',docx_file_name)   #保证导入的文件是.docx格式

            if f.name and res != None:
                show_txt = (docx_file_name).split('/')[-1]
                # show_txt = docx_file_name
                self.show_bom_file_name.setText(show_txt)   

                #下表是使用document 库 读取水晶BOM 文件数据
                document = Document(docx_file_name)
                # table=document.tables

                crystal_bom_input_data_list = []
                title = ['序号','料带号','使用位置','数量','型号规格','名称','物料编码'] #显示的表格表头
                crystal_bom_input_data_list.append(title)

                mid_list = []
                j = 1
                flag = 0
                flag_1 = 0
                flag_2 = 0
                for i in range(0,len(document.paragraphs)):  #直接去除开头表头信息,数值20的含义

                    # print('第%s行'%i ,document.paragraphs[i].text)  #用于调试显示
                    
                    #bom 表格第13行是项目名称,如果名称为空,则直接使用时间命名

                    if flag_1 == 0 and document.paragraphs[i].text == '名称':
                        flag_1 = 1
                    

                    #获取项目名称
                    res_2 = re.search('英文名称',document.paragraphs[i].text)
                    if flag_2 == 0 and res_2 != None:
                        flag_2 = 1
                        continue
                    if flag_2 == 1 and document.paragraphs[i].text != '序号':
                        self.project_name = document.paragraphs[i].text
                        flag_2 = 3
                    elif flag_2 == 1 and document.paragraphs[i].text == '序号':
                        self.project_name = (time.strftime('%Y_%m_%d_%H_%M',time.localtime(time.time())))
                        flag_2 = 3


                    if flag_1 == 1:            #bom表格从第一次出现名称,才开始是正式数据
                        text_data = document.paragraphs[i].text
                        if text_data == '页':
                            flag = 1
                        if text_data == '名称':
                            flag = 0
                            continue
                    
                        if flag == 1:
                            continue

                        if len(mid_list) < 6:
                            mid_list.append(text_data)  
                        
                        res_1 = re.search('备注',mid_list[0])
                        if len(mid_list) == 6:
                            res_1 = re.search('备注',mid_list[0])

                            if res_1 == None:
                                mid_data = list([mid_list[0],"79",mid_list[2],mid_list[1],mid_list[3],mid_list[4],mid_list[5]])  #测试代码最后注销,料站号默认设置为79,

                                # mid_data = list([mid_list[0],0,mid_list[2],mid_list[1],mid_list[3],mid_list[4],mid_list[5]])
                                crystal_bom_input_data_list.append(mid_data)
                                mid_list.clear()
                            else:
                                mid_list.clear()
                            


                if len(crystal_bom_input_data_list) == 0:
                    self.show_all_mesage.append('导入BOM表格为空,请重新导入')
                    return
                    
                # self.cadence_bom_file_data = crystal_bom_input_data_list         #将导入的数据赋值给类变量
                cadence_bom_raw_number = len(crystal_bom_input_data_list)        #获取行数目
                cadence_bom_column_number = len(crystal_bom_input_data_list[1])  #获取列数目

                if cadence_bom_raw_number != 0 and cadence_bom_column_number != 0:  #保证导入的文件有数据
                    self.cadence_bom_file_data = crystal_bom_input_data_list         #将导入的数据赋值给类变量
                    
                    #先初始化行号和列号,然后在赋值,否则无效
                    self.show_ic_bom_form.setRowCount(cadence_bom_raw_number)           #设置列表行个数
                    self.show_ic_bom_form.setColumnCount(cadence_bom_column_number)     #设置列表列
                    

                    #将所要显示的内容添加到对应表格中
                    for i in range(cadence_bom_raw_number):
                        cadence_raw_data = self.cadence_bom_file_data[i]       #获取行数据
                        for j in range(cadence_bom_column_number):             #有8列数据
                            newItem = QTableWidgetItem(cadence_raw_data[j]) 
                            self.show_ic_bom_form.setItem(i,j,newItem)
                            # if j != 1:
                            #     self.show_ic_bom_form.setEditTriggers(QAbstractItemView.NoEditTriggers)  #设置表格是否可以编辑, 设置编辑规则的枚举值,代表不可以被编辑

                            
                    self.show_ic_bom_form.resizeColumnsToContents()    #将行和列设置为所显示内容的宽度。让行和列设置为自适应宽度模式
                    self.show_ic_bom_form.resizeRowsToContents()       #将行和列的宽度、高度设置为与所显示内容的宽度、高度相匹配
                    self.show_ic_bom_form.verticalHeader().setVisible(False)  #隐藏水平方向的表头
                    self.show_ic_bom_form.horizontalHeader().setVisible(False) #隐藏垂直方向的表头

                # print(0)

                self.show_all_mesage.append('BOM信息导入成功')


            else:
                self.show_all_mesage.append('请导入正确的水晶BOM格式文件!!! BOM 表格后缀格式doc或者docx')
                return 
            # self.cadence_bom_file_data = pd.read_csv(f.name,header=None,keep_default_na= False)  #读取cadence软件csv格式的bom.


    def doc_file_save_as_docx(self, file_name):
        #如果BOm表格是doc格式,则将文件另存为docx,然后再处理
        try:
            
            
            try:
                docx_file_name = file_name.replace('doc', "docx")

                if os.path.exists(docx_file_name):
                    return docx_file_name
                word = wc.Dispatch('Word.Application')
                doc = word.Documents.Open(file_name)        # 目标路径下的文件
                
                doc.SaveAs(docx_file_name, 12, False, "", True, "", False, False, False, False)  # 转化后路径下的文件    
                doc.Close()
                word.Quit()

            except AttributeError as e:   #doc 文件转换为 docs 文件时,有出现转换不成功情况。
                self.show_all_mesage.append('导入BOM文件出错!!!,请尝试重新导入')
                return
                
        except TypeError as e:                      #如果文件没有关闭则会报错 typeerror
            self.show_all_mesage.append('请先关闭文件,再操作!!!!!')
            return

        return docx_file_name

    def config_tip_mounter_pushButton_function(self):
        '''
        导入bom 表格之后配置料站号,配置好之后才可以点击
        '''

        if self.cadence_bom_file_data == None:                               #保证有BOM表格数据导入
            self.show_all_mesage.append('请先导入BOM数据,再进行配置料站号')
            return  
        
        cadence_bom_raw_number = self.show_ic_bom_form.rowCount()         #获取Qtablewidet 表格控件的行数
        cadence_bom_column_number = self.show_ic_bom_form.columnCount()   #获取Qtablewidet 表格控件的列数
        if cadence_bom_column_number != 7:
            self.show_all_mesage.append('请确认文件格式!!!!')
            return 

        if cadence_bom_raw_number == 0 or cadence_bom_column_number == 0:
            self.show_all_mesage.append('BOM数据为空!!!!!,请导入BOM数据')
            return
        else:
            bom_tabel_data = [[] for  i in range(cadence_bom_raw_number)]  #创建一个 cadence_bom_column_number 行的列表,用于保存表格数据
            for i in range(cadence_bom_raw_number):
                for j in range(cadence_bom_column_number):

                    #*************************下述功能最后开放,功能检测已经没有问题***************************************
                    if 1:     #*************************************************************
                        if self.show_ic_bom_form.item(i,1).text() == '':                           #如果料站没有配置,则配置完成之后再进行后续操作
                            self.show_all_mesage.append('第%s行的料站号没有配置,请配置!!!!'%i)
                            return
                        if i > 1:
                            res = re.search('\D', self.show_ic_bom_form.item(i,1).text())       #配置好的料站,保证数据是数字,不是字符串,\D 匹配任意非数字
                            if res != None:                          
                                self.show_all_mesage.append('料站号只能配置数字,请确认第%s行的配置!!!'%i)
                                return
                            

                            #保存输入的输入的料站号在1~29和60~99,如果为零则不焊接
                            # if int(self.show_ic_bom_form.item(i,1).text()) != 0:
                            #     if int(self.show_ic_bom_form.item(i,1).text()) > 99 or (int(self.show_ic_bom_form.item(i,1).text()) > 29  and int(self.show_ic_bom_form.item(i,1).text()) < 60): 
                                        
                            #         self.show_all_mesage.append('料站号只能配置为大于0小于99,和30~59之间的数字,请确认第%s行的配置!!!'%i)
                            #         return


                    #根据器件名称,增加料站编码号

                    bom_tabel_data[i].append((self.show_ic_bom_form.item(i,j).text()))    #获取配置好的数据
            


            #相同器件增加,料站使用相同的 料站号标识
            # ic_bom_form_data = ic_bom_form_data.split(' ')
            # save_bom_tabel_data_list = []
            for i in range(0, len(bom_tabel_data)):
                ic_bom_form_data = bom_tabel_data[i][2].split(' ')
                if i== 0:
                    ic_name_reverse_data = '料带号编码'
                else:
                    for ic_bom_form in  ic_bom_form_data:
                        if ic_bom_form != '':
                            ic_name = ic_bom_form
                            break
                    ic_name_reverse = copy.deepcopy(ic_name)  #为了不改变原始数据,使用深度copy
                    ic_name_reverse_data = ic_name_reverse[::-1]  #将器件名称逆序排序
                bom_tabel_data[i].append(ic_name_reverse_data)
                # save_bom_tabel_data_list.append([bom_tabel_data[i], ic_name_reverse_data])  #增加料站号编号
            
            # bom_tabel_data[i].append(ic_name_reverse_data)
            # print(0)

            
            self.cadence_bom_config_file_data = bom_tabel_data
            self.show_all_mesage.append('器件料号位置配置完成')
                
    #
    def open_position_file_push_button_function(self):

        '''
        #打开位置文件文件,并且处理位置文件数据
        
        '''
        if 1:  #下述功能是为了,保证BOM表格和位置文件都已经导入,并且功能已经测试完成,最后在开放
            if self.cadence_bom_file_data == None:
                self.show_all_mesage.append('请先导入BOM表格数据!!!')
                return

        
        # dlg = QFileDialog(self, '打开文件','./', '*.txt')  #设置导入文件的类型

        dlg = QFileDialog(self, '打开文件','D:/BOM/', '*.txt')  #设置导入文件的类型  打开指定位置文件
        
        # (self, '打开文件','./', '*.doc;;*.docx')  #设置导入文件的类型
        dlg.setFileMode(QFileDialog.AnyFile)  #设置打开文件格式
        dlg.setFilter(QDir.Files)


        if dlg.exec_():
            filenames = dlg.selectedFiles()
            f = open(filenames[0], 'r')
            #导入文件数据
            res = re.search('\.txt',f.name)  #保证后缀格式是.txt
            if f.name and res != None:
                show_txt = (f.name).split('/')[-1]
                self.show_position_file_name.setText(show_txt) 

        
                cadence_position_file_data = pd.read_csv(f.name,header=None,keep_default_na= False)  #读取cadence软件csv格式的bom.
                # position_Column = cadence_position_file_data.shape[1]  #获取文件有多少行
                position_raw = cadence_position_file_data.shape[0]   #获取文件有多少行
                
                if position_raw == 0 :
                    self.show_all_mesage.append('导入的位置文件有问题!!!,请确认文件')
                    return
                cadence_position_list_data = []
                title = ['器件编号','横坐标','纵坐标','角度','正反面标识','封装信息','是否焊接']
                cadence_position_list_data.append(title)  #为了便于知道每一列的含义,特添加表头

                ic_x_position_list = []
                ic_y_posiiton_list = []
                mid_position_data_list = []
                

                #下述循环 为了寻找最大的器件IC坐标
                for position_file_raw_data in cadence_position_file_data.values[1:]:    ##由于位置文件可能是英寸也可能是毫米,需要将英寸换算成毫米
                    mid_data = list(position_file_raw_data)                 #需要将数据先转换为列表再处理 
                    mid_data = mid_data[0].split(' ')
                    


                    for j in range(len(mid_data)):

                        # print(mid_data[j])
                        if mid_data[j] != '':
                            mid_position_data_list.append(mid_data[j])
                    
                    if len(mid_position_data_list) != 0:
                        ic_x_position_list.append(float(copy.deepcopy(mid_position_data_list[1])))
                        ic_y_posiiton_list.append(float(copy.deepcopy(mid_position_data_list[2])))
                        mid_position_data_list.clear()

                
                # if unit_flag == 1:  #当位置文件是英寸是,需要将坐标文件转换
                #     index_m = 0
                #     for index_m in range(len(ic_x_position_list)):
                #         x_position_mid_data = ic_x_position_list[index_m] / 25.4  #英寸换算毫米
                #         ic_x_position_list[index_m] = copy.deepcopy(x_position_mid_data)

                #         y_position_mid_data = ic_y_posiiton_list[index_m] / 25.4  #英寸换算毫米
                #         ic_y_posiiton_list[index_m] = copy.deepcopy(y_position_mid_data)




                ic_max_x_position = max(ic_x_position_list)  #x 轴最大坐标
                ic_min_x_position = min(ic_x_position_list)  #x 轴最小坐标
                ic_avr_x_position = (ic_max_x_position  + ic_min_x_position) / 2   #镜像处理,如果器件是背面镜像处理

                ic_max_y_position = max(ic_y_posiiton_list)  #x 轴最大坐标
                ic_min_y_position = min(ic_y_posiiton_list)  #x 轴最小坐标
                ic_avr_y_position = (ic_max_y_position + ic_min_y_position) / 2   #镜像处理


                mid_data_list = []
                unit_flag = 0   #单位标志位
                flag_0 = 0
                
                for position_file_raw_data in cadence_position_file_data.values[0:]:    ##由于第一行数单位信息,第一行仅用于识别单位信息
                    


                    mid_data = list(position_file_raw_data)                 #需要将数据先转换为列表再处理 
                    mid_data = mid_data[0].split(' ')

                    if flag_0 == 0:   #只允许进来第一次
                        if mid_data[2] == 'MILS':
                            unit_flag = 1  #单位标志位,如果是英寸标志位置一  否则为零

                        flag_0 = 1
                        continue
                    
                    for j in range(len(mid_data)):

                        # print(mid_data[j])
                        if mid_data[j] != '':
                            mid_data_list.append(mid_data[j])
                    
                    if len(mid_data_list) != 0 and unit_flag == 1:
                        x_position_mid_data = str(format(float(mid_data_list[1]) * 0.0254, ' .3f'))  #格式化输出,保留三位小数
                        y_position_mid_data = str(format(float(mid_data_list[2]) * 0.0254, ' .3f'))  #格式化输出,保留三位小数
                        

                        #此功能是否保留待确认 ************************************************************************************
                        if float(x_position_mid_data) + 100 > 400 or float(y_position_mid_data) + 100 > 400:
                            self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
                            mid_data_list.clear()
                            continue

                        mid_data_list[1] = copy.deepcopy(x_position_mid_data)   #如果是mil,使用换算之后的坐标,如果是毫米,则直接使用 mil(中文译音:密耳),即千分之一英寸,等于0.0254mm(毫米)。
                        mid_data_list[2] = copy.deepcopy(y_position_mid_data)   #如果是mil,使用换算之后的坐标,如果是毫米,则直接使用


                        if len(mid_data_list) == 5:



                            #此功能是否保留待确认 ************************************************************************************
                            if float(x_position_mid_data) + 100 > 400 or float(y_position_mid_data) + 100 > 400:
                                self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
                                mid_data_list.clear()
                                continue

                            mid_data_list.insert(4,'T')  #正面器件 T 标识, X轴坐标不做任何处理                                 
                            mid_data_list.append("1")
                            cadence_position_list_data.append(copy.deepcopy(mid_data_list))  #需要使用深度copy
                            mid_data_list.clear()

                        elif len(mid_data_list) == 6:
                            mid_data_list[4] = 'B'      #正面器件 B 标识, X轴坐标跟中间值比较,如果大于中间值,坐标减去中间值,如果小于中间值 则加上中间值

                            #坐标镜像处理
                            # if float(mid_data_list[1]) < ic_avr_x_position:
                            #     mid_data_list[1] = str(format((ic_avr_x_position * 2  - float(mid_data_list[1])), ' .3f'))

                            # elif float(mid_data_list[1]) > ic_avr_x_position:
                            # mid_data_list[1] = str(format((float(mid_data_list[1]) * 2 - ic_avr_x_position), ' .3f'))




                            #此功能是否保留待确认 ************************************************************************************
                            if float(x_position_mid_data) + 100 > 400 or float(y_position_mid_data) + 100 > 400:
                                self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
                                mid_data_list.clear()
                                continue


                            mid_data_list[1] = str(format((ic_avr_x_position * 2  - float(mid_data_list[1])), ' .3f'))


                            mid_data_list.append("1")
                            cadence_position_list_data.append(copy.deepcopy(mid_data_list))
                            mid_data_list.clear()

                    elif len(mid_data_list) != 0 and unit_flag == 0:  #导入位置文件单位是毫米直接使用
                        if len(mid_data_list) == 5:


                            #此功能是否保留待确认 ************************************************************************************
                            if float(mid_data_list[1]) + 100 > 400 or float(mid_data_list[2]) + 100 > 400:
                                self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
                                mid_data_list.clear()
                                continue


                            mid_data_list.insert(4,'T')  #正面器件 T 标识, X轴坐标不做任何处理                                 
                            mid_data_list.append("1")
                            cadence_position_list_data.append(copy.deepcopy(mid_data_list))  #需要使用深度copy
                            mid_data_list.clear()

                        elif len(mid_data_list) == 6:
                            mid_data_list[4] = 'B'      #正面器件 B 标识, X轴坐标跟中间值比较,如果大于中间值,坐标减去中间值,如果小于中间值 则加上中间值

                            #坐标镜像处理
                            # if float(mid_data_list[1]) < ic_avr_x_position:
                            #     mid_data_list[1] = str(format((ic_avr_x_position * 2  - float(mid_data_list[1])), ' .3f'))

                            # elif float(mid_data_list[1]) > ic_avr_x_position:
                            # mid_data_list[1] = str(format((float(mid_data_list[1]) * 2 - ic_avr_x_position), ' .3f'))


                            #此功能是否保留带确认 ************************************************************************************
                            if float(mid_data_list[1]) + 100 > 400 or float(mid_data_list[2]) + 100 > 400:
                                self.show_all_mesage.append('器件%s的坐标超出仪器最大位置,请确认器件位置是否正确'%(mid_data_list[0]))
                                mid_data_list.clear()
                                continue

                            mid_data_list[1] = str(format((ic_avr_x_position * 2  - float(mid_data_list[1])), ' .3f'))


                            mid_data_list.append("1")
                            cadence_position_list_data.append(copy.deepcopy(mid_data_list))
                            mid_data_list.clear()

                        else:
                            self.show_all_mesage.append('位置文件数据不符合正确的格式!!! 请确认')
                            return 

                # print(0)
                


                #表格显示信息

                if len(cadence_position_list_data) == 0:
                    self.show_all_mesage.append('导入BOM表格为空,请重新导入')
                    return
                    
                cadence_position_raw_number = len(cadence_position_list_data)        #获取行数目
                cadence_position_column_number = len(cadence_position_list_data[1])  #获取列数目

                if cadence_position_raw_number != 0 and cadence_position_column_number != 0:  #保证导入的文件有数据
                    self.cadence_ic_position_mesage = cadence_position_list_data  #将最终位置信息保存
                    
                    #先初始化行号和列号,然后在赋值,否则无效
                    self.show_ic_bom_form.setRowCount(cadence_position_raw_number)           #设置列表行个数
                    self.show_ic_bom_form.setColumnCount(cadence_position_column_number)     #设置列表列
                    

                    #将所要显示的内容添加到对应表格中
                    for i in range(cadence_position_raw_number):
                        cadence_position_raw_data = cadence_position_list_data[i]       #获取行数据
                        for j in range(cadence_position_column_number):             #有8列数据
                            newItem = QTableWidgetItem(cadence_position_raw_data[j]) 
                            self.show_ic_bom_form.setItem(i,j,newItem)
                            # if j != 1:
                            #     self.show_ic_bom_form.setEditTriggers(QAbstractItemView.NoEditTriggers)  #设置表格是否可以编辑, 设置编辑规则的枚举值,代表不可以被编辑

                            
                    self.show_ic_bom_form.resizeColumnsToContents()    #将行和列设置为所显示内容的宽度。让行和列设置为自适应宽度模式
                    self.show_ic_bom_form.resizeRowsToContents()       #将行和列的宽度、高度设置为与所显示内容的宽度、高度相匹配
                    self.show_ic_bom_form.verticalHeader().setVisible(False)  #隐藏水平方向的表头
                    self.show_ic_bom_form.horizontalHeader().setVisible(False) #隐藏垂直方向的表头

                # print(0)

                self.show_all_mesage.append('位置文件信息导入成功')

                # self.show_all_mesage.append('位置文件信息处理完成')

            else:
                self.show_all_mesage.append('请导入正确的位置文件!!! 位置文件后缀格式txt')
                return 



    def open_configure_tip_mounter_file_push_button_function(self):
        '''
        配置贴片机器的吸头信息,
        默认情况下在文件路径下有一个文件名称:tip_mounter_mouth.xlsx
        文件中存储,贴片机,每一个料带,对应的吸头,表格可以更改
        '''
        if 1:  #下述功能是为了,保证BOM表格和位置文件都已经导入,并且功能已经测试完成,最后在开放
            if self.cadence_bom_file_data == None:
                self.show_all_mesage.append('请先导入BOM表格数据!!!')
                return
                    
            elif self.cadence_ic_position_mesage == None:
                self.show_all_mesage.append('请先导入器件位置数据!!!')
                return

        
        # dlg = QFileDialog(self, '打开文件','./', '*.xlsx')  #设置导入文件的类型

        dlg = QFileDialog(self, '打开文件','D:/BOM/', '*.xlsx')  #设置导入文件的类型 打开制定位置文件

        # (self, '打开文件','./', '*.doc;;*.docx')  #设置导入文件的类型
        dlg.setFileMode(QFileDialog.AnyFile)  #设置打开文件格式
        dlg.setFilter(QDir.Files)


        if dlg.exec_():
            filenames = dlg.selectedFiles()
            f = open(filenames[0], 'r')
            #导入文件数据
            res = re.search('\.xlsx',f.name)  #保证后缀格式是.txt
            if f.name and res != None:
                show_txt = (f.name).split('/')[-1]
                self.show_tip_mounter_file_name.setText(show_txt)

                cadence_tip_mounter_mouth_file_data = pd.read_excel(f.name,header=None,keep_default_na= False)  #读取cadence软件csv格式的bom.
                position_Column = cadence_tip_mounter_mouth_file_data.shape[1]  #获取文件有多少列
                position_raw = cadence_tip_mounter_mouth_file_data.shape[0]   #获取文件有多少行
                
                if position_raw == 0 :
                    self.show_all_mesage.append('导入的位置文件有问题!!!,请确认文件')
                    return

                tip_mounter_list_data = []

                mid_data_list = []

                for position_file_raw_data in cadence_tip_mounter_mouth_file_data.values[:]:    ##由于第一行数单位信息,所以直接不读取
                    mid_data = (list(position_file_raw_data))                 #需要将数据先转换为列表再处理 
                    for i in range(2):
                        mid_data_list.append(mid_data[i])

                    tip_mounter_list_data.append(copy.deepcopy(mid_data_list))  #保存数据
                    mid_data_list.clear()
                

                if len(tip_mounter_list_data) == 0:
                    self.show_all_mesage.append('导入贴片机吸嘴信息有误,请重新导入')
                    return
                    
                cadence_tip_mounter_raw_number = len(tip_mounter_list_data)        #获取行数目
                cadence_tip_mounter_column_number = len(tip_mounter_list_data[1])  #获取列数目

                if cadence_tip_mounter_raw_number != 0 and cadence_tip_mounter_column_number != 0:  #保证导入的文件有数据

                    self.tip_mouth_excel_file_data = tip_mounter_list_data     #将最终位置信息保存
                    
                    #先初始化行号和列号,然后在赋值,否则无效
                    self.show_ic_bom_form.setRowCount(cadence_tip_mounter_raw_number)           #设置列表行个数
                    self.show_ic_bom_form.setColumnCount(cadence_tip_mounter_column_number)     #设置列表列
                    

                    #将所要显示的内容添加到对应表格中
                    for i in range(cadence_tip_mounter_raw_number):
                        cadence_tip_mounter_raw_data = tip_mounter_list_data[i]            #获取行数据
                        for j in range(cadence_tip_mounter_column_number):                 #有2列数据
                            newItem = QTableWidgetItem(str(cadence_tip_mounter_raw_data[j]))   #表格中只能显示字符串
                            self.show_ic_bom_form.setItem(i,j,newItem)


                            
                    self.show_ic_bom_form.resizeColumnsToContents()           #将行和列设置为所显示内容的宽度。让行和列设置为自适应宽度模式
                    self.show_ic_bom_form.resizeRowsToContents()              #将行和列的宽度、高度设置为与所显示内容的宽度、高度相匹配
                    self.show_ic_bom_form.verticalHeader().setVisible(False)  #隐藏水平方向的表头
                    self.show_ic_bom_form.horizontalHeader().setVisible(False) #隐藏垂直方向的表头

                # print(0)

                    self.show_all_mesage.append('贴片机吸嘴信息导入成功')


                # self.show_all_mesage.append('贴片机吸嘴配置信息完成')





    def configuration_welded_station_push_button_function(self):
        '''
        函数功能:配置器件是否焊接
        '''
        if self.cadence_ic_position_mesage == None:                               #保证位置文件数据导入
            self.show_all_mesage.append('请先导入器件位置文件,再进行配置是否焊接')
            return  
        
        cadence_bom_raw_number = self.show_ic_bom_form.rowCount()         #获取Qtablewidet 表格控件的行数
        cadence_bom_column_number = self.show_ic_bom_form.columnCount()   #获取Qtablewidet 表格控件的列数

        if cadence_bom_column_number != 7:
            self.show_all_mesage.append('请确认文件格式!!!!')
            return 

        if cadence_bom_raw_number == 0 or cadence_bom_column_number == 0:
            self.show_all_mesage.append('位置文件数据为空!!!!!,请导入位置文件数据')
            return
        else:
            position_tabel_data = [[] for  i in range(cadence_bom_raw_number)]  #创建一个 cadence_bom_column_number 行的列表,用于保存表格数据
            for i in range(cadence_bom_raw_number):
                for j in range(cadence_bom_column_number):
                    if i >= 1:
                        if self.show_ic_bom_form.item(i,6).text() != "1":
                            if self.show_ic_bom_form.item(i,6).text() != "0":
                                self.show_all_mesage.append("是否焊接只能配置为0或者1,请重新配置数据!!!")
                                return

                    position_tabel_data[i].append(self.show_ic_bom_form.item(i,j).text())    #获取配置好的数据



            self.save_config_welded_station_data = position_tabel_data

            self.show_all_mesage.append('配置器件焊接状态数据成功')





    def configure_tip_mounter_station_push_button_function(self):
        '''
        配置器件吸嘴型号
        '''


        if self.tip_mouth_excel_file_data == None:                               #保证位置文件数据导入
            self.show_all_mesage.append('请先导入贴片机吸盘配置文件')
            return  
        
        cadence_bom_raw_number = self.show_ic_bom_form.rowCount()         #获取Qtablewidet 表格控件的行数
        cadence_bom_column_number = self.show_ic_bom_form.columnCount()   #获取Qtablewidet 表格控件的列数

        if cadence_bom_column_number != 2:
            self.show_all_mesage.append('请确认文件格式!!!!')
            return 

        if cadence_bom_raw_number == 0 or cadence_bom_column_number == 0:
            self.show_all_mesage.append('贴片机吸盘配置文件为空!!!请确认文件')
            return
        else:
            tip_mouth_tabel_data = [[] for  i in range(cadence_bom_raw_number)]  #创建一个 cadence_bom_column_number 行的列表,用于保存表格数据
            for i in range(cadence_bom_raw_number):
                for j in range(cadence_bom_column_number):
                    if i >= 1:
                        if self.show_ic_bom_form.item(i,1).text() != "1":
                            if self.show_ic_bom_form.item(i,1).text() != "2":
                                self.show_all_mesage.append("贴片机吸盘只能配置为1或者2,请重新配置数据!!!")
                                return

                    tip_mouth_tabel_data[i].append(self.show_ic_bom_form.item(i,j).text())    #获取配置好的数据

            
            self.save_config_tip_mounter_data = tip_mouth_tabel_data
            self.show_all_mesage.append('配置器件焊接状态数据成功')
        



    def configuration_and_generate_file_function(self):

        '''
        # 将所有的配置好的数据,按照规定格式生成  lpv格式文件
        # 打开位置文件文件,并且处理位置文件数据
        
        '''

        if self.cadence_bom_file_data == None:       #保存导入BOM文件的数据
            self.show_all_mesage.append('请先导入BOM文件!!!')
            return
        
        elif self.cadence_bom_config_file_data == None:       #配置器件的料站号
            self.show_all_mesage.append('请先配置器件的料站号!!!')
            return

        elif self.cadence_ic_position_mesage == None:       #保存导入BOM文件的数据
            self.show_all_mesage.append('请先导入器件的位置文件!!!')
            return
        
        elif self.tip_mouth_excel_file_data == None:       #保存导入BOM文件的数据
            self.show_all_mesage.append('请先导入贴片机吸头的配置文件!!!')
            return


        elif self.save_config_welded_station_data == None:  #保存配号是否焊接的数据
            self.show_all_mesage.append('请先配置是否焊接!!!')
            return


        elif self.save_config_tip_mounter_data == None:  #保存配置好的吸盘类型
            self.show_all_mesage.append('请先配置吸盘类型!!!')
            return 

        


        first_part_file_config_message_block = []
        #第一块文件信息列表
        if self.project_name != None:
            
            first_part_file_config_message_block.append('separated')
            first_part_file_config_message_block.append('FILE,%s'%(self.project_name))  #文件信息
            first_part_file_config_message_block.append('PCBFILE,%s'%(self.project_name))  #文件信息
            first_part_file_config_message_block.append('DATE,%s'%(time.strftime('%Y/%m/%d',time.localtime(time.time()))))  #日期
            first_part_file_config_message_block.append('TIME,%s'%(time.strftime('%H:%M:%S',time.localtime(time.time()))))  #时间信息
            first_part_file_config_message_block.append('PANELYPE,0')    #其他信息,具体含义,还不清楚
            first_part_file_config_message_block.append(' ')
        else:
            self.show_all_mesage.append('工程文件名称为空!!,请确认')
            return


        #用于保存第二部分数据
        second_part_file_config_message_block = []
        

        second_title = ["Table,No,ID.,DeltX,DeltY,FeedRates,Note,Height,Speed,Status,SizeX,SizeY"]  #第二部分表头信息
        # second_title = eval(second_title)

        second_part_file_config_message_block.append(second_title)  #添加表头信息



        #用于保存第四部数据
        fourth_part_file_config_message_block = []
        fourth_title = ["Table,No,ID.,PHead,STNo.,DeltX,DeltY,Angle,Height,Skip,Speed,Explain,Note"]  #第四部分表头信息
        

        fourth_part_file_config_message_block.append(fourth_title)



        first_anchor_point = self.positioning_ic_1.text()   #第一个定位点,默认为空
        second_ancher_point = self.positioning_ic_2.text()  #第二个定位点,默认为空
        first_anchor_point_position = []    #保存定位点的位置
        second_ancher_point_position = []   #保存定点点的位置
        

        #从位置文件和BOM数据,获取信息,

        k = 0
        
        flag_1 = 0
        flag_2 = 0

        for i in range(1,len(self.cadence_ic_position_mesage)):  #去除表头信息,所以从1开始
            # for j in range(len(self.cadence_ic_position_mesage[i])):  
            ic_name = self.cadence_ic_position_mesage[i][0]  #取出器件的名称
            
            positon_mid_data = self.cadence_ic_position_mesage[i]
            flag = 0
            for j in range(1,len(self.cadence_bom_config_file_data)):   #去除表头信息,所以从1开始  ,遍历BOM 表格 IC name 
                bom_ic_name_mid_data = copy.deepcopy(self.cadence_bom_config_file_data[j][2])  #为了避免改变原先数据,使用深度copy

                bom_ic_name_mid_data = bom_ic_name_mid_data.split(' ')
                for m in range(len(bom_ic_name_mid_data)):
                    if ic_name == bom_ic_name_mid_data[m]:
                        bom_mid_data = self.cadence_bom_config_file_data[j]   #根据器件名称查找器件
                        flag = 1
                        break


            if positon_mid_data[0] == first_anchor_point:  #获取第一个位置点坐标

                first_anchor_point_mid_data = ["CalibPoint",1,k,positon_mid_data[1],positon_mid_data[2],ic_name]
                first_anchor_point_position.append(first_anchor_point_mid_data)
                flag_1 = 1

            if positon_mid_data[0] == second_ancher_point:  #获取第二个位置点坐标
                second_ancher_point_mid_data = ["CalibPoint",1,k,positon_mid_data[1],positon_mid_data[2],ic_name]
                second_ancher_point_position.append(second_ancher_point_mid_data)
                flag_2 = 1
            
            
            if flag == 1: 
                ic_name_reverse = copy.deepcopy(ic_name)  #为了不改变原始数据,使用深度copy
                ic_name_reverse_data = ic_name_reverse[::-1]  #将器件名称逆序排序
                
                skip = 0
                if positon_mid_data[6] == "1":  #是否焊接 5为焊接 0为不焊接 
                    skip = 4
                # elif bom_mid_data[1] == 0:
                #     skip  = 0  #器件是否焊接
                else:
                    skip = 6
    
                #角度大于180读时需要角度值减去180读,
                angle = float(positon_mid_data[3])

                if angle > 180:
                    angle = angle -360

                material_station_number = bom_mid_data[1]  #器件料站号
                
                if bom_mid_data[1] == '79': #79是默认料站号
                    ic_name_reverse_data = '79'   #后续不允许使用79料站号
                    skip = 6                   #如果;料带号为79则器件不焊接
                else: 
                    ic_name_reverse_data = bom_mid_data[7] #料带号


    
                #按照第四部分格式化输出数据                          料站号      X坐标             y 坐标                角度                                 高度 skip 速度(他俩顺序需要确定) 器件名称 器件名称逆序 延时
                fourth_block_mid_data = ["EComponent",k,k+1,1,material_station_number,positon_mid_data[1],positon_mid_data[2],angle,0.5,skip,0,ic_name,ic_name_reverse_data] #
                
                # fourth_block_mid_data = eval(fourth_block_mid_data)
                
                fourth_part_file_config_message_block.append(fourth_block_mid_data)
                
                #按照第二部分格式化输出数据               料站号
                

                                                                                                    #是否焊接
                second_block_mid_data = ["Station",k,bom_mid_data[1],0,0,2,ic_name_reverse_data,0.5,0,8,0,0]  #
                
                # second_block_mid_data = eval(second_block_mid_data)

                second_part_file_config_message_block.append(second_block_mid_data)

                k += 1
        


        second_part_file_config_message_block_list = []
        

        second_title = ["Table,No,ID.,DeltX,DeltY,FeedRates,Note,Height,Speed,Status,SizeX,SizeY"]  #第二部分表头信息
        # second_title = eval(second_title)

        second_part_file_config_message_block_list.append(second_title)  #添加表头信息

        flag_3 = 0
        # flag_4 = 0
        for i in range(1,len(second_part_file_config_message_block)-1):
            for j in range(i+1,len(second_part_file_config_message_block)):
                if second_part_file_config_message_block[i] != '':
                    if second_part_file_config_message_block[i][6] == second_part_file_config_message_block[j][6]:
                        # second_part_file_config_message_block_list.append(second_part_file_config_message_block[i])
                        # del second_part_file_config_message_block[j]

                        flag_3 += 1

                    # else:
                    #     flag_4 += 1
            if flag_3 == 0:
                second_part_file_config_message_block_list.append(second_part_file_config_message_block[i])
                flag_3 = 0
            else:
                flag_3 = 0



        #用于保存第三部数据
        third_part_file_config_message_block = []
        third_title = "Table,No.,ID,DeltX,DeltY"
        third_part_file_config_message_block.append(third_title) 
        third_title = "Panel_Coord,0,1,0,0"    
        third_part_file_config_message_block.append(third_title)

        #用于保存第五部数据
        fifth_part_file_config_message_block = []
        fifth_title = "Table,No.,ID,CenterX,CenterY,IntervalX,IntervalY,NumX,NumY,Start"
        fifth_part_file_config_message_block.append(fifth_title)

        fifth_part_file_config_message_block.append(" ")
        fifth_part_file_config_message_block.append(" ")

        fifth_title_0 = "Table,No.,nType,nAlg,nFinished"
        fifth_part_file_config_message_block.append(fifth_title_0)
        fifth_part_file_config_message_block.append("PcbCalib,0,0,0,0")
        fifth_title_1 = "Table,No.,ID,offsetX,offsetY,Note"
        fifth_part_file_config_message_block.append(fifth_title_1)





        #下面数据,要根据 positioning_ic_1 和 positioning_ic_2 的器件填写,先查找器件的位置信息,然后在查询位置信息,
        #功能待完善

        # if first_anchor_point != '' and flag_1 == 0:
        #     self.show_all_mesage.append('IC 位置1 配置有问题,请确认!!!!!!!!')
        #     return

        

        # if second_ancher_point != '' and flag_2 == 0:
        #     self.show_all_mesage.append('IC 位置2 配置有问题,请确认!!!!!!!!')
        #     return

        if  first_anchor_point != '' and flag_1 == 0:
            fifth_title_2 = "CalibPoint,0,0,0,0"
            fifth_part_file_config_message_block.append(fifth_title_2)
            self.show_all_mesage.append('IC 位置1 配置有问题,请确认!!!!!!!!')
            return

        else:
            fifth_part_file_config_message_block.append(first_anchor_point_position) 

        if second_ancher_point != '' and flag_2 == 0:                                                    #待处理
            fifth_title_2 = "CalibPoint,0,0,0,0"
            fifth_part_file_config_message_block.append(fifth_title_2)
            self.show_all_mesage.append('IC 位置2 配置有问题,请确认!!!!!!!!')
            return
            

        else:

            fifth_part_file_config_message_block.append(second_ancher_point_position)

        fifth_title_3 = 'Table,No.,DeltX,DeltY,AlphaX,AlphaY,BetaX,BetaY,DeltaAngle'
        fifth_part_file_config_message_block.append(fifth_title_3)

        all_save_data = []
        all_save_data.extend(first_part_file_config_message_block)
        all_save_data.extend(second_part_file_config_message_block_list)
        all_save_data.extend(' ')
        all_save_data.extend(third_part_file_config_message_block)
        all_save_data.extend(' ')
        all_save_data.extend(fourth_part_file_config_message_block)
        all_save_data.extend(' ')
        all_save_data.extend(fifth_part_file_config_message_block)
        all_save_data.extend(' ')


        #下述为了去除列表中的方括号
        # all_save_data_list = []

        # for i in range(len(all_save_data)):
        #     if type(all_save_data[i]) == list :
        #         if len(all_save_data[i]) > 0:
        #             print(i)
        #             all_save_data_list.append(copy.deepcopy(all_save_data[i][0]))
        #     else:
        #         all_save_data_list.append(all_save_data)


        
        save_all_data_to_file= pd.DataFrame(all_save_data)
        

        #文件名称中不能有点号存在
        res = re.search('.',self.project_name)
        if res!= None:
            project_name = (self.project_name).replace('.', '')
        else:
            project_name = self.project_name
        

        #***************************文件生产位置*************************************************************************
        try:
            file_path = 'D:/CHJD_SMT/Files'  #电脑目录,最后使用
            save_path_last = file_path + '\\' + project_name + '.dpv'

            save_all_data_to_file.to_csv(save_path_last, index = False, header = False)

        except FileNotFoundError:
            file_path = os.getcwd()

        

            save_path_last = file_path + '\\' + project_name + '.dpv'

            save_all_data_to_file.to_csv(save_path_last, index = False, header = False)

        #***************************文件生产位置*************************************************************************
        
        all_save_data_list = []
        with open(save_path_last,'r') as f:
            line_data = f.readlines()
            # line_data = ''.join(line_data).strip('\n')  #去除读入文件 \n
            for raw_data in line_data:
                # print(raw_data)
                
                mid_data = copy.deepcopy(raw_data)
                res = re.search('\'',mid_data)
                if res != None:
                    mid_data = mid_data.replace('\'', ' ')

                all_save_data_list.append(mid_data[:])

        all_save_data_list_1 = []
        for raw_data in all_save_data_list:                
            mid_data = copy.deepcopy(raw_data)
            res = re.search('"',mid_data)
            if res != None:
                mid_data = mid_data.replace('"', ' ')

            all_save_data_list_1.append(mid_data)
        
        all_save_data_list_2 = []
        for raw_data in all_save_data_list_1:                
            mid_data = copy.deepcopy(raw_data)
            res = re.search('\[',mid_data)
            if res != None:
                mid_data = mid_data.replace('[', ' ')

            all_save_data_list_2.append(mid_data)

        all_save_data_list_3 = []
        for raw_data in all_save_data_list_2:                
            mid_data = copy.deepcopy(raw_data)
            res = re.search('\]',mid_data)
            if res != None:
                mid_data = mid_data.replace(']', ' ')

            all_save_data_list_3.append(mid_data)

        all_save_data_list_4 = []
        for raw_data in all_save_data_list_3:                
            mid_data = copy.deepcopy(raw_data)
            res = re.search(' ',mid_data)
            if res != None:
                mid_data = mid_data.replace(' ', '')

            all_save_data_list_4.append(mid_data)


        # save_all_data_to_file= pd.DataFrame(all_save_data_list_4)
        # save_path_last = os.getcwd() + project_name + '.dpv'

        # save_all_data_to_file.to_csv(save_path_last, index = False, header = False)
        
        save_path_last = file_path + '\\' + project_name +'.dpv'
        
        np.savetxt(save_path_last, all_save_data_list_4, fmt = '%s')

        self.show_all_mesage.append('配置文件生成成功')




if __name__ == "__main__":

    app = QApplication([])
    example = Table()
    example.show()
    app.exec_()

UI程序

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

# Form implementation generated from reading ui file 'mounter_qt_20210623.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1276, 771)
        MainWindow.setMaximumSize(QtCore.QSize(1276, 771))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(30, 20, 921, 661))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_4 = QtWidgets.QLabel(self.layoutWidget)
        self.label_4.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_4.setFont(font)
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setObjectName("label_4")
        self.verticalLayout.addWidget(self.label_4)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.layoutWidget)
        self.label.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.show_bom_file_name = QtWidgets.QLineEdit(self.layoutWidget)
        self.show_bom_file_name.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.show_bom_file_name.setText("")
        self.show_bom_file_name.setReadOnly(True)
        self.show_bom_file_name.setObjectName("show_bom_file_name")
        self.horizontalLayout.addWidget(self.show_bom_file_name)
        self.open_bom_file_push_button = QtWidgets.QPushButton(self.layoutWidget)
        self.open_bom_file_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.open_bom_file_push_button.setObjectName("open_bom_file_push_button")
        self.horizontalLayout.addWidget(self.open_bom_file_push_button)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.label_2 = QtWidgets.QLabel(self.layoutWidget)
        self.label_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.verticalLayout.addWidget(self.label_2)
        self.show_ic_bom_form = QtWidgets.QTableWidget(self.layoutWidget)
        self.show_ic_bom_form.setObjectName("show_ic_bom_form")
        self.show_ic_bom_form.setColumnCount(0)
        self.show_ic_bom_form.setRowCount(0)
        self.verticalLayout.addWidget(self.show_ic_bom_form)
        self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget1.setGeometry(QtCore.QRect(960, 20, 271, 691))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.label_3 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_3.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")
        self.verticalLayout_2.addWidget(self.label_3)
        self.show_position_file_name = QtWidgets.QLineEdit(self.layoutWidget1)
        self.show_position_file_name.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.show_position_file_name.setText("")
        self.show_position_file_name.setReadOnly(True)
        self.show_position_file_name.setObjectName("show_position_file_name")
        self.verticalLayout_2.addWidget(self.show_position_file_name)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_10 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_10.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_10.setFont(font)
        self.label_10.setAlignment(QtCore.Qt.AlignCenter)
        self.label_10.setObjectName("label_10")
        self.horizontalLayout_2.addWidget(self.label_10)
        self.open_position_file_push_button = QtWidgets.QPushButton(self.layoutWidget1)
        self.open_position_file_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.open_position_file_push_button.setObjectName("open_position_file_push_button")
        self.horizontalLayout_2.addWidget(self.open_position_file_push_button)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_11 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_11.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_11.setFont(font)
        self.label_11.setAlignment(QtCore.Qt.AlignCenter)
        self.label_11.setObjectName("label_11")
        self.horizontalLayout_3.addWidget(self.label_11)
        self.configuration_welded_station_push_button = QtWidgets.QPushButton(self.layoutWidget1)
        self.configuration_welded_station_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.configuration_welded_station_push_button.setObjectName("configuration_welded_station_push_button")
        self.horizontalLayout_3.addWidget(self.configuration_welded_station_push_button)
        self.verticalLayout_2.addLayout(self.horizontalLayout_3)
        self.label_8 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_8.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_8.setAlignment(QtCore.Qt.AlignCenter)
        self.label_8.setObjectName("label_8")
        self.verticalLayout_2.addWidget(self.label_8)
        self.show_tip_mounter_file_name = QtWidgets.QLineEdit(self.layoutWidget1)
        self.show_tip_mounter_file_name.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.show_tip_mounter_file_name.setText("")
        self.show_tip_mounter_file_name.setReadOnly(True)
        self.show_tip_mounter_file_name.setObjectName("show_tip_mounter_file_name")
        self.verticalLayout_2.addWidget(self.show_tip_mounter_file_name)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_12 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_12.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_12.setFont(font)
        self.label_12.setAlignment(QtCore.Qt.AlignCenter)
        self.label_12.setObjectName("label_12")
        self.horizontalLayout_4.addWidget(self.label_12)
        self.open_configure_tip_mounter_file_push_button = QtWidgets.QPushButton(self.layoutWidget1)
        self.open_configure_tip_mounter_file_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.open_configure_tip_mounter_file_push_button.setObjectName("open_configure_tip_mounter_file_push_button")
        self.horizontalLayout_4.addWidget(self.open_configure_tip_mounter_file_push_button)
        self.verticalLayout_2.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        self.label_13 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_13.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_13.setFont(font)
        self.label_13.setAlignment(QtCore.Qt.AlignCenter)
        self.label_13.setObjectName("label_13")
        self.horizontalLayout_7.addWidget(self.label_13)
        self.configure_tip_mounter_station_push_button = QtWidgets.QPushButton(self.layoutWidget1)
        self.configure_tip_mounter_station_push_button.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.configure_tip_mounter_station_push_button.setObjectName("configure_tip_mounter_station_push_button")
        self.horizontalLayout_7.addWidget(self.configure_tip_mounter_station_push_button)
        self.verticalLayout_2.addLayout(self.horizontalLayout_7)
        self.label_14 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_14.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_14.setFont(font)
        self.label_14.setAlignment(QtCore.Qt.AlignCenter)
        self.label_14.setObjectName("label_14")
        self.verticalLayout_2.addWidget(self.label_14)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_15 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_15.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_15.setObjectName("label_15")
        self.horizontalLayout_5.addWidget(self.label_15)
        self.positioning_ic_1 = QtWidgets.QLineEdit(self.layoutWidget1)
        self.positioning_ic_1.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.positioning_ic_1.setText("")
        self.positioning_ic_1.setAlignment(QtCore.Qt.AlignCenter)
        self.positioning_ic_1.setReadOnly(False)
        self.positioning_ic_1.setObjectName("positioning_ic_1")
        self.horizontalLayout_5.addWidget(self.positioning_ic_1)
        self.verticalLayout_2.addLayout(self.horizontalLayout_5)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_6 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_6.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_6.addWidget(self.label_6)
        self.positioning_ic_2 = QtWidgets.QLineEdit(self.layoutWidget1)
        self.positioning_ic_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.positioning_ic_2.setText("")
        self.positioning_ic_2.setAlignment(QtCore.Qt.AlignCenter)
        self.positioning_ic_2.setReadOnly(False)
        self.positioning_ic_2.setObjectName("positioning_ic_2")
        self.horizontalLayout_6.addWidget(self.positioning_ic_2)
        self.verticalLayout_2.addLayout(self.horizontalLayout_6)
        self.label_7 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_7.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.label_7.setAlignment(QtCore.Qt.AlignCenter)
        self.label_7.setObjectName("label_7")
        self.verticalLayout_2.addWidget(self.label_7)
        self.show_all_mesage = QtWidgets.QTextBrowser(self.layoutWidget1)
        self.show_all_mesage.setObjectName("show_all_mesage")
        self.verticalLayout_2.addWidget(self.show_all_mesage)
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        self.label_16 = QtWidgets.QLabel(self.layoutWidget1)
        self.label_16.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_16.setFont(font)
        self.label_16.setAlignment(QtCore.Qt.AlignCenter)
        self.label_16.setObjectName("label_16")
        self.horizontalLayout_8.addWidget(self.label_16)
        self.configuration_and_generate_file = QtWidgets.QPushButton(self.layoutWidget1)
        self.configuration_and_generate_file.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.configuration_and_generate_file.setObjectName("configuration_and_generate_file")
        self.horizontalLayout_8.addWidget(self.configuration_and_generate_file)
        self.verticalLayout_2.addLayout(self.horizontalLayout_8)
        self.layoutWidget2 = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget2.setGeometry(QtCore.QRect(750, 680, 201, 41))
        self.layoutWidget2.setObjectName("layoutWidget2")
        self.horizontalLayout_9 = QtWidgets.QHBoxLayout(self.layoutWidget2)
        self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_9.setObjectName("horizontalLayout_9")
        self.label_9 = QtWidgets.QLabel(self.layoutWidget2)
        self.label_9.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_9.setFont(font)
        self.label_9.setAlignment(QtCore.Qt.AlignCenter)
        self.label_9.setObjectName("label_9")
        self.horizontalLayout_9.addWidget(self.label_9)
        self.config_tip_mounter_pushButton = QtWidgets.QPushButton(self.layoutWidget2)
        self.config_tip_mounter_pushButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.config_tip_mounter_pushButton.setObjectName("config_tip_mounter_pushButton")
        self.horizontalLayout_9.addWidget(self.config_tip_mounter_pushButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1276, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_4.setText(_translate("MainWindow", "步骤1"))
        self.label.setText(_translate("MainWindow", "BOM文件名称"))
        self.open_bom_file_push_button.setText(_translate("MainWindow", "打开BOM文件"))
        self.label_2.setText(_translate("MainWindow", "请在下表配置信息"))
        self.label_3.setText(_translate("MainWindow", "位置文件名称"))
        self.label_10.setText(_translate("MainWindow", "步骤3"))
        self.open_position_file_push_button.setText(_translate("MainWindow", "打开器件位置文件"))
        self.label_11.setText(_translate("MainWindow", "步骤4"))
        self.configuration_welded_station_push_button.setText(_translate("MainWindow", "配置位置文件"))
        self.label_8.setText(_translate("MainWindow", "贴片机吸盘文件名称"))
        self.label_12.setText(_translate("MainWindow", "步骤5"))
        self.open_configure_tip_mounter_file_push_button.setText(_translate("MainWindow", "打开贴片机吸盘文件"))
        self.label_13.setText(_translate("MainWindow", "步骤6"))
        self.configure_tip_mounter_station_push_button.setText(_translate("MainWindow", "配置贴片机吸盘文件"))
        self.label_14.setText(_translate("MainWindow", "步骤7 选配"))
        self.label_15.setText(_translate("MainWindow", "定位器件1 "))
        self.label_6.setText(_translate("MainWindow", "定位器件2 "))
        self.label_7.setText(_translate("MainWindow", "信息显示"))
        self.label_16.setText(_translate("MainWindow", "步骤8"))
        self.configuration_and_generate_file.setText(_translate("MainWindow", "生成文件"))
        self.label_9.setText(_translate("MainWindow", "步骤2"))
        self.config_tip_mounter_pushButton.setText(_translate("MainWindow", "配置料号"))

UI源码

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1253</width>
    <height>771</height>
   </rect>
  </property>
  <property name="maximumSize">
   <size>
    <width>1276</width>
    <height>771</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="layoutWidget">
    <property name="geometry">
     <rect>
      <x>30</x>
      <y>20</y>
      <width>921</width>
      <height>661</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QLabel" name="label_4">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="font">
        <font>
         <pointsize>20</pointsize>
         <weight>75</weight>
         <bold>true</bold>
        </font>
       </property>
       <property name="text">
        <string>步骤1</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <widget class="QLabel" name="label">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>BOM文件名称</string>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QLineEdit" name="show_bom_file_name">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string/>
         </property>
         <property name="readOnly">
          <bool>true</bool>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QPushButton" name="open_bom_file_push_button">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>打开BOM文件</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <widget class="QLabel" name="label_2">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string>请在下表配置信息</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QTableWidget" name="show_ic_bom_form"/>
     </item>
    </layout>
   </widget>
   <widget class="QWidget" name="layoutWidget">
    <property name="geometry">
     <rect>
      <x>960</x>
      <y>20</y>
      <width>271</width>
      <height>691</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout_2">
     <item>
      <widget class="QLabel" name="label_3">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string>位置文件名称</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QLineEdit" name="show_position_file_name">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string/>
       </property>
       <property name="readOnly">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_2">
       <item>
        <widget class="QLabel" name="label_10">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="font">
          <font>
           <pointsize>20</pointsize>
           <weight>75</weight>
           <bold>true</bold>
          </font>
         </property>
         <property name="text">
          <string>步骤3</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QPushButton" name="open_position_file_push_button">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>打开器件位置文件</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_3">
       <item>
        <widget class="QLabel" name="label_11">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="font">
          <font>
           <pointsize>20</pointsize>
           <weight>75</weight>
           <bold>true</bold>
          </font>
         </property>
         <property name="text">
          <string>步骤4</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QPushButton" name="configuration_welded_station_push_button">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>配置位置文件</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <widget class="QLabel" name="label_8">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string>贴片机吸盘文件名称</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QLineEdit" name="show_tip_mounter_file_name">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string/>
       </property>
       <property name="readOnly">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_4">
       <item>
        <widget class="QLabel" name="label_12">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="font">
          <font>
           <pointsize>20</pointsize>
           <weight>75</weight>
           <bold>true</bold>
          </font>
         </property>
         <property name="text">
          <string>步骤5</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QPushButton" name="open_configure_tip_mounter_file_push_button">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>打开贴片机吸盘文件</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_7">
       <item>
        <widget class="QLabel" name="label_13">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="font">
          <font>
           <pointsize>20</pointsize>
           <weight>75</weight>
           <bold>true</bold>
          </font>
         </property>
         <property name="text">
          <string>步骤6</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QPushButton" name="configure_tip_mounter_station_push_button">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>配置贴片机吸盘文件</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <widget class="QLabel" name="label_14">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="font">
        <font>
         <pointsize>20</pointsize>
         <weight>75</weight>
         <bold>true</bold>
        </font>
       </property>
       <property name="text">
        <string>步骤7 选配</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_5">
       <item>
        <widget class="QLabel" name="label_15">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>定位器件1 </string>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QLineEdit" name="positioning_ic_1">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string/>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
         <property name="readOnly">
          <bool>false</bool>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_6">
       <item>
        <widget class="QLabel" name="label_6">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>定位器件2 </string>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QLineEdit" name="positioning_ic_2">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string/>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
         <property name="readOnly">
          <bool>false</bool>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <widget class="QLabel" name="label_7">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string>信息显示</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QTextBrowser" name="show_all_mesage"/>
     </item>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_8">
       <item>
        <widget class="QLabel" name="label_16">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="font">
          <font>
           <pointsize>20</pointsize>
           <weight>75</weight>
           <bold>true</bold>
          </font>
         </property>
         <property name="text">
          <string>步骤8</string>
         </property>
         <property name="alignment">
          <set>Qt::AlignCenter</set>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QPushButton" name="configuration_and_generate_file">
         <property name="maximumSize">
          <size>
           <width>16777215</width>
           <height>16777215</height>
          </size>
         </property>
         <property name="text">
          <string>生成文件</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
    </layout>
   </widget>
   <widget class="QWidget" name="layoutWidget">
    <property name="geometry">
     <rect>
      <x>750</x>
      <y>680</y>
      <width>201</width>
      <height>41</height>
     </rect>
    </property>
    <layout class="QHBoxLayout" name="horizontalLayout_9">
     <item>
      <widget class="QLabel" name="label_9">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="font">
        <font>
         <pointsize>20</pointsize>
         <weight>75</weight>
         <bold>true</bold>
        </font>
       </property>
       <property name="text">
        <string>步骤2</string>
       </property>
       <property name="alignment">
        <set>Qt::AlignCenter</set>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="config_tip_mounter_pushButton">
       <property name="maximumSize">
        <size>
         <width>16777215</width>
         <height>16777215</height>
        </size>
       </property>
       <property name="text">
        <string>配置料号</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1253</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值