I appreciate your help. I changed it again, seems like the control definition is ok.
The last version is read "checkmaster_config.ini"(upload file need to change the suffix from .txt to .ini),selected different model dynamic updated columns name list and limit to each section, such P020&P025read out:
[P020]
item1=DUT_NM_Sens_Corr1000Hz_94SPL__Median,0.3,0.2,0.1
item2=DUT_NM_relativeSens8000Hz_RFR_Median,1,0.6,0.3
item3=DUT_NM_relativeSens10000Hz_RFR_Median,1,0.6,0.3
item4=DUT_NM_Noise_Median,102,102.5,103.2
item5=DUT_Phase1kHz_RPR_Median,1,0.8,0.5
item6=DUT_Phase3kHz_RPR_Median,1.5,1,0.5
item7=DUT_Phase10kHz_RPR_Median,4,3,1.5
[P025]
item1=Sensitivity 1000 Settled_Median,0.3,0.2,0.1
item2=DUT Phase 1kHz_Median,1,0.8,0.5
item3=Dut Sens 3kHz_Median,0.3,0.2,0.1
item4=Dut Phase 3kHz_Median,1.5,1,0.5
item5=DUT Sens 8kHz_Median,1,0.6,0.3
itme6=DUT Sens 10kHz_Median,1,0.6,0.3
item7=Dut Phase 10kHz_Median,4,3,1.5
itme8=DUT_NM_Noise_Median,Median,1,102,102.68,103
Please help to point out where have a chance to modify it,I feel this code is not concise.
The last version is read "checkmaster_config.ini"(upload file need to change the suffix from .txt to .ini),selected different model dynamic updated columns name list and limit to each section, such P020&P025read out:
[P020]
item1=DUT_NM_Sens_Corr1000Hz_94SPL__Median,0.3,0.2,0.1
item2=DUT_NM_relativeSens8000Hz_RFR_Median,1,0.6,0.3
item3=DUT_NM_relativeSens10000Hz_RFR_Median,1,0.6,0.3
item4=DUT_NM_Noise_Median,102,102.5,103.2
item5=DUT_Phase1kHz_RPR_Median,1,0.8,0.5
item6=DUT_Phase3kHz_RPR_Median,1.5,1,0.5
item7=DUT_Phase10kHz_RPR_Median,4,3,1.5
[P025]
item1=Sensitivity 1000 Settled_Median,0.3,0.2,0.1
item2=DUT Phase 1kHz_Median,1,0.8,0.5
item3=Dut Sens 3kHz_Median,0.3,0.2,0.1
item4=Dut Phase 3kHz_Median,1.5,1,0.5
item5=DUT Sens 8kHz_Median,1,0.6,0.3
itme6=DUT Sens 10kHz_Median,1,0.6,0.3
item7=Dut Phase 10kHz_Median,4,3,1.5
itme8=DUT_NM_Noise_Median,Median,1,102,102.68,103
Please help to point out where have a chance to modify it,I feel this code is not concise.
import PySimpleGUI as sg import pandas as pd import glob,os from datetime import datetime import numpy as np import re from decimal import Decimal from pathlib import Path import configparser sg.theme('Topanga') left_part = [ [sg.Text('', size=(45, 0),font=("Helvetica",10),text_color='red',justification='center',auto_size_text=True, key='Data1')], *[[sg.InputText(size=(12,1),font=("Helvetica",8),background_color='white',justification='center',text_color='black', pad=(2,2),key=f'partA{row}{col}') for col in range(7)] for row in range(5)], [sg.Text('', size=(45, 0), font=("Helvetica", 10), text_color='red', justification='center', auto_size_text=True, key='Data2')], *[[sg.InputText(size=(12,1),font=("Helvetica",8),background_color='white',justification='center',text_color='black', pad=(2,2),key=f'partB{row}{col}') for col in range(7)] for row in range(5)], ] right_part = [ [sg.Text('', size=(45, 0), font=("Helvetica", 10), text_color='red', justification='center',auto_size_text=True, key='Data3')], *[[sg.InputText(size=(12,1),font=("Helvetica",8),background_color='white',justification='center',text_color='black', pad=(2,2),key=f'partC{row}{col}') for col in range(7)] for row in range(5)], [sg.Text('', size=(40, 0), font=("Helvetica",10), text_color='red', justification='center',auto_size_text=True, visible = False,key='Data4')], *[[sg.InputText(size=(12,1),font=("Helvetica",8),background_color='white',justification='center',text_color='black', pad=(2,2),visible = False,key=f'partD{row}{col}') for col in range(7)] for row in range(5)], ] BNT = [ [sg.Text("Tester"), sg.Combo(values=['CAMEMSNIOSAI11', 'CAMEMSNIOSAI21', 'CAMEMSNIOSAI31', 'CAMEMSNIOSAI41', 'CAMEMSNIOSAI51', 'CAMEMSNIOSAI61', 'CAMEMSNIOSAI71', 'CAMEMSNIOSAI81', 'CAMEMSNIOSAI91', 'CAMEMSNIOSAI101'], default_value='CAMEMSNIOSAI11', key='-Tester-'), sg.Text("Project"), sg.Combo(values=['P020','P027','P025','P033'], default_value='P020', key='-Model-')], [sg.Radio('FR Check', group_id="RadioDemo", default=True, size=(10, 1), k='-R1-'), sg.Radio('Phase Check', group_id="RadioDemo", default=False, size=(15, 1), k='-R2-')], [sg.Text('TestLot:'), sg.Text('', size=(20, 0), font=("Helvetica", 10), text_color='red', justification="left", key='-testlot-'), sg.Text('Testdate:'), sg.Text('', size=(20, 0), font=("Helvetica", 10), text_color='red', justification="left", key='-testdate-')], [sg.OK('Check Master', key='OK'), sg.Exit(size=(5, 0))] ] layout = [ [BNT,sg.Column(left_part,vertical_alignment='top'),sg.VSeparator(),sg.Column(right_part,vertical_alignment='top')], ] window=sg.Window('Master Check',layout,font='Courier 12') working_directory = os.getcwd() IQR_path=r'C:\Users\Desktop\111' def read_csv(csv_add,tester,checkmodel,fullname,project): part1_data,paint1,part2_data,paint2,part3_data,paint3,part4_data,paint4,\ part5_data,paint5,part6_data,paint6,part7_data,paint7=([] for i in range(14)) SETTINGS_PATH = Path.cwd() # create the settings object and use ini format settings = sg.UserSettings(path=SETTINGS_PATH, filename="checkmaster_config.ini", use_config_file=True, convert_bools_and_none=True) sens_val=float(settings['Sens'][f'{fullname}']) file_path=os.path.join(SETTINGS_PATH,'checkmaster_config.ini') config = configparser.ConfigParser() # 类实例化 config.read(file_path) val = dict(config.items(project)) resources = {} for line in val.values(): key, value = line.rstrip().split(',', 1) resources[key] = value item_all=list(resources.keys()) limit_all = list(resources.values()) df=pd.read_csv(csv_add,header=2) df=df[df['Lot Code'].str.contains("golden")] df.columns = df.columns.str.split('.').str[0] lotnum=df['Lot Code'].tail(1).squeeze() testtime=df['Lot Finish Time'].tail(1).squeeze() try: part1_raw=df[item_all[0]].tail(1).squeeze() part2_raw=df[item_all[1]].tail(1).squeeze() part3_raw=df[item_all[2]].tail(1).squeeze() part4_raw=df[item_all[3]].tail(1).squeeze() part5_raw=df[item_all[4]].tail(1).squeeze() part6_raw=df[item_all[5]].tail(1).squeeze() part7_raw=df[item_all[6]].tail(1).squeeze() for part1 in part1_raw: if part1!=0: tt= part1-sens_val part1_data.append(Decimal(tt).quantize(Decimal("0.00"))) a, b, c =limit_all[0].split(',') a=float(a) b=float(b) c=float(c) paint1.append(compared_Sens(tt,a,b,c)) else: part1_data.insert(len(part1_data), np.nan) paint1.insert(len(paint1), 'white') part2_data,paint2=assign_data(part2_raw,limit_all[1]) part3_data,paint3=assign_data(part3_raw,limit_all[2]) for part4 in part4_raw: if part4!=0: a, b, c =limit_all[0].split(',') a=float(a) b=float(b) c=float(c) part4_data.append(Decimal(part4).quantize(Decimal("0.00"))) paint4.append(compared_Noise(part4,a,b,c)) else: part4_data.insert(len(part4_data), np.nan) paint4.insert(len(paint4), 'white') part5_data,paint5=assign_data(part5_raw,limit_all[4]) part6_data,paint6=assign_data(part6_raw,limit_all[5]) part7_data,paint7=assign_data(part7_raw,limit_all[6]) now = datetime.now() # current date and time date_time = now.strftime("%m/%d/%Y-%H:%M:%S") ab=pd.Series([tester,date_time]).to_frame().T aa=pd.DataFrame(part1_data).T bb=pd.DataFrame(part2_data).T cc=pd.DataFrame(part3_data).T dd=pd.DataFrame(part5_data).T ee=pd.DataFrame(part6_data).T ff=pd.DataFrame(part7_data).T gg=pd.DataFrame(part4_data).T if checkmodel=='Sens': result= np.concatenate([ab,aa,bb,cc],axis=1) result=pd.DataFrame(result) result.to_csv(r'sens_log.csv',mode='a',index=False,header=False) else: result1= np.concatenate([ab,dd,ee,ff,gg],axis=1) result1=pd.DataFrame(result1) result1.to_csv(r'phase_log.csv',mode='a',index=False,header=False) except Exception as e: print(e) return None return part1_data,paint1,part2_data,paint2,part3_data,paint3,part4_data,paint4,\ part5_data,paint5,part6_data,paint6,part7_data,paint7,lotnum,testtime def assign_data(raw_data,limit): arr,paintcolor=([] for i in range(2)) a, b, c = limit.split(',') a = float(a) b = float(b) c = float(c) for noise in raw_data: if noise != 0: arr.append(Decimal(noise).quantize(Decimal("0.00"))) paintcolor.append(compared_Sens(noise,a,b,c)) else: arr.insert(len(arr),np.nan) paintcolor.insert(len(paintcolor),'white') return arr,paintcolor def compared_Sens(val,limit1,limit2,limit3): # 0.3,0.2,0.1 if np.abs(val)>limit1: text_color='Dark Red' elif np.abs(val)>limit2: text_color='Red' elif np.abs(val)>limit3: text_color = 'orange' elif pd.isnull(val): text_color='White' else: text_color='Green' return text_color def compared_Noise(val,limit1,limit2,limit3): # 103.2,102.5,102 if np.abs(val)>limit1: text_color='green' elif np.abs(val)>limit2: text_color='orange' elif np.abs(val)>limit3: text_color = 'red' elif pd.isnull(val): text_color='White' else: text_color='dark red' return text_color while True: event, value = window.read() if event in (sg.WIN_CLOSED, 'Exit'): break elif event == "OK": for row in range(5): for col in range(7): window[f'partA{row}{col}'].update('',background_color='white') window[f'partB{row}{col}'].update('',background_color='white') window[f'partC{row}{col}'].update('',background_color='white') window[f'partD{row}{col}'].update('',background_color='white') window.Element(f'partD{row}{col}').Update(visible=False) window.Element('Data4').Update(visible=False) window['Data1'].update('') window['Data2'].update('') window['Data3'].update('') window['Data4'].update('') window['-testlot-'].update('') window['-testdate-'].update('') Tester=value['-Tester-'] project=value['-Model-'] fullname=Tester+'_'+project IQR_files=os.path.join(IQR_path,project,'ENG\IQR\*_Statistic.csv') IQR_all=glob.glob(IQR_files) IQR_all.sort(key=lambda file_name:os.path.getmtime(file_name),reverse=True) if len(IQR_all)!=0: for file_IQR in IQR_all: FP = re.findall(Tester, file_IQR) FP = "".join(FP) if len(FP)!=0: if FP == Tester: # sample_path = file_IQR if value['-R1-'] == True: check_item = 'Sens' x=read_csv(file_IQR,Tester,check_item,fullname,project) if x is None: sg.popup("No GoldenSample data in file,Please re-selected it!!") break else: window['Data1'].update('DUT_NM_Sens_Corr1000Hz_94SPL__Median') window['Data2'].update('DUT_NM_relativeSens8000Hz_RFR_Median') window['Data3'].update('DUT_NM_relativeSens10000Hz_RFR_Median') Sens1k,paint0,Sens8k,paint1,Sens10k,paint2,Noise,paint3,Phase1k,paint4,Phase3k,\ paint5,Phase10k,paint6,lotnum,testtime=read_csv(file_IQR,Tester,check_item,fullname,project) window['-testlot-'].update(lotnum) window['-testdate-'].update(testtime) j=-1 for row in range(5): for col in range(7): j=j+1 window[f'partA{row}{col}'].update(f'Site{j+1}:{Sens1k[j]}',background_color=paint0[j]) window[f'partB{row}{col}'].update(f'Site{j+1}:{Sens8k[j]}',background_color=paint1[j]) window[f'partC{row}{col}'].update(f'Site{j+1}:{Sens10k[j]}',background_color=paint2[j]) break else: check_item = 'Phase' x = read_csv(file_IQR, Tester, check_item,fullname,project) if x is None: sg.popup("No GoldenSample data in file,Please re-selected it!!") break else: window.Element('Data4').Update(visible=True) window['Data1'].update('DUT_Phase1kHz_RPR_Median') window['Data2'].update('DUT_Phase3kHz_RPR_Median') window['Data3'].update('DUT_Phase10kHz_RPR_Median') window['Data4'].update('DUT_NM_Noise_Median') Sens1k, paint0, Sens8k, paint1, Sens10k, paint2, Noise, paint3, Phase1k, paint4, Phase3k, \ paint5, Phase10k, paint6, lotnum, testtime = read_csv(file_IQR, Tester, check_item,fullname,project) window['-testlot-'].update(lotnum) window['-testdate-'].update(testtime) j = -1 for row in range(5): for col in range(7): j = j + 1 window.Element(f'partD{row}{col}').Update(visible=True) window[f'partA{row}{col}'].update(f'Site{j + 1}:{Phase1k[j]}', background_color=paint4[j]) window[f'partB{row}{col}'].update(f'Site{j + 1}:{Phase3k[j]}', background_color=paint5[j]) window[f'partC{row}{col}'].update(f'Site{j + 1}:{Phase10k[j]}', background_color=paint6[j]) window[f'partD{row}{col}'].update(f'Site{j + 1}:{Noise[j]}', background_color=paint3[j]) break else: sg.popup("Tester or Project selected wrong,Please selected properly!!") # break else: sg.popup("No Data!") window.close()
Attached Files
Thumbnail(s)
CAMEMSNIOSAI61_Statistic.csv (Size: 225.32 KB / Downloads: 67)
checkmaster_config.txt (Size: 1.14 KB / Downloads: 74)