@@ -85,18 +85,16 @@ class PICALauncherApp:
8585 MANUAL_FILE = resource_path ("_assets/Manuals" )
8686 README_FILE = resource_path ("README.md" )
8787 LICENSE_FILE = resource_path ("LICENSE" )
88+ UPDATES_FILE = resource_path ("Updates.md" )
8889 LOGO_SIZE = 140
8990
9091 SCRIPT_PATHS = {
9192 # Based on Updates.md, using the latest versions of scripts.
92- "Delta Mode I-V Sweep" : resource_path ("Delta_mode_Keithley_6221_2182A/Delta_Mode_IV_Ambient.py" ), # Latest as of Oct 3
9393 "Delta Mode I-V Sweep" : resource_path ("Delta_mode_Keithley_6221_2182A/K6221_DC_Sweep_V7.py" ), # Corrected from Delta_Mode_IV_Ambient.py
9494 "Delta Mode R-T (Active)" : resource_path ("Delta_mode_Keithley_6221_2182A/Delta_Mode_Active_Temp_Control_V2.py" ),
9595 "Delta Mode R-T (Passive)" : resource_path ("Delta_mode_Keithley_6221_2182A/Delta_Lakeshore_Frontend_Passive_V1.py" ),
9696 "K2400 I-V" : resource_path ("Keithley_2400/Frontend_IV_2400_V3.py" ),
9797 "K2400 R-T" : resource_path ("Keithley_2400/Frontend_Keithley_2400_Lakeshore_350_V_vs_T_V1.py" ),
98- "K2400_2182 I-V" : resource_path ("Keithley_2400_Keithley_2182/IV_Sweep_Keithley_2182.py" ),
99- "K2400_2182 R-T" : resource_path ("Keithley_2400_Keithley_2182/VT_Curve_IV_Sweep_Keithley_2400_2182_Lakeshore_350.py" ),
10098 "K2400_2182 I-V" : resource_path ("Keithley_2400_Keithley_2182/IV_Sweep_Keithley_2182_V1.py" ), # Corrected from IV_Sweep_Keithley_2182.py
10199 "K2400_2182 R-T" : resource_path ("Keithley_2400_Keithley_2182/VT_Curve_IV_Sweep_Keithley_2400_2182_Lakeshore_350_V1.py" ), # Corrected from VT_Curve_IV_Sweep_Keithley_2400_2182_Lakeshore_350.py
102100 "K6517B I-V" : resource_path ("Keithley_6517B/High_Resistance/Keithley_6517B_IV_Frontend_V9.py" ),
@@ -106,7 +104,6 @@ class PICALauncherApp:
106104 "Lakeshore Temp Control" : resource_path ("Lakeshore_350_340/lakeshore350_temp_ramp_Frontend_V4.py" ),
107105 "Lakeshore Temp Monitor" : resource_path ("Lakeshore_350_340/lakeshore350_passive_monitor_Frontend_V1.py" ),
108106 "LCR C-V Measurement" : resource_path ("LCR_Keysight_E4980A/LCR_CV.py" ),
109- "Lock-in AC Measurement" : resource_path ("Lock_in_amplifier/AC_Transport_GUI.py" ),
110107 "Lock-in AC Measurement" : resource_path ("Lock_in_amplifier/AC_Transport_GUI_V1.py" ), # Corrected from AC_Transport_GUI.py
111108 }
112109
@@ -176,6 +173,7 @@ def create_resource_panel(self, parent):
176173 util_frame = ttk .Frame (info_frame )
177174 util_frame .pack (fill = 'x' , expand = False , pady = 10 )
178175 ttk .Button (util_frame , text = "Open README" , style = 'App.TButton' , command = self .open_readme ).pack (fill = 'x' , pady = 4 )
176+ ttk .Button (util_frame , text = "View Updates" , style = 'App.TButton' , command = self .open_updates ).pack (fill = 'x' , pady = 4 )
179177 ttk .Button (util_frame , text = "Open Instrument Manuals" , style = 'App.TButton' , command = self .open_manual_folder ).pack (fill = 'x' , pady = 4 )
180178 ttk .Button (util_frame , text = "Test GPIB Connection" , style = 'App.TButton' , command = self .run_gpib_test ).pack (fill = 'x' , pady = 4 )
181179
@@ -226,33 +224,39 @@ def create_launcher_panel(self, parent):
226224 low_res_frame .columnconfigure (0 , weight = 1 )
227225 self ._create_launch_button (low_res_frame , "I-V Sweep" , "Delta Mode I-V Sweep" ).grid (row = 0 , column = 0 , sticky = 'ew' , pady = (0 , 2 ), padx = (0 , 4 ))
228226 self ._create_launch_button (low_res_frame , "R vs. T (Active)" , "Delta Mode R-T (Active)" ).grid (row = 1 , column = 0 , sticky = 'ew' , pady = (2 , 2 ), padx = (0 , 4 ))
229- self ._create_launch_button (low_res_frame , "R vs. T (Passive)" , "Delta Mode R-T (Passive)" ).grid (row = 2 , column = 0 , sticky = 'ew' , pady = (2 , 0 ), padx = (0 , 4 ))
230- ttk .Button (low_res_frame , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("Delta Mode I-V Sweep" )).grid (row = 0 , column = 1 , rowspan = 3 , sticky = 'ns' )
231-
232- mid_res_frame1 = ttk .LabelFrame (left_col , text = 'Mid Resistance (Keithley 2400)' ); mid_res_frame1 .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
233- mid_res_frame1 .columnconfigure (0 , weight = 1 )
234- self ._create_launch_button (mid_res_frame1 , "I-V Measurement" , "K2400 I-V" ).grid (row = 0 , column = 0 , sticky = 'ew' , pady = (0 , 2 ), padx = (0 , 4 ))
235- self ._create_launch_button (mid_res_frame1 , "R vs. T Measurement" , "K2400 R-T" ).grid (row = 1 , column = 0 , sticky = 'ew' , pady = (2 , 0 ), padx = (0 , 4 ))
236- ttk .Button (mid_res_frame1 , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("Keithley_2400" )).grid (row = 0 , column = 1 , rowspan = 2 , sticky = 'ns' )
237-
238- mid_res_frame2 = ttk .LabelFrame (left_col , text = 'Mid Resistance (Keithley 2400 / 2182)' ); mid_res_frame2 .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
239- mid_res_frame2 .columnconfigure (0 , weight = 1 )
240- self ._create_launch_button (mid_res_frame2 , "I-V Measurement" , "K2400_2182 I-V" ).grid (row = 0 , column = 0 , sticky = 'ew' , pady = (0 , 2 ), padx = (0 , 4 ))
241- self ._create_launch_button (mid_res_frame2 , "R vs. T Measurement" , "K2400_2182 R-T" ).grid (row = 1 , column = 0 , sticky = 'ew' , pady = (2 , 0 ), padx = (0 , 4 ))
242- ttk .Button (mid_res_frame2 , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("K2400_2182 I-V" )).grid (row = 0 , column = 1 , rowspan = 2 , sticky = 'ns' )
227+ self ._create_launch_button (low_res_frame , "R vs. T (Passive)" , "Delta Mode R-T (Passive)" ).grid (row = 2 , column = 0 , sticky = 'ew' , pady = (2 , 0 ), padx = (0 , 4 )); ttk .Button (low_res_frame , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("Delta Mode I-V Sweep" )).grid (row = 0 , column = 1 , rowspan = 3 , sticky = 'ns' )
243228
244229 high_res_frame = ttk .LabelFrame (right_col , text = 'High Resistance (Keithley 6517B)' ); high_res_frame .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
230+ high_res_frame = ttk .LabelFrame (left_col , text = 'High Resistance (Keithley 6517B)' ); high_res_frame .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
245231 high_res_frame .columnconfigure (0 , weight = 1 )
246232 self ._create_launch_button (high_res_frame , "I-V Measurement" , "K6517B I-V" ).grid (row = 0 , column = 0 , sticky = 'ew' , padx = (0 , 4 ), pady = (0 ,2 ))
247233 self ._create_launch_button (high_res_frame , "R vs. T (Active)" , "K6517B R-T (Active)" ).grid (row = 1 , column = 0 , sticky = 'ew' , padx = (0 , 4 ), pady = (2 ,2 ))
248- self ._create_launch_button (high_res_frame , "R vs. T (Passive)" , "K6517B R-T (Passive)" ).grid (row = 2 , column = 0 , sticky = 'ew' , padx = (0 , 4 ), pady = (2 ,0 ))
249- ttk .Button (high_res_frame , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("K6517B I-V" )).grid (row = 0 , column = 1 , rowspan = 3 , sticky = 'ns' )
234+ self ._create_launch_button (high_res_frame , "R vs. T (Passive)" , "K6517B R-T (Passive)" ).grid (row = 2 , column = 0 , sticky = 'ew' , padx = (0 , 4 ), pady = (2 ,0 )); ttk .Button (high_res_frame , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("K6517B I-V" )).grid (row = 0 , column = 1 , rowspan = 3 , sticky = 'ns' )
250235
251236 pyro_frame = ttk .LabelFrame (right_col , text = 'Pyroelectric Measurement (Keithley 6517B)' ); pyro_frame .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
237+ pyro_frame = ttk .LabelFrame (left_col , text = 'Pyroelectric Measurement (Keithley 6517B)' ); pyro_frame .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
252238 pyro_frame .columnconfigure (0 , weight = 1 )
253239 self ._create_launch_button (pyro_frame , "Pyro Current vs. Temp" , "Pyroelectric Current" ).grid (row = 0 , column = 0 , sticky = 'ew' , padx = (0 , 4 ))
254240 ttk .Button (pyro_frame , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("Pyroelectric Current" )).grid (row = 0 , column = 1 , sticky = 'ns' )
255241
242+ mid_res_frame1 = ttk .LabelFrame (left_col , text = 'Mid Resistance (Keithley 2400)' ); mid_res_frame1 .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
243+ low_res_frame = ttk .LabelFrame (right_col , text = 'Low Resistance (Delta Mode: Keithley 6221/2182A)' ); low_res_frame .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
244+ low_res_frame .columnconfigure (0 , weight = 1 )
245+ self ._create_launch_button (low_res_frame , "I-V Sweep" , "Delta Mode I-V Sweep" ).grid (row = 0 , column = 0 , sticky = 'ew' , pady = (0 , 2 ), padx = (0 , 4 ))
246+ self ._create_launch_button (low_res_frame , "R vs. T (Active)" , "Delta Mode R-T (Active)" ).grid (row = 1 , column = 0 , sticky = 'ew' , pady = (2 , 2 ), padx = (0 , 4 ))
247+ self ._create_launch_button (low_res_frame , "R vs. T (Passive)" , "Delta Mode R-T (Passive)" ).grid (row = 2 , column = 0 , sticky = 'ew' , pady = (2 , 0 ), padx = (0 , 4 )); ttk .Button (low_res_frame , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("Delta Mode I-V Sweep" )).grid (row = 0 , column = 1 , rowspan = 3 , sticky = 'ns' )
248+
249+ mid_res_frame1 = ttk .LabelFrame (right_col , text = 'Mid Resistance (Keithley 2400)' ); mid_res_frame1 .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
250+ mid_res_frame1 .columnconfigure (0 , weight = 1 )
251+ self ._create_launch_button (mid_res_frame1 , "I-V Measurement" , "K2400 I-V" ).grid (row = 0 , column = 0 , sticky = 'ew' , pady = (0 , 2 ), padx = (0 , 4 ))
252+ self ._create_launch_button (mid_res_frame1 , "R vs. T Measurement" , "K2400 R-T" ).grid (row = 1 , column = 0 , sticky = 'ew' , pady = (2 , 0 ), padx = (0 , 4 )); ttk .Button (mid_res_frame1 , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("Keithley_2400" )).grid (row = 0 , column = 1 , rowspan = 2 , sticky = 'ns' )
253+
254+ mid_res_frame2 = ttk .LabelFrame (left_col , text = 'Mid Resistance (Keithley 2400 / 2182)' ); mid_res_frame2 .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
255+ mid_res_frame2 = ttk .LabelFrame (right_col , text = 'Mid Resistance (Keithley 2400 / 2182)' ); mid_res_frame2 .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
256+ mid_res_frame2 .columnconfigure (0 , weight = 1 )
257+ self ._create_launch_button (mid_res_frame2 , "I-V Measurement" , "K2400_2182 I-V" ).grid (row = 0 , column = 0 , sticky = 'ew' , pady = (0 , 2 ), padx = (0 , 4 ))
258+ self ._create_launch_button (mid_res_frame2 , "R vs. T Measurement" , "K2400_2182 R-T" ).grid (row = 1 , column = 0 , sticky = 'ew' , pady = (2 , 0 ), padx = (0 , 4 )); ttk .Button (mid_res_frame2 , text = "📁" , style = 'Icon.TButton' , command = lambda : self .open_script_folder ("K2400_2182 I-V" )).grid (row = 0 , column = 1 , rowspan = 2 , sticky = 'ns' )
259+
256260 lakeshore_frame = ttk .LabelFrame (right_col , text = 'Temperature Control (Lakeshore 350)' ); lakeshore_frame .pack (fill = 'x' , expand = True , pady = GROUP_PAD_Y )
257261 lakeshore_frame .columnconfigure (0 , weight = 1 )
258262 self ._create_launch_button (lakeshore_frame , "Temperature Ramp" , "Lakeshore Temp Control" ).grid (row = 0 , column = 0 , sticky = 'ew' , padx = (0 , 4 ), pady = (0 , 2 ))
@@ -393,6 +397,9 @@ def open_script_folder(self, script_key):
393397 def open_readme (self ):
394398 self ._show_file_in_window (self .README_FILE , "README" )
395399
400+ def open_updates (self ):
401+ self ._show_file_in_window (self .UPDATES_FILE , "Update Log" )
402+
396403 def open_manual_folder (self ):
397404 self ._open_path (self .MANUAL_FILE )
398405
0 commit comments