tksheet 7.1.20__py3-none-any.whl → 7.1.22__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
tksheet/sheet.py CHANGED
@@ -21,6 +21,8 @@ from .functions import (
21
21
  dropdown_search_function,
22
22
  event_dict,
23
23
  fix_format_kwargs,
24
+ new_tk_event,
25
+ force_bool,
24
26
  get_checkbox_dict,
25
27
  get_checkbox_kwargs,
26
28
  get_dropdown_dict,
@@ -171,7 +173,7 @@ class Sheet(tk.Frame):
171
173
  display_selected_fg_over_highlights: bool = False,
172
174
  show_selected_cells_border: bool = True,
173
175
  treeview: bool = False,
174
- treeview_indent: str | int = "3",
176
+ treeview_indent: str | int = "6",
175
177
  rounded_boxes: bool = True,
176
178
  alternate_color: str = "",
177
179
  # colors
@@ -524,8 +526,7 @@ class Sheet(tk.Frame):
524
526
  elif is_iterable(value) and is_iterable(c):
525
527
  for c_, v in zip(c, value):
526
528
  self.CH.set_cell_data(c_, v)
527
- self.set_refresh_timer(redraw)
528
- return self
529
+ return self.set_refresh_timer(redraw)
529
530
 
530
531
  def headers(
531
532
  self,
@@ -561,8 +562,7 @@ class Sheet(tk.Frame):
561
562
  elif is_iterable(value) and is_iterable(r):
562
563
  for r_, v in zip(r, value):
563
564
  self.RI.set_cell_data(r_, v)
564
- self.set_refresh_timer(redraw)
565
- return self
565
+ return self.set_refresh_timer(redraw)
566
566
 
567
567
  def row_index(
568
568
  self,
@@ -583,7 +583,7 @@ class Sheet(tk.Frame):
583
583
 
584
584
  # Bindings and Functionality
585
585
 
586
- def enable_bindings(self, *bindings) -> Sheet:
586
+ def enable_bindings(self, *bindings: str) -> Sheet:
587
587
  self.MT.enable_bindings(bindings)
588
588
  return self
589
589
 
@@ -921,12 +921,7 @@ class Sheet(tk.Frame):
921
921
  func: Callable,
922
922
  add: str | None = None,
923
923
  ) -> Sheet:
924
- if binding in emitted_events:
925
- if add:
926
- self.bound_events[binding].append(func)
927
- else:
928
- self.bound_events[binding] = [func]
929
- elif binding == "<ButtonPress-1>":
924
+ if binding == "<ButtonPress-1>":
930
925
  self.MT.extra_b1_press_func = func
931
926
  self.CH.extra_b1_press_func = func
932
927
  self.RI.extra_b1_press_func = func
@@ -956,6 +951,11 @@ class Sheet(tk.Frame):
956
951
  self.CH.extra_rc_func = func
957
952
  self.RI.extra_rc_func = func
958
953
  self.TL.extra_rc_func = func
954
+ elif binding in emitted_events:
955
+ if add:
956
+ self.bound_events[binding].append(func)
957
+ else:
958
+ self.bound_events[binding] = [func]
959
959
  else:
960
960
  self.MT.bind(binding, func, add=add)
961
961
  self.CH.bind(binding, func, add=add)
@@ -1463,10 +1463,13 @@ class Sheet(tk.Frame):
1463
1463
  redraw: bool = True,
1464
1464
  ) -> Sheet:
1465
1465
  if table:
1466
+ self.MT.hide_text_editor_and_dropdown(redraw=False)
1466
1467
  self.MT.data = []
1467
1468
  if header:
1469
+ self.CH.hide_text_editor_and_dropdown(redraw=False)
1468
1470
  self.MT._headers = []
1469
1471
  if index:
1472
+ self.RI.hide_text_editor_and_dropdown(redraw=False)
1470
1473
  self.MT._row_index = []
1471
1474
  if row_heights:
1472
1475
  self.MT.saved_row_heights = {}
@@ -1486,8 +1489,9 @@ class Sheet(tk.Frame):
1486
1489
  self.ops = new_sheet_options()
1487
1490
  if tree:
1488
1491
  self.RI.tree_reset()
1489
- self.set_refresh_timer(redraw)
1490
- return self
1492
+ if tree or row_heights or column_widths:
1493
+ self.MT.hide_dropdown_editor_all_canvases()
1494
+ return self.set_refresh_timer(redraw)
1491
1495
 
1492
1496
  def set_sheet_data(
1493
1497
  self,
@@ -1590,6 +1594,7 @@ class Sheet(tk.Frame):
1590
1594
  event_data = event_dict(
1591
1595
  name="edit_table",
1592
1596
  sheet=self.name,
1597
+ widget=self,
1593
1598
  selected=self.MT.selected,
1594
1599
  )
1595
1600
  set_t = self.event_data_set_table_cell
@@ -1820,6 +1825,7 @@ class Sheet(tk.Frame):
1820
1825
  event_data = event_dict(
1821
1826
  name="edit_table",
1822
1827
  sheet=self.name,
1828
+ widget=self,
1823
1829
  selected=self.MT.selected,
1824
1830
  )
1825
1831
  if index:
@@ -2152,6 +2158,7 @@ class Sheet(tk.Frame):
2152
2158
  event_data = event_dict(
2153
2159
  name="delete_rows",
2154
2160
  sheet=self.name,
2161
+ widget=self,
2155
2162
  boxes=self.MT.get_boxes(),
2156
2163
  selected=self.MT.selected,
2157
2164
  )
@@ -2193,6 +2200,7 @@ class Sheet(tk.Frame):
2193
2200
  event_data = event_dict(
2194
2201
  name="delete_columns",
2195
2202
  sheet=self.name,
2203
+ widget=self,
2196
2204
  boxes=self.MT.get_boxes(),
2197
2205
  selected=self.MT.selected,
2198
2206
  )
@@ -2301,6 +2309,7 @@ class Sheet(tk.Frame):
2301
2309
  create_selections: bool = True,
2302
2310
  undo: bool = False,
2303
2311
  emit_event: bool = False,
2312
+ move_heights: bool = True,
2304
2313
  redraw: bool = True,
2305
2314
  ) -> tuple[dict, dict, dict]:
2306
2315
  data_idxs, disp_idxs, event_data = self.MT.move_rows_adjust_options_dict(
@@ -2310,6 +2319,7 @@ class Sheet(tk.Frame):
2310
2319
  data_indexes=data_indexes,
2311
2320
  ),
2312
2321
  move_data=move_data,
2322
+ move_heights=move_heights,
2313
2323
  create_selections=create_selections,
2314
2324
  data_indexes=data_indexes,
2315
2325
  )
@@ -2329,6 +2339,7 @@ class Sheet(tk.Frame):
2329
2339
  create_selections: bool = True,
2330
2340
  undo: bool = False,
2331
2341
  emit_event: bool = False,
2342
+ move_widths: bool = True,
2332
2343
  redraw: bool = True,
2333
2344
  ) -> tuple[dict, dict, dict]:
2334
2345
  data_idxs, disp_idxs, event_data = self.MT.move_columns_adjust_options_dict(
@@ -2338,6 +2349,7 @@ class Sheet(tk.Frame):
2338
2349
  data_indexes=data_indexes,
2339
2350
  ),
2340
2351
  move_data=move_data,
2352
+ move_widths=move_widths,
2341
2353
  create_selections=create_selections,
2342
2354
  data_indexes=data_indexes,
2343
2355
  )
@@ -2498,18 +2510,35 @@ class Sheet(tk.Frame):
2498
2510
  del_from_options(self.RI.cell_options, "highlight")
2499
2511
  if header:
2500
2512
  del_from_options(self.CH.cell_options, "highlight")
2501
- self.set_refresh_timer(redraw)
2502
- return self
2513
+ return self.set_refresh_timer(redraw)
2503
2514
 
2504
2515
  # Dropdown Boxes
2505
2516
 
2506
2517
  def dropdown(
2507
2518
  self,
2508
2519
  *key: CreateSpanTypes,
2509
- **kwargs,
2520
+ values: list = [],
2521
+ edit_data: bool = True,
2522
+ set_values: dict[tuple[int, int], object] = {},
2523
+ set_value: object = None,
2524
+ state: str = "normal",
2525
+ redraw: bool = True,
2526
+ selection_function: Callable | None = None,
2527
+ modified_function: Callable | None = None,
2528
+ search_function: Callable = dropdown_search_function,
2529
+ validate_input: bool = True,
2530
+ text: None | str = None,
2510
2531
  ) -> Span:
2511
- kwargs = get_dropdown_kwargs(**kwargs)
2512
- v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
2532
+ v = set_value if set_value is not None else values[0] if values else ""
2533
+ kwargs = {
2534
+ "values": values,
2535
+ "state": state,
2536
+ "selection_function": selection_function,
2537
+ "modified_function": modified_function,
2538
+ "search_function": search_function,
2539
+ "validate_input": validate_input,
2540
+ "text": text,
2541
+ }
2513
2542
  d = get_dropdown_dict(**kwargs)
2514
2543
  span = self.span_from_key(*key)
2515
2544
  rows, cols = self.ranges_from_span(span)
@@ -2521,32 +2550,37 @@ class Sheet(tk.Frame):
2521
2550
  for r in rows:
2522
2551
  self.del_index_cell_options_dropdown_and_checkbox(r)
2523
2552
  add_to_options(self.RI.cell_options, r, "dropdown", d)
2524
- set_idata(r, v)
2553
+ if edit_data:
2554
+ set_idata(r, value=set_values[r] if r in set_values else v)
2525
2555
  if header:
2526
2556
  for c in cols:
2527
2557
  self.del_header_cell_options_dropdown_and_checkbox(c)
2528
2558
  add_to_options(self.CH.cell_options, c, "dropdown", d)
2529
- set_hdata(c, v)
2559
+ if edit_data:
2560
+ set_hdata(c, value=set_values[c] if c in set_values else v)
2530
2561
  if table:
2531
2562
  if span.kind == "cell":
2532
2563
  for r in rows:
2533
2564
  for c in cols:
2534
2565
  self.del_cell_options_dropdown_and_checkbox(r, c)
2535
2566
  add_to_options(self.MT.cell_options, (r, c), "dropdown", d)
2536
- set_tdata(r, c, v)
2567
+ if edit_data:
2568
+ set_tdata(r, c, value=set_values[(r, c)] if (r, c) in set_values else v)
2537
2569
  elif span.kind == "row":
2538
2570
  for r in rows:
2539
2571
  self.del_row_options_dropdown_and_checkbox(r)
2540
2572
  add_to_options(self.MT.row_options, r, "dropdown", d)
2541
- for c in cols:
2542
- set_tdata(r, c, v)
2573
+ if edit_data:
2574
+ for c in cols:
2575
+ set_tdata(r, c, value=set_values[(r, c)] if (r, c) in set_values else v)
2543
2576
  elif span.kind == "column":
2544
2577
  for c in cols:
2545
2578
  self.del_column_options_dropdown_and_checkbox(c)
2546
2579
  add_to_options(self.MT.col_options, c, "dropdown", d)
2547
- for r in rows:
2548
- set_tdata(r, c, v)
2549
- self.set_refresh_timer(kwargs["redraw"])
2580
+ if edit_data:
2581
+ for r in rows:
2582
+ set_tdata(r, c, value=set_values[(r, c)] if (r, c) in set_values else v)
2583
+ self.set_refresh_timer(redraw)
2550
2584
  return span
2551
2585
 
2552
2586
  def del_dropdown(
@@ -2594,10 +2628,18 @@ class Sheet(tk.Frame):
2594
2628
  def checkbox(
2595
2629
  self,
2596
2630
  *key: CreateSpanTypes,
2597
- **kwargs,
2631
+ edit_data: bool = True,
2632
+ checked: bool | None = None,
2633
+ state: str = "normal",
2634
+ redraw: bool = True,
2635
+ check_function: Callable | None = None,
2636
+ text: str = "",
2598
2637
  ) -> Span:
2599
- kwargs = get_checkbox_kwargs(**kwargs)
2600
- v = kwargs["checked"]
2638
+ kwargs = {
2639
+ "state": state,
2640
+ "check_function": check_function,
2641
+ "text": text,
2642
+ }
2601
2643
  d = get_checkbox_dict(**kwargs)
2602
2644
  span = self.span_from_key(*key)
2603
2645
  rows, cols = self.ranges_from_span(span)
@@ -2605,48 +2647,50 @@ class Sheet(tk.Frame):
2605
2647
  set_tdata = self.MT.set_cell_data
2606
2648
  set_idata = self.RI.set_cell_data
2607
2649
  set_hdata = self.CH.set_cell_data
2608
- if span.kind == "cell":
2609
- if header:
2610
- for c in cols:
2611
- self.del_header_cell_options_dropdown_and_checkbox(c)
2612
- add_to_options(self.CH.cell_options, c, "checkbox", d)
2613
- set_hdata(c, v)
2650
+ if index:
2614
2651
  for r in rows:
2615
- if index:
2616
- self.del_index_cell_options_dropdown_and_checkbox(r)
2617
- add_to_options(self.RI.cell_options, r, "checkbox", d)
2618
- set_idata(r, v)
2619
- if table:
2652
+ self.del_index_cell_options_dropdown_and_checkbox(r)
2653
+ add_to_options(self.RI.cell_options, r, "checkbox", d)
2654
+ if edit_data:
2655
+ set_idata(r, checked if isinstance(checked, bool) else force_bool(self.get_index_data(r)))
2656
+ if header:
2657
+ for c in cols:
2658
+ self.del_header_cell_options_dropdown_and_checkbox(c)
2659
+ add_to_options(self.CH.cell_options, c, "checkbox", d)
2660
+ if edit_data:
2661
+ set_hdata(c, checked if isinstance(checked, bool) else force_bool(self.get_header_data(c)))
2662
+ if table:
2663
+ if span.kind == "cell":
2664
+ for r in rows:
2620
2665
  for c in cols:
2621
2666
  self.MT.delete_cell_format(r, c, clear_values=False)
2622
2667
  self.del_cell_options_dropdown_and_checkbox(r, c)
2623
2668
  add_to_options(self.MT.cell_options, (r, c), "checkbox", d)
2624
- set_tdata(r, c, v)
2625
- elif span.kind == "row":
2626
- for r in rows:
2627
- if index:
2628
- self.del_index_cell_options_dropdown_and_checkbox(r)
2629
- add_to_options(self.RI.cell_options, r, "checkbox", d)
2630
- set_idata(r, v)
2631
- if table:
2669
+ if edit_data:
2670
+ set_tdata(
2671
+ r, c, checked if isinstance(checked, bool) else force_bool(self.get_cell_data(r, c))
2672
+ )
2673
+ elif span.kind == "row":
2674
+ for r in rows:
2632
2675
  self.MT.delete_row_format(r, clear_values=False)
2633
2676
  self.del_row_options_dropdown_and_checkbox(r)
2634
2677
  add_to_options(self.MT.row_options, r, "checkbox", d)
2635
- for c in cols:
2636
- set_tdata(r, c, v)
2637
- elif span.kind == "column":
2638
- for c in cols:
2639
- if header:
2640
- self.del_header_cell_options_dropdown_and_checkbox(c)
2641
- add_to_options(self.CH.cell_options, c, "checkbox", d)
2642
- set_hdata(c, v)
2643
- if table:
2678
+ if edit_data:
2679
+ for c in cols:
2680
+ set_tdata(
2681
+ r, c, checked if isinstance(checked, bool) else force_bool(self.get_cell_data(r, c))
2682
+ )
2683
+ elif span.kind == "column":
2684
+ for c in cols:
2644
2685
  self.MT.delete_column_format(c, clear_values=False)
2645
2686
  self.del_column_options_dropdown_and_checkbox(c)
2646
2687
  add_to_options(self.MT.col_options, c, "checkbox", d)
2647
- for r in rows:
2648
- set_tdata(r, c, v)
2649
- self.set_refresh_timer(kwargs["redraw"])
2688
+ if edit_data:
2689
+ for r in rows:
2690
+ set_tdata(
2691
+ r, c, checked if isinstance(checked, bool) else force_bool(self.get_cell_data(r, c))
2692
+ )
2693
+ self.set_refresh_timer(redraw)
2650
2694
  return span
2651
2695
 
2652
2696
  def del_checkbox(
@@ -2847,8 +2891,7 @@ class Sheet(tk.Frame):
2847
2891
  self.MT.align = convert_align(align)
2848
2892
  else:
2849
2893
  raise ValueError("Align must be one of the following values: c, center, w, west, e, east")
2850
- self.set_refresh_timer(redraw)
2851
- return self
2894
+ return self.set_refresh_timer(redraw)
2852
2895
 
2853
2896
  def header_align(
2854
2897
  self,
@@ -2861,8 +2904,7 @@ class Sheet(tk.Frame):
2861
2904
  self.CH.align = convert_align(align)
2862
2905
  else:
2863
2906
  raise ValueError("Align must be one of the following values: c, center, w, west, e, east")
2864
- self.set_refresh_timer(redraw)
2865
- return self
2907
+ return self.set_refresh_timer(redraw)
2866
2908
 
2867
2909
  def row_index_align(
2868
2910
  self,
@@ -2875,8 +2917,7 @@ class Sheet(tk.Frame):
2875
2917
  self.RI.align = convert_align(align)
2876
2918
  else:
2877
2919
  raise ValueError("Align must be one of the following values: c, center, w, west, e, east")
2878
- self.set_refresh_timer(redraw)
2879
- return self
2920
+ return self.set_refresh_timer(redraw)
2880
2921
 
2881
2922
  index_align = row_index_align
2882
2923
 
@@ -3084,8 +3125,7 @@ class Sheet(tk.Frame):
3084
3125
  redraw=False,
3085
3126
  run_binding_func=run_binding_func,
3086
3127
  )
3087
- self.set_refresh_timer(redraw)
3088
- return self
3128
+ return self.set_refresh_timer(redraw)
3089
3129
 
3090
3130
  def select_column(self, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3091
3131
  self.CH.select_col(
@@ -3093,8 +3133,7 @@ class Sheet(tk.Frame):
3093
3133
  redraw=False,
3094
3134
  run_binding_func=run_binding_func,
3095
3135
  )
3096
- self.set_refresh_timer(redraw)
3097
- return self
3136
+ return self.set_refresh_timer(redraw)
3098
3137
 
3099
3138
  def select_cell(self, row: int, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3100
3139
  self.MT.select_cell(
@@ -3103,13 +3142,11 @@ class Sheet(tk.Frame):
3103
3142
  redraw=False,
3104
3143
  run_binding_func=run_binding_func,
3105
3144
  )
3106
- self.set_refresh_timer(redraw)
3107
- return self
3145
+ return self.set_refresh_timer(redraw)
3108
3146
 
3109
3147
  def select_all(self, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3110
3148
  self.MT.select_all(redraw=False, run_binding_func=run_binding_func)
3111
- self.set_refresh_timer(redraw)
3112
- return self
3149
+ return self.set_refresh_timer(redraw)
3113
3150
 
3114
3151
  def add_cell_selection(
3115
3152
  self,
@@ -3126,8 +3163,7 @@ class Sheet(tk.Frame):
3126
3163
  run_binding_func=run_binding_func,
3127
3164
  set_as_current=set_as_current,
3128
3165
  )
3129
- self.set_refresh_timer(redraw)
3130
- return self
3166
+ return self.set_refresh_timer(redraw)
3131
3167
 
3132
3168
  def add_row_selection(
3133
3169
  self,
@@ -3142,8 +3178,7 @@ class Sheet(tk.Frame):
3142
3178
  run_binding_func=run_binding_func,
3143
3179
  set_as_current=set_as_current,
3144
3180
  )
3145
- self.set_refresh_timer(redraw)
3146
- return self
3181
+ return self.set_refresh_timer(redraw)
3147
3182
 
3148
3183
  def add_column_selection(
3149
3184
  self,
@@ -3158,8 +3193,7 @@ class Sheet(tk.Frame):
3158
3193
  run_binding_func=run_binding_func,
3159
3194
  set_as_current=set_as_current,
3160
3195
  )
3161
- self.set_refresh_timer(redraw)
3162
- return self
3196
+ return self.set_refresh_timer(redraw)
3163
3197
 
3164
3198
  def toggle_select_cell(
3165
3199
  self,
@@ -3178,8 +3212,7 @@ class Sheet(tk.Frame):
3178
3212
  run_binding_func=run_binding_func,
3179
3213
  set_as_current=set_as_current,
3180
3214
  )
3181
- self.set_refresh_timer(redraw)
3182
- return self
3215
+ return self.set_refresh_timer(redraw)
3183
3216
 
3184
3217
  def toggle_select_row(
3185
3218
  self,
@@ -3196,8 +3229,7 @@ class Sheet(tk.Frame):
3196
3229
  run_binding_func=run_binding_func,
3197
3230
  set_as_current=set_as_current,
3198
3231
  )
3199
- self.set_refresh_timer(redraw)
3200
- return self
3232
+ return self.set_refresh_timer(redraw)
3201
3233
 
3202
3234
  def toggle_select_column(
3203
3235
  self,
@@ -3214,8 +3246,7 @@ class Sheet(tk.Frame):
3214
3246
  run_binding_func=run_binding_func,
3215
3247
  set_as_current=set_as_current,
3216
3248
  )
3217
- self.set_refresh_timer(redraw)
3218
- return self
3249
+ return self.set_refresh_timer(redraw)
3219
3250
 
3220
3251
  def create_selection_box(
3221
3252
  self,
@@ -3239,8 +3270,7 @@ class Sheet(tk.Frame):
3239
3270
  redraw: bool = True,
3240
3271
  ) -> Sheet:
3241
3272
  self.MT.deselect(r=row, c=column, cell=cell, redraw=False)
3242
- self.set_refresh_timer(redraw)
3243
- return self
3273
+ return self.set_refresh_timer(redraw)
3244
3274
 
3245
3275
  def deselect_any(
3246
3276
  self,
@@ -3249,8 +3279,7 @@ class Sheet(tk.Frame):
3249
3279
  redraw: bool = True,
3250
3280
  ) -> Sheet:
3251
3281
  self.MT.deselect_any(rows=rows, columns=columns, redraw=False)
3252
- self.set_refresh_timer(redraw)
3253
- return self
3282
+ return self.set_refresh_timer(redraw)
3254
3283
 
3255
3284
  # Row Heights and Column Widths
3256
3285
 
@@ -3277,15 +3306,15 @@ class Sheet(tk.Frame):
3277
3306
  redraw: bool = True,
3278
3307
  ) -> Sheet:
3279
3308
  self.MT.set_cell_size_to_text(r=row, c=column, only_set_if_too_small=only_set_if_too_small)
3280
- self.set_refresh_timer(redraw)
3281
- return self
3309
+ return self.set_refresh_timer(redraw)
3282
3310
 
3283
3311
  def set_all_cell_sizes_to_text(
3284
3312
  self,
3285
3313
  redraw: bool = True,
3286
3314
  width: int | None = None,
3315
+ slim: bool = False,
3287
3316
  ) -> tuple[list[float], list[float]]:
3288
- self.MT.set_all_cell_sizes_to_text(w=width)
3317
+ self.MT.set_all_cell_sizes_to_text(w=width, slim=slim)
3289
3318
  self.set_refresh_timer(redraw)
3290
3319
  return self.MT.row_positions, self.MT.col_positions
3291
3320
 
@@ -3301,8 +3330,7 @@ class Sheet(tk.Frame):
3301
3330
  only_set_if_too_small=only_set_if_too_small,
3302
3331
  recreate=recreate_selection_boxes,
3303
3332
  )
3304
- self.set_refresh_timer(redraw)
3305
- return self
3333
+ return self.set_refresh_timer(redraw)
3306
3334
 
3307
3335
  def set_all_row_heights(
3308
3336
  self,
@@ -3316,8 +3344,7 @@ class Sheet(tk.Frame):
3316
3344
  only_set_if_too_small=only_set_if_too_small,
3317
3345
  recreate=recreate_selection_boxes,
3318
3346
  )
3319
- self.set_refresh_timer(redraw)
3320
- return self
3347
+ return self.set_refresh_timer(redraw)
3321
3348
 
3322
3349
  def column_width(
3323
3350
  self,
@@ -3338,8 +3365,7 @@ class Sheet(tk.Frame):
3338
3365
  self.CH.set_col_width(col=column, width=width, only_set_if_too_small=only_set_if_too_small)
3339
3366
  elif isinstance(column, int):
3340
3367
  return int(self.MT.col_positions[column + 1] - self.MT.col_positions[column])
3341
- self.set_refresh_timer(redraw)
3342
- return self
3368
+ return self.set_refresh_timer(redraw)
3343
3369
 
3344
3370
  def row_height(
3345
3371
  self,
@@ -3360,8 +3386,7 @@ class Sheet(tk.Frame):
3360
3386
  self.RI.set_row_height(row=row, height=height, only_set_if_too_small=only_set_if_too_small)
3361
3387
  elif isinstance(row, int):
3362
3388
  return int(self.MT.row_positions[row + 1] - self.MT.row_positions[row])
3363
- self.set_refresh_timer(redraw)
3364
- return self
3389
+ return self.set_refresh_timer(redraw)
3365
3390
 
3366
3391
  def get_column_widths(self, canvas_positions: bool = False) -> list[float]:
3367
3392
  if canvas_positions:
@@ -3411,8 +3436,7 @@ class Sheet(tk.Frame):
3411
3436
  if self.ops.auto_resize_row_index:
3412
3437
  self.ops.auto_resize_row_index = False
3413
3438
  self.RI.set_width(pixels, set_TL=True)
3414
- self.set_refresh_timer(redraw)
3415
- return self
3439
+ return self.set_refresh_timer(redraw)
3416
3440
 
3417
3441
  def set_height_of_header_to_text(self, text: None | str = None) -> Sheet:
3418
3442
  self.CH.set_height_of_header_to_text(text=text)
@@ -3420,8 +3444,7 @@ class Sheet(tk.Frame):
3420
3444
 
3421
3445
  def set_header_height_pixels(self, pixels: int, redraw: bool = True) -> Sheet:
3422
3446
  self.CH.set_height(pixels, set_TL=True)
3423
- self.set_refresh_timer(redraw)
3424
- return self
3447
+ return self.set_refresh_timer(redraw)
3425
3448
 
3426
3449
  def set_header_height_lines(self, nlines: int, redraw: bool = True) -> Sheet:
3427
3450
  self.CH.set_height(
@@ -3431,8 +3454,7 @@ class Sheet(tk.Frame):
3431
3454
  ),
3432
3455
  set_TL=True,
3433
3456
  )
3434
- self.set_refresh_timer(redraw)
3435
- return self
3457
+ return self.set_refresh_timer(redraw)
3436
3458
 
3437
3459
  def del_row_position(self, idx: int, deselect_all: bool = False) -> Sheet:
3438
3460
  self.MT.del_row_position(idx=idx, deselect_all=deselect_all)
@@ -3464,8 +3486,7 @@ class Sheet(tk.Frame):
3464
3486
  redraw: bool = False,
3465
3487
  ) -> Sheet:
3466
3488
  self.MT.insert_col_position(idx=idx, width=width, deselect_all=deselect_all)
3467
- self.set_refresh_timer(redraw)
3468
- return self
3489
+ return self.set_refresh_timer(redraw)
3469
3490
 
3470
3491
  def insert_row_position(
3471
3492
  self,
@@ -3475,8 +3496,7 @@ class Sheet(tk.Frame):
3475
3496
  redraw: bool = False,
3476
3497
  ) -> Sheet:
3477
3498
  self.MT.insert_row_position(idx=idx, height=height, deselect_all=deselect_all)
3478
- self.set_refresh_timer(redraw)
3479
- return self
3499
+ return self.set_refresh_timer(redraw)
3480
3500
 
3481
3501
  def insert_column_positions(
3482
3502
  self,
@@ -3486,8 +3506,7 @@ class Sheet(tk.Frame):
3486
3506
  redraw: bool = False,
3487
3507
  ) -> Sheet:
3488
3508
  self.MT.insert_col_positions(idx=idx, widths=widths, deselect_all=deselect_all)
3489
- self.set_refresh_timer(redraw)
3490
- return self
3509
+ return self.set_refresh_timer(redraw)
3491
3510
 
3492
3511
  def insert_row_positions(
3493
3512
  self,
@@ -3497,8 +3516,7 @@ class Sheet(tk.Frame):
3497
3516
  redraw: bool = False,
3498
3517
  ) -> Sheet:
3499
3518
  self.MT.insert_row_positions(idx=idx, heights=heights, deselect_all=deselect_all)
3500
- self.set_refresh_timer(redraw)
3501
- return self
3519
+ return self.set_refresh_timer(redraw)
3502
3520
 
3503
3521
  def sheet_display_dimensions(
3504
3522
  self,
@@ -3648,8 +3666,7 @@ class Sheet(tk.Frame):
3648
3666
  check_cell_visibility=check_cell_visibility,
3649
3667
  redraw=False,
3650
3668
  )
3651
- self.set_refresh_timer(redraw)
3652
- return self
3669
+ return self.set_refresh_timer(redraw)
3653
3670
 
3654
3671
  def cell_visible(self, r: int, c: int) -> bool:
3655
3672
  return self.MT.cell_visible(r, c)
@@ -3759,8 +3776,7 @@ class Sheet(tk.Frame):
3759
3776
  )
3760
3777
  if deselect_all:
3761
3778
  self.MT.deselect(redraw=False)
3762
- self.set_refresh_timer(redraw)
3763
- return self
3779
+ return self.set_refresh_timer(redraw)
3764
3780
 
3765
3781
  # uses data indexes
3766
3782
  def show_columns(
@@ -3780,8 +3796,7 @@ class Sheet(tk.Frame):
3780
3796
  self.MT.set_col_positions(cws)
3781
3797
  if deselect_all:
3782
3798
  self.MT.deselect(redraw=False)
3783
- self.set_refresh_timer(redraw)
3784
- return self
3799
+ return self.set_refresh_timer(redraw)
3785
3800
 
3786
3801
  def all_columns_displayed(self, a: bool | None = None) -> bool:
3787
3802
  v = bool(self.MT.all_columns_displayed)
@@ -3843,6 +3858,7 @@ class Sheet(tk.Frame):
3843
3858
  redraw: bool = True,
3844
3859
  deselect_all: bool = True,
3845
3860
  data_indexes: bool = False,
3861
+ row_heights: bool = True,
3846
3862
  ) -> Sheet:
3847
3863
  if isinstance(rows, int):
3848
3864
  rows = {rows}
@@ -3870,17 +3886,17 @@ class Sheet(tk.Frame):
3870
3886
  to_pop[i] = r
3871
3887
  self.MT.displayed_rows = new_disp
3872
3888
  self.MT.all_rows_displayed = False
3873
- self.MT.set_row_positions(
3874
- pop_positions(
3875
- itr=self.MT.gen_row_heights,
3876
- to_pop=to_pop,
3877
- save_to=self.MT.saved_row_heights,
3878
- ),
3879
- )
3889
+ if row_heights:
3890
+ self.MT.set_row_positions(
3891
+ pop_positions(
3892
+ itr=self.MT.gen_row_heights,
3893
+ to_pop=to_pop,
3894
+ save_to=self.MT.saved_row_heights,
3895
+ ),
3896
+ )
3880
3897
  if deselect_all:
3881
3898
  self.MT.deselect(redraw=False)
3882
- self.set_refresh_timer(redraw)
3883
- return self
3899
+ return self.set_refresh_timer(redraw)
3884
3900
 
3885
3901
  # uses data indexes
3886
3902
  def show_rows(
@@ -3900,8 +3916,7 @@ class Sheet(tk.Frame):
3900
3916
  self.MT.set_row_positions(rhs)
3901
3917
  if deselect_all:
3902
3918
  self.MT.deselect(redraw=False)
3903
- self.set_refresh_timer(redraw)
3904
- return self
3919
+ return self.set_refresh_timer(redraw)
3905
3920
 
3906
3921
  def all_rows_displayed(self, a: bool | None = None) -> bool:
3907
3922
  v = bool(self.MT.all_rows_displayed)
@@ -4088,7 +4103,9 @@ class Sheet(tk.Frame):
4088
4103
  return self
4089
4104
 
4090
4105
  def destroy_text_editor(self, event: object = None) -> Sheet:
4091
- self.MT.hide_text_editor(event=event)
4106
+ self.MT.hide_text_editor(reason=event)
4107
+ self.RI.hide_text_editor(reason=event)
4108
+ self.CH.hide_text_editor(reason=event)
4092
4109
  return self
4093
4110
 
4094
4111
  def get_text_editor_widget(self, event: object = None) -> tk.Text | None:
@@ -4122,9 +4139,13 @@ class Sheet(tk.Frame):
4122
4139
  return self.MT.text_editor.get()
4123
4140
 
4124
4141
  def close_text_editor(self, set_data: bool = True) -> Sheet:
4142
+ event = new_tk_event("ButtonPress-1" if set_data else "Escape")
4125
4143
  if self.MT.text_editor.open:
4126
- event = ("ButtonPress-1",) if set_data else ("Escape",)
4127
- self.MT.close_text_editor(editor_info=self.MT.text_editor.coords + event)
4144
+ self.MT.close_text_editor(event=event)
4145
+ if self.RI.text_editor.open:
4146
+ self.RI.close_text_editor(event=event)
4147
+ if self.CH.text_editor.open:
4148
+ self.CH.close_text_editor(event=event)
4128
4149
  return self
4129
4150
 
4130
4151
  # Sheet Options and Other Functions
@@ -4191,8 +4212,7 @@ class Sheet(tk.Frame):
4191
4212
  if any(k in kwargs for k in scrollbar_options_keys):
4192
4213
  self.set_scrollbar_options()
4193
4214
  self.MT.create_rc_menus()
4194
- self.set_refresh_timer(redraw)
4195
- return self
4215
+ return self.set_refresh_timer(redraw)
4196
4216
 
4197
4217
  def set_scrollbar_options(self) -> Sheet:
4198
4218
  style = ttk.Style()
@@ -4479,31 +4499,37 @@ class Sheet(tk.Frame):
4479
4499
  parent_column: int,
4480
4500
  text_column: None | int = None,
4481
4501
  push_ops: bool = False,
4502
+ row_heights: Sequence[int] | None | False = None,
4503
+ open_ids: Iterator[str] | None = None,
4504
+ safety: bool = True,
4505
+ ncols: int | None = None,
4482
4506
  ) -> Sheet:
4483
4507
  if text_column is None:
4484
4508
  text_column = iid_column
4485
4509
  tally_of_ids = defaultdict(lambda: -1)
4486
- ncols = max(map(len, data), default=0)
4510
+ if not isinstance(ncols, int):
4511
+ ncols = max(map(len, data), default=0)
4487
4512
  for rn, row in enumerate(data):
4488
- if ncols > (lnr := len(row)):
4513
+ if safety and ncols > (lnr := len(row)):
4489
4514
  row += self.MT.get_empty_row_seq(rn, end=ncols, start=lnr)
4490
4515
  iid, pid = row[iid_column].lower(), row[parent_column].lower()
4491
- if not iid:
4492
- continue
4493
- tally_of_ids[iid] += 1
4494
- if tally_of_ids[iid] > 0:
4495
- x = 1
4496
- while iid in tally_of_ids:
4497
- new = f"{row[iid_column]}_DUPLICATED_{x}"
4498
- iid = new.lower()
4499
- x += 1
4516
+ if safety:
4517
+ if not iid:
4518
+ continue
4500
4519
  tally_of_ids[iid] += 1
4501
- row[iid_column] = new
4520
+ if tally_of_ids[iid] > 0:
4521
+ x = 1
4522
+ while iid in tally_of_ids:
4523
+ new = f"{row[iid_column]}_DUPLICATED_{x}"
4524
+ iid = new.lower()
4525
+ x += 1
4526
+ tally_of_ids[iid] += 1
4527
+ row[iid_column] = new
4502
4528
  if iid in self.RI.tree:
4503
4529
  self.RI.tree[iid].text = row[text_column]
4504
4530
  else:
4505
4531
  self.RI.tree[iid] = Node(row[text_column], iid, "")
4506
- if iid == pid or self.RI.pid_causes_recursive_loop(iid, pid):
4532
+ if safety and (iid == pid or self.RI.pid_causes_recursive_loop(iid, pid)):
4507
4533
  row[parent_column] = ""
4508
4534
  pid = ""
4509
4535
  if pid:
@@ -4522,19 +4548,24 @@ class Sheet(tk.Frame):
4522
4548
  self.RI.tree_rns[n.iid] = len(data)
4523
4549
  data.append(newrow)
4524
4550
  self.insert_rows(
4525
- idx=0,
4526
4551
  rows=[[self.RI.tree[iid]] + data[self.RI.tree_rns[iid]] for iid in self.get_children()],
4552
+ idx=0,
4553
+ heights={} if row_heights is False else row_heights,
4527
4554
  row_index=True,
4528
4555
  create_selections=False,
4529
4556
  fill=False,
4530
4557
  push_ops=push_ops,
4531
4558
  )
4532
4559
  self.RI.tree_rns = {n.iid: i for i, n in enumerate(self.MT._row_index)}
4533
- self.hide_rows(
4534
- set(self.RI.tree_rns[iid] for iid in self.get_children() if self.RI.tree[iid].parent),
4535
- deselect_all=False,
4536
- data_indexes=True,
4537
- )
4560
+ if open_ids:
4561
+ self.tree_set_open(open_ids=open_ids)
4562
+ else:
4563
+ self.hide_rows(
4564
+ set(self.RI.tree_rns[iid] for iid in self.get_children() if self.RI.tree[iid].parent),
4565
+ deselect_all=False,
4566
+ data_indexes=True,
4567
+ row_heights=False if row_heights is False else True,
4568
+ )
4538
4569
  return self
4539
4570
 
4540
4571
  def tree_reset(self) -> Sheet:
@@ -4548,24 +4579,25 @@ class Sheet(tk.Frame):
4548
4579
  """
4549
4580
  return self.RI.tree_open_ids
4550
4581
 
4551
- def tree_set_open(self, open_ids: set[str]) -> Sheet:
4582
+ def tree_set_open(self, open_ids: Iterator[str]) -> Sheet:
4552
4583
  """
4553
4584
  Accepts set[str] of iids that are open in the treeview
4554
4585
  Closes everything else
4555
4586
  """
4556
4587
  self.hide_rows(
4557
- set(self.MT.displayed_rows),
4588
+ # set(self.MT.displayed_rows),
4589
+ set(rn for rn in self.MT.displayed_rows if self.MT._row_index[rn].parent),
4558
4590
  redraw=False,
4559
4591
  deselect_all=False,
4560
4592
  data_indexes=True,
4561
4593
  )
4562
- self.show_rows(
4563
- (self.RI.tree_rns[iid] for iid in self.get_children("")),
4564
- redraw=False,
4565
- deselect_all=True,
4566
- )
4594
+ # self.show_rows(
4595
+ # (self.RI.tree_rns[iid] for iid in self.get_children("")),
4596
+ # redraw=False,
4597
+ # deselect_all=True,
4598
+ # )
4567
4599
  open_ids = set(filter(self.exists, map(str.lower, open_ids)))
4568
- self.RI.tree_open_ids = open_ids
4600
+ self.RI.tree_open_ids = set()
4569
4601
  if open_ids:
4570
4602
  self.tree_open(open_ids)
4571
4603
  return self
@@ -4720,12 +4752,12 @@ class Sheet(tk.Frame):
4720
4752
  raise ValueError(f"item '{item.lower()}' does not exist.")
4721
4753
 
4722
4754
  def rowitem(self, row: int, data_index: bool = False) -> str | None:
4723
- if isinstance(row, int):
4724
- if not data_index:
4725
- row = self.data_r(row)
4726
- if len(self.MT._row_index) > row:
4755
+ try:
4756
+ if data_index:
4727
4757
  return self.MT._row_index[row].iid
4728
- return None
4758
+ return self.MT._row_index[self.MT.displayed_rows[row]].iid
4759
+ except Exception:
4760
+ return None
4729
4761
 
4730
4762
  def get_children(self, item: None | str = None) -> Generator[str]:
4731
4763
  if item is None:
@@ -4954,12 +4986,14 @@ class Sheet(tk.Frame):
4954
4986
 
4955
4987
  # Functions not in docs
4956
4988
 
4989
+ def event_generate(self, *args, **kwargs):
4990
+ self.MT.event_generate(*args, **kwargs)
4991
+
4957
4992
  def emit_event(
4958
4993
  self,
4959
4994
  event: str,
4960
- data: None | dict = None,
4995
+ data: EventDataDict | None = None,
4961
4996
  ) -> None:
4962
- # data is a EventDataDict
4963
4997
  if data is None:
4964
4998
  data = EventDataDict()
4965
4999
  data["sheetname"] = self.name
@@ -4967,9 +5001,10 @@ class Sheet(tk.Frame):
4967
5001
  for func in self.bound_events[event]:
4968
5002
  func(data)
4969
5003
 
4970
- def set_refresh_timer(self, redraw: bool = True) -> None:
5004
+ def set_refresh_timer(self, redraw: bool = True) -> Sheet:
4971
5005
  if redraw and self.after_redraw_id is None:
4972
5006
  self.after_redraw_id = self.after(self.after_redraw_time_ms, self.after_redraw)
5007
+ return self
4973
5008
 
4974
5009
  def after_redraw(self) -> None:
4975
5010
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
@@ -5218,7 +5253,7 @@ class Sheet(tk.Frame):
5218
5253
  reset_col_positions: bool = True,
5219
5254
  reset_row_positions: bool = True,
5220
5255
  redraw: bool = True,
5221
- ):
5256
+ ) -> object:
5222
5257
  self.set_refresh_timer(redraw)
5223
5258
  return self.MT.data_reference(newdataref, reset_col_positions, reset_row_positions)
5224
5259
 
@@ -5229,11 +5264,11 @@ class Sheet(tk.Frame):
5229
5264
  value: object = "",
5230
5265
  redraw: bool = True,
5231
5266
  keep_formatting: bool = True,
5232
- ) -> None:
5267
+ ) -> Sheet:
5233
5268
  if not keep_formatting:
5234
5269
  self.MT.delete_cell_format(r, c, clear_values=False)
5235
5270
  self.MT.set_cell_data(r, c, value)
5236
- self.set_refresh_timer(redraw)
5271
+ return self.set_refresh_timer(redraw)
5237
5272
 
5238
5273
  def set_row_data(
5239
5274
  self,
@@ -5242,7 +5277,7 @@ class Sheet(tk.Frame):
5242
5277
  add_columns: bool = True,
5243
5278
  redraw: bool = True,
5244
5279
  keep_formatting: bool = True,
5245
- ) -> None:
5280
+ ) -> Sheet:
5246
5281
  if r >= len(self.MT.data):
5247
5282
  raise Exception("Row number is out of range")
5248
5283
  if not keep_formatting:
@@ -5265,7 +5300,7 @@ class Sheet(tk.Frame):
5265
5300
  self.MT.data[r].append(v)
5266
5301
  else:
5267
5302
  self.set_cell_data(r=r, c=c, value=v, redraw=False, keep_formatting=keep_formatting)
5268
- self.set_refresh_timer(redraw)
5303
+ return self.set_refresh_timer(redraw)
5269
5304
 
5270
5305
  def set_column_data(
5271
5306
  self,
@@ -5274,7 +5309,7 @@ class Sheet(tk.Frame):
5274
5309
  add_rows: bool = True,
5275
5310
  redraw: bool = True,
5276
5311
  keep_formatting: bool = True,
5277
- ) -> None:
5312
+ ) -> Sheet:
5278
5313
  if not keep_formatting:
5279
5314
  self.MT.delete_column_format(c, clear_values=False)
5280
5315
  if add_rows:
@@ -5297,14 +5332,14 @@ class Sheet(tk.Frame):
5297
5332
  if c >= len(self.MT.data[rn]):
5298
5333
  self.MT.fix_row_len(rn, c)
5299
5334
  self.set_cell_data(r=rn, c=c, value=v, redraw=False, keep_formatting=keep_formatting)
5300
- self.set_refresh_timer(redraw)
5335
+ return self.set_refresh_timer(redraw)
5301
5336
 
5302
5337
  def readonly_rows(
5303
5338
  self,
5304
5339
  rows: list | int = [],
5305
5340
  readonly: bool = True,
5306
5341
  redraw: bool = False,
5307
- ) -> None:
5342
+ ) -> Sheet:
5308
5343
  if isinstance(rows, int):
5309
5344
  rows = [rows]
5310
5345
  else:
@@ -5318,14 +5353,14 @@ class Sheet(tk.Frame):
5318
5353
  if r not in self.MT.row_options:
5319
5354
  self.MT.row_options[r] = {}
5320
5355
  self.MT.row_options[r]["readonly"] = True
5321
- self.set_refresh_timer(redraw)
5356
+ return self.set_refresh_timer(redraw)
5322
5357
 
5323
5358
  def readonly_columns(
5324
5359
  self,
5325
5360
  columns: list | int = [],
5326
5361
  readonly: bool = True,
5327
5362
  redraw: bool = False,
5328
- ) -> None:
5363
+ ) -> Sheet:
5329
5364
  if isinstance(columns, int):
5330
5365
  columns = [columns]
5331
5366
  else:
@@ -5339,7 +5374,7 @@ class Sheet(tk.Frame):
5339
5374
  if c not in self.MT.col_options:
5340
5375
  self.MT.col_options[c] = {}
5341
5376
  self.MT.col_options[c]["readonly"] = True
5342
- self.set_refresh_timer(redraw)
5377
+ return self.set_refresh_timer(redraw)
5343
5378
 
5344
5379
  def readonly_cells(
5345
5380
  self,
@@ -5348,7 +5383,7 @@ class Sheet(tk.Frame):
5348
5383
  cells: list = [],
5349
5384
  readonly: bool = True,
5350
5385
  redraw: bool = False,
5351
- ) -> None:
5386
+ ) -> Sheet:
5352
5387
  if not readonly:
5353
5388
  if cells:
5354
5389
  for r, c in cells:
@@ -5370,31 +5405,31 @@ class Sheet(tk.Frame):
5370
5405
  if (row, column) not in self.MT.cell_options:
5371
5406
  self.MT.cell_options[(row, column)] = {}
5372
5407
  self.MT.cell_options[(row, column)]["readonly"] = True
5373
- self.set_refresh_timer(redraw)
5408
+ return self.set_refresh_timer(redraw)
5374
5409
 
5375
5410
  def readonly_header(
5376
5411
  self,
5377
5412
  columns: list = [],
5378
5413
  readonly: bool = True,
5379
5414
  redraw: bool = False,
5380
- ) -> None:
5415
+ ) -> Sheet:
5381
5416
  self.CH.readonly_header(columns=columns, readonly=readonly)
5382
- self.set_refresh_timer(redraw)
5417
+ return self.set_refresh_timer(redraw)
5383
5418
 
5384
5419
  def readonly_index(
5385
5420
  self,
5386
5421
  rows: list = [],
5387
5422
  readonly: bool = True,
5388
5423
  redraw: bool = False,
5389
- ) -> None:
5424
+ ) -> Sheet:
5390
5425
  self.RI.readonly_index(rows=rows, readonly=readonly)
5391
- self.set_refresh_timer(redraw)
5426
+ return self.set_refresh_timer(redraw)
5392
5427
 
5393
5428
  def dehighlight_rows(
5394
5429
  self,
5395
5430
  rows: list[int] | Literal["all"] = [],
5396
5431
  redraw: bool = True,
5397
- ) -> None:
5432
+ ) -> Sheet:
5398
5433
  if isinstance(rows, int):
5399
5434
  rows = [rows]
5400
5435
  if not rows or rows == "all":
@@ -5415,13 +5450,13 @@ class Sheet(tk.Frame):
5415
5450
  del self.RI.cell_options[r]["highlight"]
5416
5451
  except Exception:
5417
5452
  pass
5418
- self.set_refresh_timer(redraw)
5453
+ return self.set_refresh_timer(redraw)
5419
5454
 
5420
5455
  def dehighlight_columns(
5421
5456
  self,
5422
5457
  columns: list[int] | Literal["all"] = [],
5423
5458
  redraw: bool = True,
5424
- ) -> None:
5459
+ ) -> Sheet:
5425
5460
  if isinstance(columns, int):
5426
5461
  columns = [columns]
5427
5462
  if not columns or columns == "all":
@@ -5442,7 +5477,7 @@ class Sheet(tk.Frame):
5442
5477
  del self.CH.cell_options[c]["highlight"]
5443
5478
  except Exception:
5444
5479
  pass
5445
- self.set_refresh_timer(redraw)
5480
+ return self.set_refresh_timer(redraw)
5446
5481
 
5447
5482
  def highlight_rows(
5448
5483
  self,
@@ -5453,14 +5488,14 @@ class Sheet(tk.Frame):
5453
5488
  redraw: bool = True,
5454
5489
  end_of_screen: bool = False,
5455
5490
  overwrite: bool = True,
5456
- ) -> None:
5491
+ ) -> Sheet:
5457
5492
  if bg is None and fg is None:
5458
5493
  return
5459
5494
  for r in (rows,) if isinstance(rows, int) else rows:
5460
5495
  add_highlight(self.MT.row_options, r, bg, fg, end_of_screen, overwrite)
5461
5496
  if highlight_index:
5462
5497
  self.highlight_cells(cells=rows, canvas="index", bg=bg, fg=fg, redraw=False)
5463
- self.set_refresh_timer(redraw)
5498
+ return self.set_refresh_timer(redraw)
5464
5499
 
5465
5500
  def highlight_columns(
5466
5501
  self,
@@ -5470,26 +5505,26 @@ class Sheet(tk.Frame):
5470
5505
  highlight_header: bool = True,
5471
5506
  redraw: bool = True,
5472
5507
  overwrite: bool = True,
5473
- ) -> None:
5508
+ ) -> Sheet:
5474
5509
  if bg is False and fg is False:
5475
5510
  return
5476
5511
  for c in (columns,) if isinstance(columns, int) else columns:
5477
5512
  add_highlight(self.MT.col_options, c, bg, fg, None, overwrite)
5478
5513
  if highlight_header:
5479
5514
  self.highlight_cells(cells=columns, canvas="header", bg=bg, fg=fg, redraw=False)
5480
- self.set_refresh_timer(redraw)
5515
+ return self.set_refresh_timer(redraw)
5481
5516
 
5482
5517
  def highlight_cells(
5483
5518
  self,
5484
- row: int = 0,
5485
- column: int = 0,
5486
- cells: list = [],
5519
+ row: int | Literal["all"] = 0,
5520
+ column: int | Literal["all"] = 0,
5521
+ cells: list[tuple[int, int]] = [],
5487
5522
  canvas: Literal["table", "index", "header"] = "table",
5488
5523
  bg: bool | None | str = False,
5489
5524
  fg: bool | None | str = False,
5490
5525
  redraw: bool = True,
5491
5526
  overwrite: bool = True,
5492
- ) -> None:
5527
+ ) -> Sheet:
5493
5528
  if bg is False and fg is False:
5494
5529
  return
5495
5530
  if canvas == "table":
@@ -5497,31 +5532,41 @@ class Sheet(tk.Frame):
5497
5532
  for r_, c_ in cells:
5498
5533
  add_highlight(self.MT.cell_options, (r_, c_), bg, fg, None, overwrite)
5499
5534
  else:
5500
- if isinstance(row, str) and row.lower() == "all" and isinstance(column, int):
5501
- riter = range(self.MT.total_data_rows())
5502
- citer = (column,)
5535
+ if (
5536
+ isinstance(row, str)
5537
+ and row.lower() == "all"
5538
+ and isinstance(column, str)
5539
+ and column.lower() == "all"
5540
+ ):
5541
+ totalrows, totalcols = self.MT.total_data_rows(), self.MT.total_data_cols()
5542
+ for r_ in range(totalrows):
5543
+ for c_ in range(totalcols):
5544
+ add_highlight(self.MT.cell_options, (r_, c_), bg, fg, None, overwrite)
5545
+ elif isinstance(row, str) and row.lower() == "all" and isinstance(column, int):
5546
+ for r_ in range(self.MT.total_data_rows()):
5547
+ add_highlight(self.MT.cell_options, (r_, column), bg, fg, None, overwrite)
5503
5548
  elif isinstance(column, str) and column.lower() == "all" and isinstance(row, int):
5504
- riter = (row,)
5505
- citer = range(self.MT.total_data_cols())
5549
+ for c_ in range(self.MT.total_data_cols()):
5550
+ add_highlight(self.MT.cell_options, (row, c_), bg, fg, None, overwrite)
5506
5551
  elif isinstance(row, int) and isinstance(column, int):
5507
- riter = (row,)
5508
- citer = (column,)
5509
- for r_ in riter:
5510
- for c_ in citer:
5511
- add_highlight(self.MT.cell_options, (r_, c_), bg, fg, None, overwrite)
5552
+ add_highlight(self.MT.cell_options, (row, column), bg, fg, None, overwrite)
5512
5553
  elif canvas in ("row_index", "index"):
5513
- iterable = (
5514
- cells if (cells and not isinstance(cells, int)) else (cells,) if isinstance(cells, int) else (row,)
5515
- )
5516
- for r_ in iterable:
5517
- add_highlight(self.RI.cell_options, r_, bg, fg, None, overwrite)
5554
+ if isinstance(cells, int):
5555
+ add_highlight(self.RI.cell_options, cells, bg, fg, None, overwrite)
5556
+ elif cells:
5557
+ for r_ in cells:
5558
+ add_highlight(self.RI.cell_options, r_, bg, fg, None, overwrite)
5559
+ else:
5560
+ add_highlight(self.RI.cell_options, row, bg, fg, None, overwrite)
5518
5561
  elif canvas == "header":
5519
- iterable = (
5520
- cells if (cells and not isinstance(cells, int)) else (cells,) if isinstance(cells, int) else (column,)
5521
- )
5522
- for c_ in iterable:
5523
- add_highlight(self.CH.cell_options, c_, bg, fg, None, overwrite)
5524
- self.set_refresh_timer(redraw)
5562
+ if isinstance(cells, int):
5563
+ add_highlight(self.CH.cell_options, cells, bg, fg, None, overwrite)
5564
+ elif cells:
5565
+ for c_ in cells:
5566
+ add_highlight(self.CH.cell_options, c_, bg, fg, None, overwrite)
5567
+ else:
5568
+ add_highlight(self.CH.cell_options, column, bg, fg, None, overwrite)
5569
+ return self.set_refresh_timer(redraw)
5525
5570
 
5526
5571
  def dehighlight_cells(
5527
5572
  self,
@@ -5531,7 +5576,7 @@ class Sheet(tk.Frame):
5531
5576
  canvas: Literal["table", "row_index", "header"] = "table",
5532
5577
  all_: bool = False,
5533
5578
  redraw: bool = True,
5534
- ) -> None:
5579
+ ) -> Sheet:
5535
5580
  if row == "all" and canvas == "table":
5536
5581
  for k, v in self.MT.cell_options.items():
5537
5582
  if "highlight" in v:
@@ -5550,7 +5595,7 @@ class Sheet(tk.Frame):
5550
5595
  try:
5551
5596
  del self.MT.cell_options[t]["highlight"]
5552
5597
  except Exception:
5553
- pass
5598
+ continue
5554
5599
  elif not all_:
5555
5600
  if (
5556
5601
  row,
@@ -5567,7 +5612,7 @@ class Sheet(tk.Frame):
5567
5612
  try:
5568
5613
  del self.RI.cell_options[r]["highlight"]
5569
5614
  except Exception:
5570
- pass
5615
+ continue
5571
5616
  elif not all_:
5572
5617
  if row in self.RI.cell_options and "highlight" in self.RI.cell_options[row]:
5573
5618
  del self.RI.cell_options[row]["highlight"]
@@ -5581,7 +5626,7 @@ class Sheet(tk.Frame):
5581
5626
  try:
5582
5627
  del self.CH.cell_options[c]["highlight"]
5583
5628
  except Exception:
5584
- pass
5629
+ continue
5585
5630
  elif not all_:
5586
5631
  if column in self.CH.cell_options and "highlight" in self.CH.cell_options[column]:
5587
5632
  del self.CH.cell_options[column]["highlight"]
@@ -5589,7 +5634,7 @@ class Sheet(tk.Frame):
5589
5634
  for c in self.CH.cell_options:
5590
5635
  if "highlight" in self.CH.cell_options[c]:
5591
5636
  del self.CH.cell_options[c]["highlight"]
5592
- self.set_refresh_timer(redraw)
5637
+ return self.set_refresh_timer(redraw)
5593
5638
 
5594
5639
  def get_highlighted_cells(self, canvas: str = "table") -> dict | None:
5595
5640
  if canvas == "table":
@@ -5606,7 +5651,7 @@ class Sheet(tk.Frame):
5606
5651
  cells: list = [],
5607
5652
  align: str | None = "global",
5608
5653
  redraw: bool = True,
5609
- ) -> None:
5654
+ ) -> Sheet:
5610
5655
  if isinstance(cells, dict):
5611
5656
  for k, v in cells.items():
5612
5657
  set_align(self.MT.cell_options, k, convert_align(v))
@@ -5616,7 +5661,7 @@ class Sheet(tk.Frame):
5616
5661
  set_align(self.MT.cell_options, k, align)
5617
5662
  else:
5618
5663
  set_align(self.MT.cell_options, (row, column), convert_align(align))
5619
- self.set_refresh_timer(redraw)
5664
+ return self.set_refresh_timer(redraw)
5620
5665
 
5621
5666
  def align_rows(
5622
5667
  self,
@@ -5624,7 +5669,7 @@ class Sheet(tk.Frame):
5624
5669
  align: str | None = "global",
5625
5670
  align_index: bool = False,
5626
5671
  redraw: bool = True,
5627
- ) -> None:
5672
+ ) -> Sheet:
5628
5673
  if isinstance(rows, dict):
5629
5674
  for k, v in rows.items():
5630
5675
  align = convert_align(v)
@@ -5641,7 +5686,7 @@ class Sheet(tk.Frame):
5641
5686
  set_align(self.MT.row_options, rows, convert_align(align))
5642
5687
  if align_index:
5643
5688
  set_align(self.RI.cell_options, rows, align)
5644
- self.set_refresh_timer(redraw)
5689
+ return self.set_refresh_timer(redraw)
5645
5690
 
5646
5691
  def align_columns(
5647
5692
  self,
@@ -5649,7 +5694,7 @@ class Sheet(tk.Frame):
5649
5694
  align: str | None = "global",
5650
5695
  align_header: bool = False,
5651
5696
  redraw: bool = True,
5652
- ) -> None:
5697
+ ) -> Sheet:
5653
5698
  if isinstance(columns, dict):
5654
5699
  for k, v in columns.items():
5655
5700
  align = convert_align(v)
@@ -5666,14 +5711,14 @@ class Sheet(tk.Frame):
5666
5711
  set_align(self.MT.col_options, columns, convert_align(align))
5667
5712
  if align_header:
5668
5713
  set_align(self.CH.cell_options, columns, align)
5669
- self.set_refresh_timer(redraw)
5714
+ return self.set_refresh_timer(redraw)
5670
5715
 
5671
5716
  def align_header(
5672
5717
  self,
5673
5718
  columns: list | dict | int = [],
5674
5719
  align: str | None = "global",
5675
5720
  redraw: bool = True,
5676
- ) -> None:
5721
+ ) -> Sheet:
5677
5722
  if isinstance(columns, dict):
5678
5723
  for k, v in columns.items():
5679
5724
  set_align(self.CH.cell_options, k, convert_align(v))
@@ -5683,14 +5728,14 @@ class Sheet(tk.Frame):
5683
5728
  set_align(self.CH.cell_options, k, align)
5684
5729
  elif isinstance(columns, int):
5685
5730
  set_align(self.CH.cell_options, columns, convert_align(align))
5686
- self.set_refresh_timer(redraw)
5731
+ return self.set_refresh_timer(redraw)
5687
5732
 
5688
5733
  def align_index(
5689
5734
  self,
5690
5735
  rows: list | dict | int = [],
5691
5736
  align: str | None = "global",
5692
5737
  redraw: bool = True,
5693
- ) -> None:
5738
+ ) -> Sheet:
5694
5739
  if isinstance(rows, dict):
5695
5740
  for k, v in rows.items():
5696
5741
  set_align(self.RI.cell_options, k, convert_align(v))
@@ -5700,7 +5745,7 @@ class Sheet(tk.Frame):
5700
5745
  set_align(self.RI.cell_options, k, align)
5701
5746
  elif isinstance(rows, int):
5702
5747
  set_align(self.RI.cell_options, rows, convert_align(align))
5703
- self.set_refresh_timer(redraw)
5748
+ return self.set_refresh_timer(redraw)
5704
5749
 
5705
5750
  def get_cell_alignments(self) -> dict:
5706
5751
  return {(r, c): v["align"] for (r, c), v in self.MT.cell_options.items() if "align" in v}
@@ -5944,10 +5989,16 @@ class Sheet(tk.Frame):
5944
5989
  c: int | Literal["all"] = 0,
5945
5990
  *args,
5946
5991
  **kwargs,
5947
- ) -> None:
5992
+ ) -> Sheet:
5948
5993
  kwargs = get_dropdown_kwargs(*args, **kwargs)
5949
5994
  d = get_dropdown_dict(**kwargs)
5950
- v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
5995
+ if kwargs["set_value"] is None:
5996
+ if kwargs["values"] and (v := self.MT.get_cell_data(r, c)) not in kwargs["values"]:
5997
+ v = kwargs["values"][0]
5998
+ else:
5999
+ v == ""
6000
+ else:
6001
+ v = kwargs["set_value"]
5951
6002
  if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
5952
6003
  for r_ in range(self.MT.total_data_rows()):
5953
6004
  self._create_dropdown(r_, c, v, d)
@@ -5961,7 +6012,7 @@ class Sheet(tk.Frame):
5961
6012
  self._create_dropdown(r_, c_, v, d)
5962
6013
  elif isinstance(r, int) and isinstance(c, int):
5963
6014
  self._create_dropdown(r, c, v, d)
5964
- self.set_refresh_timer(kwargs["redraw"])
6015
+ return self.set_refresh_timer(kwargs["redraw"])
5965
6016
 
5966
6017
  def _create_dropdown(self, r: int, c: int, v: object, d: dict) -> None:
5967
6018
  self.del_cell_options_dropdown_and_checkbox(r, c)
@@ -5974,15 +6025,15 @@ class Sheet(tk.Frame):
5974
6025
  c: int | Literal["all"] = 0,
5975
6026
  *args,
5976
6027
  **kwargs,
5977
- ) -> None:
5978
- self.create_dropdown(r=r, c=c, **get_dropdown_kwargs(*args, **kwargs))
6028
+ ) -> Sheet:
6029
+ return self.create_dropdown(r=r, c=c, **get_dropdown_kwargs(*args, **kwargs))
5979
6030
 
5980
6031
  def dropdown_row(
5981
6032
  self,
5982
6033
  r: Iterator[int] | int | Literal["all"] = 0,
5983
6034
  *args,
5984
6035
  **kwargs,
5985
- ) -> None:
6036
+ ) -> Sheet:
5986
6037
  kwargs = get_dropdown_kwargs(*args, **kwargs)
5987
6038
  d = get_dropdown_dict(**kwargs)
5988
6039
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -5994,7 +6045,7 @@ class Sheet(tk.Frame):
5994
6045
  elif is_iterable(r):
5995
6046
  for r_ in r:
5996
6047
  self._dropdown_row(r_, v, d)
5997
- self.set_refresh_timer(kwargs["redraw"])
6048
+ return self.set_refresh_timer(kwargs["redraw"])
5998
6049
 
5999
6050
  def _dropdown_row(self, r: int, v: object, d: dict) -> None:
6000
6051
  self.del_row_options_dropdown_and_checkbox(r)
@@ -6007,7 +6058,7 @@ class Sheet(tk.Frame):
6007
6058
  c: Iterator[int] | int | Literal["all"] = 0,
6008
6059
  *args,
6009
6060
  **kwargs,
6010
- ) -> None:
6061
+ ) -> Sheet:
6011
6062
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6012
6063
  d = get_dropdown_dict(**kwargs)
6013
6064
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -6019,7 +6070,7 @@ class Sheet(tk.Frame):
6019
6070
  elif is_iterable(c):
6020
6071
  for c_ in c:
6021
6072
  self._dropdown_column(c_, v, d)
6022
- self.set_refresh_timer(kwargs["redraw"])
6073
+ return self.set_refresh_timer(kwargs["redraw"])
6023
6074
 
6024
6075
  def _dropdown_column(self, c: int, v: object, d: dict) -> None:
6025
6076
  self.del_column_options_dropdown_and_checkbox(c)
@@ -6032,7 +6083,7 @@ class Sheet(tk.Frame):
6032
6083
  c: Iterator[int] | int | Literal["all"] = 0,
6033
6084
  *args,
6034
6085
  **kwargs,
6035
- ) -> None:
6086
+ ) -> Sheet:
6036
6087
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6037
6088
  d = get_dropdown_dict(**kwargs)
6038
6089
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -6044,7 +6095,7 @@ class Sheet(tk.Frame):
6044
6095
  elif is_iterable(c):
6045
6096
  for c_ in c:
6046
6097
  self._create_header_dropdown(c_, v, d)
6047
- self.set_refresh_timer(kwargs["redraw"])
6098
+ return self.set_refresh_timer(kwargs["redraw"])
6048
6099
 
6049
6100
  def _create_header_dropdown(self, c: int, v: object, d: dict) -> None:
6050
6101
  self.del_header_cell_options_dropdown_and_checkbox(c)
@@ -6056,7 +6107,7 @@ class Sheet(tk.Frame):
6056
6107
  r: Iterator[int] | int | Literal["all"] = 0,
6057
6108
  *args,
6058
6109
  **kwargs,
6059
- ) -> None:
6110
+ ) -> Sheet:
6060
6111
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6061
6112
  d = get_dropdown_dict(**kwargs)
6062
6113
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -6068,7 +6119,7 @@ class Sheet(tk.Frame):
6068
6119
  elif is_iterable(r):
6069
6120
  for r_ in r:
6070
6121
  self._create_index_dropdown(r_, v, d)
6071
- self.set_refresh_timer(kwargs["redraw"])
6122
+ return self.set_refresh_timer(kwargs["redraw"])
6072
6123
 
6073
6124
  def _create_index_dropdown(self, r: int, v: object, d: dict) -> None:
6074
6125
  self.del_index_cell_options_dropdown_and_checkbox(r)
@@ -6327,7 +6378,7 @@ class Sheet(tk.Frame):
6327
6378
  formatter_class: object = None,
6328
6379
  redraw: bool = True,
6329
6380
  **kwargs,
6330
- ) -> None:
6381
+ ) -> Sheet:
6331
6382
  kwargs = fix_format_kwargs({"formatter": formatter_class, **formatter_options, **kwargs})
6332
6383
  if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
6333
6384
  for r_ in range(self.MT.total_data_rows()):
@@ -6341,7 +6392,7 @@ class Sheet(tk.Frame):
6341
6392
  self._format_cell(r_, c_, kwargs)
6342
6393
  else:
6343
6394
  self._format_cell(r, c, kwargs)
6344
- self.set_refresh_timer(redraw)
6395
+ return self.set_refresh_timer(redraw)
6345
6396
 
6346
6397
  def _format_cell(self, r: int, c: int, d: dict) -> None:
6347
6398
  v = d["value"] if "value" in d else self.MT.get_cell_data(r, c)
@@ -6354,7 +6405,7 @@ class Sheet(tk.Frame):
6354
6405
  r: Literal["all"] | int = "all",
6355
6406
  c: Literal["all"] | int = "all",
6356
6407
  clear_values: bool = False,
6357
- ) -> None:
6408
+ ) -> Sheet:
6358
6409
  if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
6359
6410
  for r_, c_ in self.MT.cell_options:
6360
6411
  if "format" in self.MT.cell_options[(r_, c)]:
@@ -6369,6 +6420,7 @@ class Sheet(tk.Frame):
6369
6420
  self.MT.delete_cell_format(r_, c_, clear_values=clear_values)
6370
6421
  else:
6371
6422
  self.MT.delete_cell_format(r, c, clear_values=clear_values)
6423
+ return self
6372
6424
 
6373
6425
  def format_row(
6374
6426
  self,
@@ -6377,7 +6429,7 @@ class Sheet(tk.Frame):
6377
6429
  formatter_class: object = None,
6378
6430
  redraw: bool = True,
6379
6431
  **kwargs,
6380
- ) -> None:
6432
+ ) -> Sheet:
6381
6433
  kwargs = fix_format_kwargs({"formatter": formatter_class, **formatter_options, **kwargs})
6382
6434
  if isinstance(r, str) and r.lower() == "all":
6383
6435
  for r_ in range(len(self.MT.data)):
@@ -6387,7 +6439,7 @@ class Sheet(tk.Frame):
6387
6439
  self._format_row(r_, kwargs)
6388
6440
  else:
6389
6441
  self._format_row(r, kwargs)
6390
- self.set_refresh_timer(redraw)
6442
+ return self.set_refresh_timer(redraw)
6391
6443
 
6392
6444
  def _format_row(self, r: int, d: dict) -> None:
6393
6445
  self.del_row_options_checkbox(r)
@@ -6404,12 +6456,13 @@ class Sheet(tk.Frame):
6404
6456
  self,
6405
6457
  r: Iterator[int] | int | Literal["all"] = "all",
6406
6458
  clear_values: bool = False,
6407
- ) -> None:
6459
+ ) -> Sheet:
6408
6460
  if is_iterable(r):
6409
6461
  for r_ in r:
6410
6462
  self.MT.delete_row_format(r_, clear_values=clear_values)
6411
6463
  else:
6412
6464
  self.MT.delete_row_format(r, clear_values=clear_values)
6465
+ return self
6413
6466
 
6414
6467
  def format_column(
6415
6468
  self,
@@ -6418,7 +6471,7 @@ class Sheet(tk.Frame):
6418
6471
  formatter_class: object = None,
6419
6472
  redraw: bool = True,
6420
6473
  **kwargs,
6421
- ) -> None:
6474
+ ) -> Sheet:
6422
6475
  kwargs = fix_format_kwargs({"formatter": formatter_class, **formatter_options, **kwargs})
6423
6476
  if isinstance(c, str) and c.lower() == "all":
6424
6477
  for c_ in range(self.MT.total_data_cols()):
@@ -6428,7 +6481,7 @@ class Sheet(tk.Frame):
6428
6481
  self._format_column(c_, kwargs)
6429
6482
  else:
6430
6483
  self._format_column(c, kwargs)
6431
- self.set_refresh_timer(redraw)
6484
+ return self.set_refresh_timer(redraw)
6432
6485
 
6433
6486
  def _format_column(self, c: int, d: dict) -> None:
6434
6487
  self.del_column_options_checkbox(c)
@@ -6445,12 +6498,13 @@ class Sheet(tk.Frame):
6445
6498
  self,
6446
6499
  c: Iterator[int] | int | Literal["all"] = "all",
6447
6500
  clear_values: bool = False,
6448
- ) -> None:
6501
+ ) -> Sheet:
6449
6502
  if is_iterable(c):
6450
6503
  for c_ in c:
6451
6504
  self.MT.delete_column_format(c_, clear_values=clear_values)
6452
6505
  else:
6453
6506
  self.MT.delete_column_format(c, clear_values=clear_values)
6507
+ return self
6454
6508
 
6455
6509
 
6456
6510
  class Dropdown(Sheet):
@@ -6479,6 +6533,7 @@ class Dropdown(Sheet):
6479
6533
  Sheet.__init__(
6480
6534
  self,
6481
6535
  parent=parent,
6536
+ name="!SheetDropdown",
6482
6537
  outline_thickness=outline_thickness,
6483
6538
  show_horizontal_grid=True,
6484
6539
  show_vertical_grid=False,
@@ -6491,6 +6546,7 @@ class Dropdown(Sheet):
6491
6546
  horizontal_grid_to_end_of_window=True,
6492
6547
  set_cell_sizes_on_zoom=True,
6493
6548
  show_selected_cells_border=False,
6549
+ scrollbar_show_arrows=False,
6494
6550
  )
6495
6551
  self.parent = parent
6496
6552
  self.close_dropdown_window = close_dropdown_window
@@ -6623,4 +6679,4 @@ class Dropdown(Sheet):
6623
6679
  redraw=False,
6624
6680
  verify=False,
6625
6681
  )
6626
- self.set_all_cell_sizes_to_text(redraw=redraw, width=width)
6682
+ self.set_all_cell_sizes_to_text(redraw=redraw, width=width, slim=True)