tksheet 7.1.21__py3-none-any.whl → 7.1.23__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
+ {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,51 +4579,82 @@ 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(rn for rn in self.MT.displayed_rows if self.MT._row_index[rn].parent),
4558
4589
  redraw=False,
4559
4590
  deselect_all=False,
4560
4591
  data_indexes=True,
4561
4592
  )
4562
- self.show_rows(
4563
- (self.RI.tree_rns[iid] for iid in self.get_children("")),
4564
- redraw=False,
4565
- deselect_all=True,
4566
- )
4567
4593
  open_ids = set(filter(self.exists, map(str.lower, open_ids)))
4568
- self.RI.tree_open_ids = open_ids
4594
+ self.RI.tree_open_ids = set()
4569
4595
  if open_ids:
4570
- self.tree_open(open_ids)
4571
- return self
4596
+ to_open = self._tree_open(open_ids)
4597
+ self.show_rows(
4598
+ rows=to_open,
4599
+ redraw=False,
4600
+ deselect_all=False,
4601
+ )
4602
+ return self.set_refresh_timer(True)
4603
+
4604
+ def _tree_open(self, items: set[str]) -> list[int]:
4605
+ """
4606
+ Only meant for internal use
4607
+ """
4608
+ to_open = []
4609
+ for item in filter(items.__contains__, self.get_children()):
4610
+ if self.RI.tree[item].children:
4611
+ self.RI.tree_open_ids.add(item)
4612
+ to_open.extend(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True))
4613
+ return to_open
4572
4614
 
4573
- def tree_open(self, *items) -> Sheet:
4615
+ def tree_open(self, *items, redraw: bool = True) -> Sheet:
4574
4616
  """
4575
4617
  If used without args all items are opened
4576
4618
  """
4577
4619
  if items := set(unpack(items)):
4578
- for item in filter(items.__contains__, self.get_children()):
4579
- self.item(item, open_=True)
4620
+ to_open = self._tree_open(items)
4580
4621
  else:
4622
+ to_open = []
4581
4623
  for item in self.get_children():
4582
- self.item(item, open_=True)
4583
- return self
4624
+ if self.RI.tree[item].children:
4625
+ self.RI.tree_open_ids.add(item)
4626
+ to_open.extend(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True))
4627
+ return self.show_rows(
4628
+ rows=to_open,
4629
+ redraw=redraw,
4630
+ deselect_all=False,
4631
+ )
4584
4632
 
4585
- def tree_close(self, *items) -> Sheet:
4633
+ def tree_close(self, *items, redraw: bool = True) -> Sheet:
4586
4634
  """
4587
4635
  If used without args all items are closed
4588
4636
  """
4637
+ to_close = set()
4589
4638
  if items:
4590
4639
  for item in unpack(items):
4591
- self.item(item, open_=False)
4640
+ if self.RI.tree[item].children:
4641
+ self.RI.tree_open_ids.discard(item)
4642
+ if self.RI.tree_rns[item] in self.MT.displayed_rows:
4643
+ for did in self.RI.get_iid_descendants(item, check_open=True):
4644
+ to_close.add(self.RI.tree_rns[did])
4592
4645
  else:
4593
4646
  for item in self.get_children():
4594
- self.item(item, open_=False)
4595
- return self
4647
+ if self.RI.tree[item].children:
4648
+ self.RI.tree_open_ids.discard(item)
4649
+ if self.RI.tree_rns[item] in self.MT.displayed_rows:
4650
+ for did in self.RI.get_iid_descendants(item, check_open=True):
4651
+ to_close.add(self.RI.tree_rns[did])
4652
+ return self.hide_rows(
4653
+ rows=to_close,
4654
+ redraw=redraw,
4655
+ deselect_all=False,
4656
+ data_indexes=True,
4657
+ )
4596
4658
 
4597
4659
  def insert(
4598
4660
  self,
@@ -4720,12 +4782,12 @@ class Sheet(tk.Frame):
4720
4782
  raise ValueError(f"item '{item.lower()}' does not exist.")
4721
4783
 
4722
4784
  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:
4785
+ try:
4786
+ if data_index:
4727
4787
  return self.MT._row_index[row].iid
4728
- return None
4788
+ return self.MT._row_index[self.MT.displayed_rows[row]].iid
4789
+ except Exception:
4790
+ return None
4729
4791
 
4730
4792
  def get_children(self, item: None | str = None) -> Generator[str]:
4731
4793
  if item is None:
@@ -4954,12 +5016,14 @@ class Sheet(tk.Frame):
4954
5016
 
4955
5017
  # Functions not in docs
4956
5018
 
5019
+ def event_generate(self, *args, **kwargs):
5020
+ self.MT.event_generate(*args, **kwargs)
5021
+
4957
5022
  def emit_event(
4958
5023
  self,
4959
5024
  event: str,
4960
- data: None | dict = None,
5025
+ data: EventDataDict | None = None,
4961
5026
  ) -> None:
4962
- # data is a EventDataDict
4963
5027
  if data is None:
4964
5028
  data = EventDataDict()
4965
5029
  data["sheetname"] = self.name
@@ -4967,9 +5031,10 @@ class Sheet(tk.Frame):
4967
5031
  for func in self.bound_events[event]:
4968
5032
  func(data)
4969
5033
 
4970
- def set_refresh_timer(self, redraw: bool = True) -> None:
5034
+ def set_refresh_timer(self, redraw: bool = True) -> Sheet:
4971
5035
  if redraw and self.after_redraw_id is None:
4972
5036
  self.after_redraw_id = self.after(self.after_redraw_time_ms, self.after_redraw)
5037
+ return self
4973
5038
 
4974
5039
  def after_redraw(self) -> None:
4975
5040
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
@@ -5218,7 +5283,7 @@ class Sheet(tk.Frame):
5218
5283
  reset_col_positions: bool = True,
5219
5284
  reset_row_positions: bool = True,
5220
5285
  redraw: bool = True,
5221
- ):
5286
+ ) -> object:
5222
5287
  self.set_refresh_timer(redraw)
5223
5288
  return self.MT.data_reference(newdataref, reset_col_positions, reset_row_positions)
5224
5289
 
@@ -5229,11 +5294,11 @@ class Sheet(tk.Frame):
5229
5294
  value: object = "",
5230
5295
  redraw: bool = True,
5231
5296
  keep_formatting: bool = True,
5232
- ) -> None:
5297
+ ) -> Sheet:
5233
5298
  if not keep_formatting:
5234
5299
  self.MT.delete_cell_format(r, c, clear_values=False)
5235
5300
  self.MT.set_cell_data(r, c, value)
5236
- self.set_refresh_timer(redraw)
5301
+ return self.set_refresh_timer(redraw)
5237
5302
 
5238
5303
  def set_row_data(
5239
5304
  self,
@@ -5242,7 +5307,7 @@ class Sheet(tk.Frame):
5242
5307
  add_columns: bool = True,
5243
5308
  redraw: bool = True,
5244
5309
  keep_formatting: bool = True,
5245
- ) -> None:
5310
+ ) -> Sheet:
5246
5311
  if r >= len(self.MT.data):
5247
5312
  raise Exception("Row number is out of range")
5248
5313
  if not keep_formatting:
@@ -5265,7 +5330,7 @@ class Sheet(tk.Frame):
5265
5330
  self.MT.data[r].append(v)
5266
5331
  else:
5267
5332
  self.set_cell_data(r=r, c=c, value=v, redraw=False, keep_formatting=keep_formatting)
5268
- self.set_refresh_timer(redraw)
5333
+ return self.set_refresh_timer(redraw)
5269
5334
 
5270
5335
  def set_column_data(
5271
5336
  self,
@@ -5274,7 +5339,7 @@ class Sheet(tk.Frame):
5274
5339
  add_rows: bool = True,
5275
5340
  redraw: bool = True,
5276
5341
  keep_formatting: bool = True,
5277
- ) -> None:
5342
+ ) -> Sheet:
5278
5343
  if not keep_formatting:
5279
5344
  self.MT.delete_column_format(c, clear_values=False)
5280
5345
  if add_rows:
@@ -5297,14 +5362,14 @@ class Sheet(tk.Frame):
5297
5362
  if c >= len(self.MT.data[rn]):
5298
5363
  self.MT.fix_row_len(rn, c)
5299
5364
  self.set_cell_data(r=rn, c=c, value=v, redraw=False, keep_formatting=keep_formatting)
5300
- self.set_refresh_timer(redraw)
5365
+ return self.set_refresh_timer(redraw)
5301
5366
 
5302
5367
  def readonly_rows(
5303
5368
  self,
5304
5369
  rows: list | int = [],
5305
5370
  readonly: bool = True,
5306
5371
  redraw: bool = False,
5307
- ) -> None:
5372
+ ) -> Sheet:
5308
5373
  if isinstance(rows, int):
5309
5374
  rows = [rows]
5310
5375
  else:
@@ -5318,14 +5383,14 @@ class Sheet(tk.Frame):
5318
5383
  if r not in self.MT.row_options:
5319
5384
  self.MT.row_options[r] = {}
5320
5385
  self.MT.row_options[r]["readonly"] = True
5321
- self.set_refresh_timer(redraw)
5386
+ return self.set_refresh_timer(redraw)
5322
5387
 
5323
5388
  def readonly_columns(
5324
5389
  self,
5325
5390
  columns: list | int = [],
5326
5391
  readonly: bool = True,
5327
5392
  redraw: bool = False,
5328
- ) -> None:
5393
+ ) -> Sheet:
5329
5394
  if isinstance(columns, int):
5330
5395
  columns = [columns]
5331
5396
  else:
@@ -5339,7 +5404,7 @@ class Sheet(tk.Frame):
5339
5404
  if c not in self.MT.col_options:
5340
5405
  self.MT.col_options[c] = {}
5341
5406
  self.MT.col_options[c]["readonly"] = True
5342
- self.set_refresh_timer(redraw)
5407
+ return self.set_refresh_timer(redraw)
5343
5408
 
5344
5409
  def readonly_cells(
5345
5410
  self,
@@ -5348,7 +5413,7 @@ class Sheet(tk.Frame):
5348
5413
  cells: list = [],
5349
5414
  readonly: bool = True,
5350
5415
  redraw: bool = False,
5351
- ) -> None:
5416
+ ) -> Sheet:
5352
5417
  if not readonly:
5353
5418
  if cells:
5354
5419
  for r, c in cells:
@@ -5370,31 +5435,31 @@ class Sheet(tk.Frame):
5370
5435
  if (row, column) not in self.MT.cell_options:
5371
5436
  self.MT.cell_options[(row, column)] = {}
5372
5437
  self.MT.cell_options[(row, column)]["readonly"] = True
5373
- self.set_refresh_timer(redraw)
5438
+ return self.set_refresh_timer(redraw)
5374
5439
 
5375
5440
  def readonly_header(
5376
5441
  self,
5377
5442
  columns: list = [],
5378
5443
  readonly: bool = True,
5379
5444
  redraw: bool = False,
5380
- ) -> None:
5445
+ ) -> Sheet:
5381
5446
  self.CH.readonly_header(columns=columns, readonly=readonly)
5382
- self.set_refresh_timer(redraw)
5447
+ return self.set_refresh_timer(redraw)
5383
5448
 
5384
5449
  def readonly_index(
5385
5450
  self,
5386
5451
  rows: list = [],
5387
5452
  readonly: bool = True,
5388
5453
  redraw: bool = False,
5389
- ) -> None:
5454
+ ) -> Sheet:
5390
5455
  self.RI.readonly_index(rows=rows, readonly=readonly)
5391
- self.set_refresh_timer(redraw)
5456
+ return self.set_refresh_timer(redraw)
5392
5457
 
5393
5458
  def dehighlight_rows(
5394
5459
  self,
5395
5460
  rows: list[int] | Literal["all"] = [],
5396
5461
  redraw: bool = True,
5397
- ) -> None:
5462
+ ) -> Sheet:
5398
5463
  if isinstance(rows, int):
5399
5464
  rows = [rows]
5400
5465
  if not rows or rows == "all":
@@ -5415,13 +5480,13 @@ class Sheet(tk.Frame):
5415
5480
  del self.RI.cell_options[r]["highlight"]
5416
5481
  except Exception:
5417
5482
  pass
5418
- self.set_refresh_timer(redraw)
5483
+ return self.set_refresh_timer(redraw)
5419
5484
 
5420
5485
  def dehighlight_columns(
5421
5486
  self,
5422
5487
  columns: list[int] | Literal["all"] = [],
5423
5488
  redraw: bool = True,
5424
- ) -> None:
5489
+ ) -> Sheet:
5425
5490
  if isinstance(columns, int):
5426
5491
  columns = [columns]
5427
5492
  if not columns or columns == "all":
@@ -5442,7 +5507,7 @@ class Sheet(tk.Frame):
5442
5507
  del self.CH.cell_options[c]["highlight"]
5443
5508
  except Exception:
5444
5509
  pass
5445
- self.set_refresh_timer(redraw)
5510
+ return self.set_refresh_timer(redraw)
5446
5511
 
5447
5512
  def highlight_rows(
5448
5513
  self,
@@ -5453,14 +5518,14 @@ class Sheet(tk.Frame):
5453
5518
  redraw: bool = True,
5454
5519
  end_of_screen: bool = False,
5455
5520
  overwrite: bool = True,
5456
- ) -> None:
5521
+ ) -> Sheet:
5457
5522
  if bg is None and fg is None:
5458
5523
  return
5459
5524
  for r in (rows,) if isinstance(rows, int) else rows:
5460
5525
  add_highlight(self.MT.row_options, r, bg, fg, end_of_screen, overwrite)
5461
5526
  if highlight_index:
5462
5527
  self.highlight_cells(cells=rows, canvas="index", bg=bg, fg=fg, redraw=False)
5463
- self.set_refresh_timer(redraw)
5528
+ return self.set_refresh_timer(redraw)
5464
5529
 
5465
5530
  def highlight_columns(
5466
5531
  self,
@@ -5470,26 +5535,26 @@ class Sheet(tk.Frame):
5470
5535
  highlight_header: bool = True,
5471
5536
  redraw: bool = True,
5472
5537
  overwrite: bool = True,
5473
- ) -> None:
5538
+ ) -> Sheet:
5474
5539
  if bg is False and fg is False:
5475
5540
  return
5476
5541
  for c in (columns,) if isinstance(columns, int) else columns:
5477
5542
  add_highlight(self.MT.col_options, c, bg, fg, None, overwrite)
5478
5543
  if highlight_header:
5479
5544
  self.highlight_cells(cells=columns, canvas="header", bg=bg, fg=fg, redraw=False)
5480
- self.set_refresh_timer(redraw)
5545
+ return self.set_refresh_timer(redraw)
5481
5546
 
5482
5547
  def highlight_cells(
5483
5548
  self,
5484
- row: int = 0,
5485
- column: int = 0,
5486
- cells: list = [],
5549
+ row: int | Literal["all"] = 0,
5550
+ column: int | Literal["all"] = 0,
5551
+ cells: list[tuple[int, int]] = [],
5487
5552
  canvas: Literal["table", "index", "header"] = "table",
5488
5553
  bg: bool | None | str = False,
5489
5554
  fg: bool | None | str = False,
5490
5555
  redraw: bool = True,
5491
5556
  overwrite: bool = True,
5492
- ) -> None:
5557
+ ) -> Sheet:
5493
5558
  if bg is False and fg is False:
5494
5559
  return
5495
5560
  if canvas == "table":
@@ -5497,31 +5562,41 @@ class Sheet(tk.Frame):
5497
5562
  for r_, c_ in cells:
5498
5563
  add_highlight(self.MT.cell_options, (r_, c_), bg, fg, None, overwrite)
5499
5564
  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,)
5565
+ if (
5566
+ isinstance(row, str)
5567
+ and row.lower() == "all"
5568
+ and isinstance(column, str)
5569
+ and column.lower() == "all"
5570
+ ):
5571
+ totalrows, totalcols = self.MT.total_data_rows(), self.MT.total_data_cols()
5572
+ for r_ in range(totalrows):
5573
+ for c_ in range(totalcols):
5574
+ add_highlight(self.MT.cell_options, (r_, c_), bg, fg, None, overwrite)
5575
+ elif isinstance(row, str) and row.lower() == "all" and isinstance(column, int):
5576
+ for r_ in range(self.MT.total_data_rows()):
5577
+ add_highlight(self.MT.cell_options, (r_, column), bg, fg, None, overwrite)
5503
5578
  elif isinstance(column, str) and column.lower() == "all" and isinstance(row, int):
5504
- riter = (row,)
5505
- citer = range(self.MT.total_data_cols())
5579
+ for c_ in range(self.MT.total_data_cols()):
5580
+ add_highlight(self.MT.cell_options, (row, c_), bg, fg, None, overwrite)
5506
5581
  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)
5582
+ add_highlight(self.MT.cell_options, (row, column), bg, fg, None, overwrite)
5512
5583
  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)
5584
+ if isinstance(cells, int):
5585
+ add_highlight(self.RI.cell_options, cells, bg, fg, None, overwrite)
5586
+ elif cells:
5587
+ for r_ in cells:
5588
+ add_highlight(self.RI.cell_options, r_, bg, fg, None, overwrite)
5589
+ else:
5590
+ add_highlight(self.RI.cell_options, row, bg, fg, None, overwrite)
5518
5591
  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)
5592
+ if isinstance(cells, int):
5593
+ add_highlight(self.CH.cell_options, cells, bg, fg, None, overwrite)
5594
+ elif cells:
5595
+ for c_ in cells:
5596
+ add_highlight(self.CH.cell_options, c_, bg, fg, None, overwrite)
5597
+ else:
5598
+ add_highlight(self.CH.cell_options, column, bg, fg, None, overwrite)
5599
+ return self.set_refresh_timer(redraw)
5525
5600
 
5526
5601
  def dehighlight_cells(
5527
5602
  self,
@@ -5531,7 +5606,7 @@ class Sheet(tk.Frame):
5531
5606
  canvas: Literal["table", "row_index", "header"] = "table",
5532
5607
  all_: bool = False,
5533
5608
  redraw: bool = True,
5534
- ) -> None:
5609
+ ) -> Sheet:
5535
5610
  if row == "all" and canvas == "table":
5536
5611
  for k, v in self.MT.cell_options.items():
5537
5612
  if "highlight" in v:
@@ -5550,7 +5625,7 @@ class Sheet(tk.Frame):
5550
5625
  try:
5551
5626
  del self.MT.cell_options[t]["highlight"]
5552
5627
  except Exception:
5553
- pass
5628
+ continue
5554
5629
  elif not all_:
5555
5630
  if (
5556
5631
  row,
@@ -5567,7 +5642,7 @@ class Sheet(tk.Frame):
5567
5642
  try:
5568
5643
  del self.RI.cell_options[r]["highlight"]
5569
5644
  except Exception:
5570
- pass
5645
+ continue
5571
5646
  elif not all_:
5572
5647
  if row in self.RI.cell_options and "highlight" in self.RI.cell_options[row]:
5573
5648
  del self.RI.cell_options[row]["highlight"]
@@ -5581,7 +5656,7 @@ class Sheet(tk.Frame):
5581
5656
  try:
5582
5657
  del self.CH.cell_options[c]["highlight"]
5583
5658
  except Exception:
5584
- pass
5659
+ continue
5585
5660
  elif not all_:
5586
5661
  if column in self.CH.cell_options and "highlight" in self.CH.cell_options[column]:
5587
5662
  del self.CH.cell_options[column]["highlight"]
@@ -5589,7 +5664,7 @@ class Sheet(tk.Frame):
5589
5664
  for c in self.CH.cell_options:
5590
5665
  if "highlight" in self.CH.cell_options[c]:
5591
5666
  del self.CH.cell_options[c]["highlight"]
5592
- self.set_refresh_timer(redraw)
5667
+ return self.set_refresh_timer(redraw)
5593
5668
 
5594
5669
  def get_highlighted_cells(self, canvas: str = "table") -> dict | None:
5595
5670
  if canvas == "table":
@@ -5606,7 +5681,7 @@ class Sheet(tk.Frame):
5606
5681
  cells: list = [],
5607
5682
  align: str | None = "global",
5608
5683
  redraw: bool = True,
5609
- ) -> None:
5684
+ ) -> Sheet:
5610
5685
  if isinstance(cells, dict):
5611
5686
  for k, v in cells.items():
5612
5687
  set_align(self.MT.cell_options, k, convert_align(v))
@@ -5616,7 +5691,7 @@ class Sheet(tk.Frame):
5616
5691
  set_align(self.MT.cell_options, k, align)
5617
5692
  else:
5618
5693
  set_align(self.MT.cell_options, (row, column), convert_align(align))
5619
- self.set_refresh_timer(redraw)
5694
+ return self.set_refresh_timer(redraw)
5620
5695
 
5621
5696
  def align_rows(
5622
5697
  self,
@@ -5624,7 +5699,7 @@ class Sheet(tk.Frame):
5624
5699
  align: str | None = "global",
5625
5700
  align_index: bool = False,
5626
5701
  redraw: bool = True,
5627
- ) -> None:
5702
+ ) -> Sheet:
5628
5703
  if isinstance(rows, dict):
5629
5704
  for k, v in rows.items():
5630
5705
  align = convert_align(v)
@@ -5641,7 +5716,7 @@ class Sheet(tk.Frame):
5641
5716
  set_align(self.MT.row_options, rows, convert_align(align))
5642
5717
  if align_index:
5643
5718
  set_align(self.RI.cell_options, rows, align)
5644
- self.set_refresh_timer(redraw)
5719
+ return self.set_refresh_timer(redraw)
5645
5720
 
5646
5721
  def align_columns(
5647
5722
  self,
@@ -5649,7 +5724,7 @@ class Sheet(tk.Frame):
5649
5724
  align: str | None = "global",
5650
5725
  align_header: bool = False,
5651
5726
  redraw: bool = True,
5652
- ) -> None:
5727
+ ) -> Sheet:
5653
5728
  if isinstance(columns, dict):
5654
5729
  for k, v in columns.items():
5655
5730
  align = convert_align(v)
@@ -5666,14 +5741,14 @@ class Sheet(tk.Frame):
5666
5741
  set_align(self.MT.col_options, columns, convert_align(align))
5667
5742
  if align_header:
5668
5743
  set_align(self.CH.cell_options, columns, align)
5669
- self.set_refresh_timer(redraw)
5744
+ return self.set_refresh_timer(redraw)
5670
5745
 
5671
5746
  def align_header(
5672
5747
  self,
5673
5748
  columns: list | dict | int = [],
5674
5749
  align: str | None = "global",
5675
5750
  redraw: bool = True,
5676
- ) -> None:
5751
+ ) -> Sheet:
5677
5752
  if isinstance(columns, dict):
5678
5753
  for k, v in columns.items():
5679
5754
  set_align(self.CH.cell_options, k, convert_align(v))
@@ -5683,14 +5758,14 @@ class Sheet(tk.Frame):
5683
5758
  set_align(self.CH.cell_options, k, align)
5684
5759
  elif isinstance(columns, int):
5685
5760
  set_align(self.CH.cell_options, columns, convert_align(align))
5686
- self.set_refresh_timer(redraw)
5761
+ return self.set_refresh_timer(redraw)
5687
5762
 
5688
5763
  def align_index(
5689
5764
  self,
5690
5765
  rows: list | dict | int = [],
5691
5766
  align: str | None = "global",
5692
5767
  redraw: bool = True,
5693
- ) -> None:
5768
+ ) -> Sheet:
5694
5769
  if isinstance(rows, dict):
5695
5770
  for k, v in rows.items():
5696
5771
  set_align(self.RI.cell_options, k, convert_align(v))
@@ -5700,7 +5775,7 @@ class Sheet(tk.Frame):
5700
5775
  set_align(self.RI.cell_options, k, align)
5701
5776
  elif isinstance(rows, int):
5702
5777
  set_align(self.RI.cell_options, rows, convert_align(align))
5703
- self.set_refresh_timer(redraw)
5778
+ return self.set_refresh_timer(redraw)
5704
5779
 
5705
5780
  def get_cell_alignments(self) -> dict:
5706
5781
  return {(r, c): v["align"] for (r, c), v in self.MT.cell_options.items() if "align" in v}
@@ -5944,10 +6019,16 @@ class Sheet(tk.Frame):
5944
6019
  c: int | Literal["all"] = 0,
5945
6020
  *args,
5946
6021
  **kwargs,
5947
- ) -> None:
6022
+ ) -> Sheet:
5948
6023
  kwargs = get_dropdown_kwargs(*args, **kwargs)
5949
6024
  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 ""
6025
+ if kwargs["set_value"] is None:
6026
+ if kwargs["values"] and (v := self.MT.get_cell_data(r, c)) not in kwargs["values"]:
6027
+ v = kwargs["values"][0]
6028
+ else:
6029
+ v == ""
6030
+ else:
6031
+ v = kwargs["set_value"]
5951
6032
  if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
5952
6033
  for r_ in range(self.MT.total_data_rows()):
5953
6034
  self._create_dropdown(r_, c, v, d)
@@ -5961,7 +6042,7 @@ class Sheet(tk.Frame):
5961
6042
  self._create_dropdown(r_, c_, v, d)
5962
6043
  elif isinstance(r, int) and isinstance(c, int):
5963
6044
  self._create_dropdown(r, c, v, d)
5964
- self.set_refresh_timer(kwargs["redraw"])
6045
+ return self.set_refresh_timer(kwargs["redraw"])
5965
6046
 
5966
6047
  def _create_dropdown(self, r: int, c: int, v: object, d: dict) -> None:
5967
6048
  self.del_cell_options_dropdown_and_checkbox(r, c)
@@ -5974,15 +6055,15 @@ class Sheet(tk.Frame):
5974
6055
  c: int | Literal["all"] = 0,
5975
6056
  *args,
5976
6057
  **kwargs,
5977
- ) -> None:
5978
- self.create_dropdown(r=r, c=c, **get_dropdown_kwargs(*args, **kwargs))
6058
+ ) -> Sheet:
6059
+ return self.create_dropdown(r=r, c=c, **get_dropdown_kwargs(*args, **kwargs))
5979
6060
 
5980
6061
  def dropdown_row(
5981
6062
  self,
5982
6063
  r: Iterator[int] | int | Literal["all"] = 0,
5983
6064
  *args,
5984
6065
  **kwargs,
5985
- ) -> None:
6066
+ ) -> Sheet:
5986
6067
  kwargs = get_dropdown_kwargs(*args, **kwargs)
5987
6068
  d = get_dropdown_dict(**kwargs)
5988
6069
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -5994,7 +6075,7 @@ class Sheet(tk.Frame):
5994
6075
  elif is_iterable(r):
5995
6076
  for r_ in r:
5996
6077
  self._dropdown_row(r_, v, d)
5997
- self.set_refresh_timer(kwargs["redraw"])
6078
+ return self.set_refresh_timer(kwargs["redraw"])
5998
6079
 
5999
6080
  def _dropdown_row(self, r: int, v: object, d: dict) -> None:
6000
6081
  self.del_row_options_dropdown_and_checkbox(r)
@@ -6007,7 +6088,7 @@ class Sheet(tk.Frame):
6007
6088
  c: Iterator[int] | int | Literal["all"] = 0,
6008
6089
  *args,
6009
6090
  **kwargs,
6010
- ) -> None:
6091
+ ) -> Sheet:
6011
6092
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6012
6093
  d = get_dropdown_dict(**kwargs)
6013
6094
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -6019,7 +6100,7 @@ class Sheet(tk.Frame):
6019
6100
  elif is_iterable(c):
6020
6101
  for c_ in c:
6021
6102
  self._dropdown_column(c_, v, d)
6022
- self.set_refresh_timer(kwargs["redraw"])
6103
+ return self.set_refresh_timer(kwargs["redraw"])
6023
6104
 
6024
6105
  def _dropdown_column(self, c: int, v: object, d: dict) -> None:
6025
6106
  self.del_column_options_dropdown_and_checkbox(c)
@@ -6032,7 +6113,7 @@ class Sheet(tk.Frame):
6032
6113
  c: Iterator[int] | int | Literal["all"] = 0,
6033
6114
  *args,
6034
6115
  **kwargs,
6035
- ) -> None:
6116
+ ) -> Sheet:
6036
6117
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6037
6118
  d = get_dropdown_dict(**kwargs)
6038
6119
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -6044,7 +6125,7 @@ class Sheet(tk.Frame):
6044
6125
  elif is_iterable(c):
6045
6126
  for c_ in c:
6046
6127
  self._create_header_dropdown(c_, v, d)
6047
- self.set_refresh_timer(kwargs["redraw"])
6128
+ return self.set_refresh_timer(kwargs["redraw"])
6048
6129
 
6049
6130
  def _create_header_dropdown(self, c: int, v: object, d: dict) -> None:
6050
6131
  self.del_header_cell_options_dropdown_and_checkbox(c)
@@ -6056,7 +6137,7 @@ class Sheet(tk.Frame):
6056
6137
  r: Iterator[int] | int | Literal["all"] = 0,
6057
6138
  *args,
6058
6139
  **kwargs,
6059
- ) -> None:
6140
+ ) -> Sheet:
6060
6141
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6061
6142
  d = get_dropdown_dict(**kwargs)
6062
6143
  v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
@@ -6068,7 +6149,7 @@ class Sheet(tk.Frame):
6068
6149
  elif is_iterable(r):
6069
6150
  for r_ in r:
6070
6151
  self._create_index_dropdown(r_, v, d)
6071
- self.set_refresh_timer(kwargs["redraw"])
6152
+ return self.set_refresh_timer(kwargs["redraw"])
6072
6153
 
6073
6154
  def _create_index_dropdown(self, r: int, v: object, d: dict) -> None:
6074
6155
  self.del_index_cell_options_dropdown_and_checkbox(r)
@@ -6327,7 +6408,7 @@ class Sheet(tk.Frame):
6327
6408
  formatter_class: object = None,
6328
6409
  redraw: bool = True,
6329
6410
  **kwargs,
6330
- ) -> None:
6411
+ ) -> Sheet:
6331
6412
  kwargs = fix_format_kwargs({"formatter": formatter_class, **formatter_options, **kwargs})
6332
6413
  if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
6333
6414
  for r_ in range(self.MT.total_data_rows()):
@@ -6341,7 +6422,7 @@ class Sheet(tk.Frame):
6341
6422
  self._format_cell(r_, c_, kwargs)
6342
6423
  else:
6343
6424
  self._format_cell(r, c, kwargs)
6344
- self.set_refresh_timer(redraw)
6425
+ return self.set_refresh_timer(redraw)
6345
6426
 
6346
6427
  def _format_cell(self, r: int, c: int, d: dict) -> None:
6347
6428
  v = d["value"] if "value" in d else self.MT.get_cell_data(r, c)
@@ -6354,7 +6435,7 @@ class Sheet(tk.Frame):
6354
6435
  r: Literal["all"] | int = "all",
6355
6436
  c: Literal["all"] | int = "all",
6356
6437
  clear_values: bool = False,
6357
- ) -> None:
6438
+ ) -> Sheet:
6358
6439
  if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
6359
6440
  for r_, c_ in self.MT.cell_options:
6360
6441
  if "format" in self.MT.cell_options[(r_, c)]:
@@ -6369,6 +6450,7 @@ class Sheet(tk.Frame):
6369
6450
  self.MT.delete_cell_format(r_, c_, clear_values=clear_values)
6370
6451
  else:
6371
6452
  self.MT.delete_cell_format(r, c, clear_values=clear_values)
6453
+ return self
6372
6454
 
6373
6455
  def format_row(
6374
6456
  self,
@@ -6377,7 +6459,7 @@ class Sheet(tk.Frame):
6377
6459
  formatter_class: object = None,
6378
6460
  redraw: bool = True,
6379
6461
  **kwargs,
6380
- ) -> None:
6462
+ ) -> Sheet:
6381
6463
  kwargs = fix_format_kwargs({"formatter": formatter_class, **formatter_options, **kwargs})
6382
6464
  if isinstance(r, str) and r.lower() == "all":
6383
6465
  for r_ in range(len(self.MT.data)):
@@ -6387,7 +6469,7 @@ class Sheet(tk.Frame):
6387
6469
  self._format_row(r_, kwargs)
6388
6470
  else:
6389
6471
  self._format_row(r, kwargs)
6390
- self.set_refresh_timer(redraw)
6472
+ return self.set_refresh_timer(redraw)
6391
6473
 
6392
6474
  def _format_row(self, r: int, d: dict) -> None:
6393
6475
  self.del_row_options_checkbox(r)
@@ -6404,12 +6486,13 @@ class Sheet(tk.Frame):
6404
6486
  self,
6405
6487
  r: Iterator[int] | int | Literal["all"] = "all",
6406
6488
  clear_values: bool = False,
6407
- ) -> None:
6489
+ ) -> Sheet:
6408
6490
  if is_iterable(r):
6409
6491
  for r_ in r:
6410
6492
  self.MT.delete_row_format(r_, clear_values=clear_values)
6411
6493
  else:
6412
6494
  self.MT.delete_row_format(r, clear_values=clear_values)
6495
+ return self
6413
6496
 
6414
6497
  def format_column(
6415
6498
  self,
@@ -6418,7 +6501,7 @@ class Sheet(tk.Frame):
6418
6501
  formatter_class: object = None,
6419
6502
  redraw: bool = True,
6420
6503
  **kwargs,
6421
- ) -> None:
6504
+ ) -> Sheet:
6422
6505
  kwargs = fix_format_kwargs({"formatter": formatter_class, **formatter_options, **kwargs})
6423
6506
  if isinstance(c, str) and c.lower() == "all":
6424
6507
  for c_ in range(self.MT.total_data_cols()):
@@ -6428,7 +6511,7 @@ class Sheet(tk.Frame):
6428
6511
  self._format_column(c_, kwargs)
6429
6512
  else:
6430
6513
  self._format_column(c, kwargs)
6431
- self.set_refresh_timer(redraw)
6514
+ return self.set_refresh_timer(redraw)
6432
6515
 
6433
6516
  def _format_column(self, c: int, d: dict) -> None:
6434
6517
  self.del_column_options_checkbox(c)
@@ -6445,12 +6528,13 @@ class Sheet(tk.Frame):
6445
6528
  self,
6446
6529
  c: Iterator[int] | int | Literal["all"] = "all",
6447
6530
  clear_values: bool = False,
6448
- ) -> None:
6531
+ ) -> Sheet:
6449
6532
  if is_iterable(c):
6450
6533
  for c_ in c:
6451
6534
  self.MT.delete_column_format(c_, clear_values=clear_values)
6452
6535
  else:
6453
6536
  self.MT.delete_column_format(c, clear_values=clear_values)
6537
+ return self
6454
6538
 
6455
6539
 
6456
6540
  class Dropdown(Sheet):
@@ -6479,6 +6563,7 @@ class Dropdown(Sheet):
6479
6563
  Sheet.__init__(
6480
6564
  self,
6481
6565
  parent=parent,
6566
+ name="!SheetDropdown",
6482
6567
  outline_thickness=outline_thickness,
6483
6568
  show_horizontal_grid=True,
6484
6569
  show_vertical_grid=False,
@@ -6491,6 +6576,7 @@ class Dropdown(Sheet):
6491
6576
  horizontal_grid_to_end_of_window=True,
6492
6577
  set_cell_sizes_on_zoom=True,
6493
6578
  show_selected_cells_border=False,
6579
+ scrollbar_show_arrows=False,
6494
6580
  )
6495
6581
  self.parent = parent
6496
6582
  self.close_dropdown_window = close_dropdown_window
@@ -6623,4 +6709,4 @@ class Dropdown(Sheet):
6623
6709
  redraw=False,
6624
6710
  verify=False,
6625
6711
  )
6626
- self.set_all_cell_sizes_to_text(redraw=redraw, width=width)
6712
+ self.set_all_cell_sizes_to_text(redraw=redraw, width=width, slim=True)