11"""
2- Universal tabular import with a small 'Import Wizard' UI + nickname selector.
2+ Universal tabular import with a small 'Import Wizard' UI + dataset name selector.
33
44Changes in this version:
55- Keeps CSV/TSV/TXT/Excel support and the scrollable preview with column radio-select.
6- - Adds a "Nickname " section under the table with three radio options:
6+ - Adds a "Dataset Name " section under the table with three radio options:
77 1) File name (stem)
88 2) Selected column header (enabled only if "File has headers" is checked)
99 3) Other (free text entry)
10- - On Import, returns (values_from_selected_column, selected_nickname ).
10+ - On Import, returns (values_from_selected_column, selected_dataset_name ).
1111
1212Public API:
1313 import_csv(parent: Optional[tk.Misc]=None, title="Import Data") -> Optional[tuple[list[str], str]]
@@ -198,11 +198,11 @@ def import_data(
198198) -> Optional [tuple [list [str ], str ]]:
199199 """
200200 Open an "Import Wizard" dialog: select a file, preview it, choose 'has headers',
201- pick exactly one column via radio buttons, choose a nickname , and return that
202- column's values and the chosen nickname .
201+ pick exactly one column via radio buttons, choose a dataset name , and return that
202+ column's values and the chosen dataset name .
203203
204204 Returns:
205- (values_from_selected_column, selected_nickname ) or None if cancelled.
205+ (values_from_selected_column, selected_dataset_name ) or None if cancelled.
206206 """
207207
208208 # ---------------- Setup window ----------------
@@ -272,28 +272,28 @@ def browse_file():
272272 tree .configure (yscrollcommand = vscroll .set , xscrollcommand = hscroll .set )
273273 hscroll .configure (command = tree .xview )
274274
275- # ---------------- Nickname controls ----------------
275+ # ---------------- Dataset Name controls ----------------
276276 # Options: 0 = filename, 1 = selected column header, 2 = other (entry)
277- nickname_mode = tk .IntVar (master = dlg , value = 0 )
278- nickname_other = tk .StringVar (master = dlg , value = "" )
279- nickname_preview = tk .StringVar (master = dlg , value = "" )
277+ dataset_name_mode = tk .IntVar (master = dlg , value = 0 )
278+ dataset_name_other = tk .StringVar (master = dlg , value = "" )
279+ dataset_name_preview = tk .StringVar (master = dlg , value = "" )
280280
281- nick_frame = ttk .LabelFrame (dlg , text = "Nickname " )
281+ nick_frame = ttk .LabelFrame (dlg , text = "Dataset Name " )
282282 nick_frame .grid (row = 8 , column = 0 , columnspan = 3 , sticky = "we" , padx = 10 , pady = (0 , 10 ))
283283 for col in range (3 ):
284284 nick_frame .columnconfigure (col , weight = 1 )
285285
286- r_file = ttk .Radiobutton (nick_frame , text = "Use file name" , value = 0 , variable = nickname_mode )
287- r_colh = ttk .Radiobutton (nick_frame , text = "Use selected column header" , value = 1 , variable = nickname_mode )
288- r_other = ttk .Radiobutton (nick_frame , text = "Other:" , value = 2 , variable = nickname_mode )
286+ r_file = ttk .Radiobutton (nick_frame , text = "Use file name" , value = 0 , variable = dataset_name_mode )
287+ r_colh = ttk .Radiobutton (nick_frame , text = "Use selected column header" , value = 1 , variable = dataset_name_mode )
288+ r_other = ttk .Radiobutton (nick_frame , text = "Other:" , value = 2 , variable = dataset_name_mode )
289289 r_file .grid (row = 0 , column = 0 , sticky = "w" , padx = 8 , pady = 6 )
290290 r_colh .grid (row = 0 , column = 1 , sticky = "w" , padx = 8 , pady = 6 )
291291 r_other .grid (row = 0 , column = 2 , sticky = "w" , padx = 8 , pady = 6 )
292292
293- other_entry = ttk .Entry (nick_frame , textvariable = nickname_other , width = 30 , state = "disabled" )
293+ other_entry = ttk .Entry (nick_frame , textvariable = dataset_name_other , width = 30 , state = "disabled" )
294294 other_entry .grid (row = 1 , column = 2 , sticky = "w" , padx = 30 , pady = (0 , 8 ))
295295
296- ttk .Label (nick_frame , textvariable = nickname_preview , foreground = "#555" ).grid (
296+ ttk .Label (nick_frame , textvariable = dataset_name_preview , foreground = "#555" ).grid (
297297 row = 1 , column = 0 , columnspan = 2 , sticky = "w" , padx = 8 , pady = (0 , 8 )
298298 )
299299
@@ -326,7 +326,7 @@ def _fill_preview_rows(rows: list[list[str]]):
326326 def _initial_blank_preview ():
327327 _set_preview_columns ([f"Column { i + 1 } " for i in range (5 )])
328328 _fill_preview_rows ([["" ] * 5 for _ in range (5 )])
329- _update_nickname_preview ()
329+ _update_dataset_name_preview ()
330330
331331 def _current_header_labels () -> list [str ]:
332332 # Return the labels currently shown atop the preview
@@ -339,27 +339,27 @@ def _selected_header_label() -> str:
339339 return str (labels [idx ])
340340 return ""
341341
342- def _update_nickname_controls_enabled ():
342+ def _update_dataset_name_controls_enabled ():
343343 # Enable/disable "selected column header" radio based on has_headers + data present
344344 has_data = bool (_loaded_rows )
345345 enable_col_header = has_headers .get () and has_data and len (tree ["columns" ]) > 0
346346 state = "normal" if enable_col_header else "disabled"
347347 r_colh .configure (state = state )
348- if state == "disabled" and nickname_mode .get () == 1 :
349- nickname_mode .set (0 ) # fall back to filename
348+ if state == "disabled" and dataset_name_mode .get () == 1 :
349+ dataset_name_mode .set (0 ) # fall back to filename
350350 # Enable/disable custom entry
351- other_state = "normal" if nickname_mode .get () == 2 else "disabled"
351+ other_state = "normal" if dataset_name_mode .get () == 2 else "disabled"
352352 other_entry .configure (state = other_state )
353353
354- def _update_nickname_preview (* _args ):
355- choice = nickname_mode .get ()
354+ def _update_dataset_name_preview (* _args ):
355+ choice = dataset_name_mode .get ()
356356 if choice == 0 :
357- nickname_preview .set (f"Nickname → { (_filename_stem or '—' )} " )
357+ dataset_name_preview .set (f"Dataset Name → { (_filename_stem or '—' )} " )
358358 elif choice == 1 :
359- nickname_preview .set (f"Nickname → { (_selected_header_label () or '—' )} " )
359+ dataset_name_preview .set (f"Dataset Name → { (_selected_header_label () or '—' )} " )
360360 else :
361- nickname_preview .set (f"Nickname → { (nickname_other .get ().strip () or '—' )} " )
362- _update_nickname_controls_enabled ()
361+ dataset_name_preview .set (f"Dataset Name → { (dataset_name_other .get ().strip () or '—' )} " )
362+ _update_dataset_name_controls_enabled ()
363363
364364 def _selected_header_label () -> str :
365365 return _selected_header_label_cached ()
@@ -407,8 +407,8 @@ def _sel_hdr():
407407 return ""
408408 _selected_header_label_cached = _sel_hdr
409409
410- # Reset nickname preview (filename by default)
411- _update_nickname_preview ()
410+ # Reset dataset_name preview (filename by default)
411+ _update_dataset_name_preview ()
412412
413413 # Clamp selected column
414414 if selected_col .get () >= len (header ):
@@ -418,19 +418,19 @@ def _sel_hdr():
418418 _selected_header_label_cached = lambda : ""
419419
420420 # Reactivity hooks
421- selected_col .trace_add ("write" , _update_nickname_preview )
421+ selected_col .trace_add ("write" , _update_dataset_name_preview )
422422 has_headers .trace_add ("write" , lambda * _ : (_refresh_preview (),))
423- nickname_mode .trace_add ("write" , _update_nickname_preview )
424- nickname_other .trace_add ("write" , _update_nickname_preview )
423+ dataset_name_mode .trace_add ("write" , _update_dataset_name_preview )
424+ dataset_name_other .trace_add ("write" , _update_dataset_name_preview )
425425
426426 _initial_blank_preview () # start 5x5
427427
428428 # -------------- Import handler --------------
429429 result_values : Optional [list [str ]] = None
430- result_nickname : Optional [str ] = None
430+ result_dataset_name : Optional [str ] = None
431431
432432 def _do_import ():
433- nonlocal result_values , result_nickname
433+ nonlocal result_values , result_dataset_name
434434 path = file_var .get ().strip ()
435435 if not path :
436436 messagebox .showerror ("Error" , "No file selected." , parent = dlg )
@@ -455,26 +455,26 @@ def _do_import():
455455 val = r [col_idx ] if col_idx < len (r ) else ""
456456 out .append ("" if val is None else str (val ))
457457
458- # Resolve nickname
459- mode = nickname_mode .get ()
458+ # Resolve dataset_name
459+ mode = dataset_name_mode .get ()
460460 if mode == 0 :
461- nickname = _filename_stem or "data"
461+ dataset_name = _filename_stem or "data"
462462 elif mode == 1 :
463463 if not has_headers .get ():
464- messagebox .showerror ("Nickname error" , "Column header option requires headers to be enabled." , parent = dlg )
464+ messagebox .showerror ("Dataset Name error" , "Column header option requires headers to be enabled." , parent = dlg )
465465 return
466- nickname = _selected_header_label ()
467- if not nickname .strip ():
468- messagebox .showerror ("Nickname error" , "Selected column has an empty header." , parent = dlg )
466+ dataset_name = _selected_header_label ()
467+ if not dataset_name .strip ():
468+ messagebox .showerror ("Dataset Name error" , "Selected column has an empty header." , parent = dlg )
469469 return
470470 else :
471- nickname = nickname_other .get ().strip ()
472- if not nickname :
473- messagebox .showerror ("Nickname error" , "Please type a nickname in the 'Other' field." , parent = dlg )
471+ dataset_name = dataset_name_other .get ().strip ()
472+ if not dataset_name :
473+ messagebox .showerror ("Dataset Name error" , "Please type a dataset_name in the 'Other' field." , parent = dlg )
474474 return
475475
476476 result_values = out
477- result_nickname = nickname
477+ result_dataset_name = dataset_name
478478 dlg .destroy ()
479479
480480 process_btn .configure (command = _do_import )
@@ -493,6 +493,6 @@ def _do_import():
493493 owner .wait_window (dlg )
494494 _safe_destroy (created_root )
495495
496- if result_values is None or result_nickname is None :
496+ if result_values is None or result_dataset_name is None :
497497 return None
498- return result_values , result_nickname
498+ return result_values , result_dataset_name
0 commit comments