tksheet 7.3.0__py3-none-any.whl → 7.3.1__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/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.3.0"
7
+ __version__ = "7.3.1"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
tksheet/column_headers.py CHANGED
@@ -28,10 +28,11 @@ from .functions import (
28
28
  consecutive_ranges,
29
29
  event_dict,
30
30
  get_n2a,
31
+ int_x_tuple,
31
32
  is_contiguous,
32
33
  new_tk_event,
33
- stored_event_dict,
34
34
  rounded_box_coords,
35
+ stored_event_dict,
35
36
  try_binding,
36
37
  )
37
38
  from .other_classes import (
@@ -43,6 +44,9 @@ from .other_classes import (
43
44
  from .text_editor import (
44
45
  TextEditor,
45
46
  )
47
+ from .types import (
48
+ AnyIter,
49
+ )
46
50
  from .vars import (
47
51
  USER_OS,
48
52
  rc_binding,
@@ -928,20 +932,31 @@ class ColumnHeaders(tk.Canvas):
928
932
 
929
933
  def select_col(
930
934
  self,
931
- c: int,
935
+ c: int | AnyIter[int],
932
936
  redraw: bool = False,
933
937
  run_binding_func: bool = True,
934
938
  ext: bool = False,
935
- ) -> int:
939
+ ) -> int | list[int]:
936
940
  boxes_to_hide = tuple(self.MT.selection_boxes)
937
- fill_iid = self.MT.create_selection_box(0, c, len(self.MT.row_positions) - 1, c + 1, "columns", ext=ext)
941
+ fill_iids = [
942
+ self.MT.create_selection_box(
943
+ 0,
944
+ start,
945
+ len(self.MT.row_positions) - 1,
946
+ end,
947
+ "columns",
948
+ set_current=True,
949
+ ext=ext,
950
+ )
951
+ for start, end in consecutive_ranges(int_x_tuple(c))
952
+ ]
938
953
  for iid in boxes_to_hide:
939
954
  self.MT.hide_selection_box(iid)
940
955
  if redraw:
941
956
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
942
957
  if run_binding_func:
943
958
  self.MT.run_selection_binding("columns")
944
- return fill_iid
959
+ return fill_iids[0] if len(fill_iids) == 1 else fill_iids
945
960
 
946
961
  def add_selection(
947
962
  self,
tksheet/functions.py CHANGED
@@ -12,6 +12,8 @@ from collections import deque
12
12
  from collections.abc import (
13
13
  Callable,
14
14
  Generator,
15
+ Hashable,
16
+ Iterable,
15
17
  Iterator,
16
18
  Sequence,
17
19
  )
@@ -30,6 +32,9 @@ from .other_classes import (
30
32
  Loc,
31
33
  Span,
32
34
  )
35
+ from .types import (
36
+ AnyIter,
37
+ )
33
38
 
34
39
  unpickle_obj = pickle.loads
35
40
 
@@ -295,13 +300,19 @@ def is_iterable(o: object) -> bool:
295
300
  return False
296
301
 
297
302
 
298
- def int_x_iter(i: Iterator[int] | int) -> Iterator[int]:
303
+ def int_x_iter(i: AnyIter[int] | int) -> AnyIter[int]:
299
304
  if isinstance(i, int):
300
305
  return (i,)
301
306
  return i
302
307
 
303
308
 
304
- def unpack(t: tuple[object] | tuple[Iterator[object]]) -> tuple[object]:
309
+ def int_x_tuple(i: AnyIter[int] | int) -> tuple[int]:
310
+ if isinstance(i, int):
311
+ return (i,)
312
+ return tuple(i)
313
+
314
+
315
+ def unpack(t: tuple[object] | tuple[AnyIter[object]]) -> tuple[object]:
305
316
  if not len(t):
306
317
  return t
307
318
  if is_iterable(t[0]) and len(t) == 1:
@@ -427,7 +438,7 @@ def consecutive_ranges(seq: Sequence[int]) -> Generator[tuple[int, int]]:
427
438
  yield seq[start], seq[-1] + 1
428
439
 
429
440
 
430
- def is_contiguous(iterable: Iterator[int]) -> bool:
441
+ def is_contiguous(iterable: Iterable[int]) -> bool:
431
442
  itr = iter(iterable)
432
443
  prev = next(itr)
433
444
  return all(i == (prev := prev + 1) for i in itr)
@@ -500,7 +511,7 @@ def cell_right_within_box(
500
511
 
501
512
 
502
513
  def get_last(
503
- it: Iterator,
514
+ it: AnyIter[object],
504
515
  ) -> object:
505
516
  if hasattr(it, "__reversed__"):
506
517
  try:
@@ -522,7 +533,7 @@ def index_exists(seq: Sequence[object], index: int) -> bool:
522
533
  return False
523
534
 
524
535
 
525
- def add_to_displayed(displayed: list[int], to_add: Iterator[int]) -> list[int]:
536
+ def add_to_displayed(displayed: list[int], to_add: Iterable[int]) -> list[int]:
526
537
  # assumes to_add is sorted in reverse
527
538
  for i in reversed(to_add):
528
539
  ins = bisect_left(displayed, i)
@@ -704,7 +715,7 @@ def diff_gen(seq: list[float]) -> Generator[int]:
704
715
  )
705
716
 
706
717
 
707
- def zip_fill_2nd_value(x: Iterator, o: object) -> Generator[object, object]:
718
+ def zip_fill_2nd_value(x: AnyIter[object], o: object) -> Generator[object, object]:
708
719
  return zip(x, repeat(o))
709
720
 
710
721
 
@@ -1233,13 +1244,13 @@ def span_froms(
1233
1244
  return from_r, from_c
1234
1245
 
1235
1246
 
1236
- def del_named_span_options(options: dict, itr: Iterator, type_: str) -> None:
1247
+ def del_named_span_options(options: dict, itr: AnyIter[Hashable], type_: str) -> None:
1237
1248
  for k in itr:
1238
1249
  if k in options and type_ in options[k]:
1239
1250
  del options[k][type_]
1240
1251
 
1241
1252
 
1242
- def del_named_span_options_nested(options: dict, itr1: Iterator, itr2: Iterator, type_: str) -> None:
1253
+ def del_named_span_options_nested(options: dict, itr1: AnyIter[Hashable], itr2: AnyIter[Hashable], type_: str) -> None:
1243
1254
  for k1 in itr1:
1244
1255
  for k2 in itr2:
1245
1256
  k = (k1, k2)
@@ -1320,7 +1331,7 @@ def set_align(
1320
1331
  def del_from_options(
1321
1332
  options: dict,
1322
1333
  key: str,
1323
- coords: int | Iterator | None = None,
1334
+ coords: int | AnyIter[int | tuple[int, int]] | None = None,
1324
1335
  ) -> dict:
1325
1336
  if isinstance(coords, int):
1326
1337
  if coords in options and key in options[coords]:
tksheet/main_table.py CHANGED
@@ -15,7 +15,6 @@ from collections.abc import (
15
15
  Callable,
16
16
  Generator,
17
17
  Hashable,
18
- Iterator,
19
18
  Sequence,
20
19
  )
21
20
  from functools import (
@@ -99,6 +98,9 @@ from .other_classes import (
99
98
  from .text_editor import (
100
99
  TextEditor,
101
100
  )
101
+ from .types import (
102
+ AnyIter,
103
+ )
102
104
  from .vars import (
103
105
  USER_OS,
104
106
  bind_add_columns,
@@ -405,7 +407,9 @@ class MainTable(tk.Canvas):
405
407
  ("<Control-MouseWheel>", self.ctrl_mousewheel),
406
408
  ("<Control-plus>", self.zoom_in),
407
409
  ("<Control-equal>", self.zoom_in),
410
+ ("<Meta-Command-equal>", self.zoom_in),
408
411
  ("<Control-minus>", self.zoom_out),
412
+ ("<Meta-Command-minus>", self.zoom_out),
409
413
  )
410
414
  mt_ri_canvas_linux_bindings = {
411
415
  ("<Button-4>", self.mousewheel),
@@ -1844,14 +1848,43 @@ class MainTable(tk.Canvas):
1844
1848
  if redraw:
1845
1849
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
1846
1850
  if run_binding_func:
1847
- if self.select_all_binding_func:
1848
- self.select_all_binding_func(
1849
- self.get_select_event(being_drawn_item=self.being_drawn_item),
1850
- )
1851
1851
  event_data = self.get_select_event(self.being_drawn_item)
1852
+ try_binding(self.select_all_binding_func, event_data)
1852
1853
  self.PAR.emit_event("<<SheetSelect>>", data=event_data)
1853
1854
  self.PAR.emit_event("<<SelectAll>>", data=event_data)
1854
1855
 
1856
+ def select_columns(self, event: object) -> None:
1857
+ if not self.selected:
1858
+ return
1859
+ r1, c1, r2, c2 = self.selection_boxes[self.selected.fill_iid].coords
1860
+ r, c = self.selected.row, self.selected.column
1861
+ self.set_currently_selected(
1862
+ r=r,
1863
+ c=c,
1864
+ item=self.CH.select_col(range(c1, c2), redraw=True),
1865
+ )
1866
+
1867
+ def select_rows(self, event: object) -> None:
1868
+ if not self.selected:
1869
+ return
1870
+ r1, c1, r2, c2 = self.selection_boxes[self.selected.fill_iid].coords
1871
+ r, c = self.selected.row, self.selected.column
1872
+ self.set_currently_selected(
1873
+ r=r,
1874
+ c=c,
1875
+ item=self.RI.select_row(range(r1, r2), redraw=True),
1876
+ )
1877
+
1878
+ def select_row_start(self, event: object) -> None:
1879
+ if self.selected:
1880
+ self.select_cell(self.selected.row, 0)
1881
+ self.see(self.selected.row, 0)
1882
+
1883
+ def select_a1(self, event: object) -> None:
1884
+ if len(self.row_positions) > 1 and len(self.col_positions) > 1:
1885
+ self.select_cell(0, 0)
1886
+ self.see(0, 0)
1887
+
1855
1888
  def select_cell(
1856
1889
  self,
1857
1890
  r: int,
@@ -1934,7 +1967,9 @@ class MainTable(tk.Canvas):
1934
1967
  ) -> None:
1935
1968
  if not self.selected:
1936
1969
  return
1970
+ curr_box = self.selected.fill_iid
1937
1971
  if r == "all" or (r is None and c is None and cell is None):
1972
+ self.hide_dropdown_editor_all_canvases()
1938
1973
  for item, box in self.get_selection_items():
1939
1974
  self.hide_selection_box(item)
1940
1975
  elif r in ("allrows", "allcols"):
@@ -1944,6 +1979,8 @@ class MainTable(tk.Canvas):
1944
1979
  cells=False,
1945
1980
  ):
1946
1981
  self.hide_selection_box(item)
1982
+ if item == curr_box:
1983
+ self.hide_dropdown_editor_all_canvases()
1947
1984
  elif isinstance(r, int) and c is None and cell is None:
1948
1985
  for item, box in self.get_selection_items(columns=False, cells=False):
1949
1986
  r1, c1, r2, c2 = box.coords
@@ -1951,6 +1988,8 @@ class MainTable(tk.Canvas):
1951
1988
  resel = self.selected.fill_iid == item
1952
1989
  to_sel = self.selected.row
1953
1990
  self.hide_selection_box(item)
1991
+ if item == curr_box:
1992
+ self.hide_dropdown_editor_all_canvases()
1954
1993
  if r2 - r1 != 1:
1955
1994
  if r == r1:
1956
1995
  self.create_selection_box(
@@ -1994,6 +2033,8 @@ class MainTable(tk.Canvas):
1994
2033
  resel = self.selected.fill_iid == item
1995
2034
  to_sel = self.selected.column
1996
2035
  self.hide_selection_box(item)
2036
+ if item == curr_box:
2037
+ self.hide_dropdown_editor_all_canvases()
1997
2038
  if c2 - c1 != 1:
1998
2039
  if c == c1:
1999
2040
  self.create_selection_box(
@@ -2037,6 +2078,8 @@ class MainTable(tk.Canvas):
2037
2078
  r1, c1, r2, c2 = box.coords
2038
2079
  if r >= r1 and c >= c1 and r < r2 and c < c2:
2039
2080
  self.hide_selection_box(item)
2081
+ if item == curr_box:
2082
+ self.hide_text_editor_and_dropdown(redraw=False)
2040
2083
  if redraw:
2041
2084
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
2042
2085
  sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
@@ -2046,12 +2089,15 @@ class MainTable(tk.Canvas):
2046
2089
 
2047
2090
  def deselect_any(
2048
2091
  self,
2049
- rows: Iterator[int] | int | None = None,
2050
- columns: Iterator[int] | int | None = None,
2092
+ rows: AnyIter[int] | int | None = None,
2093
+ columns: AnyIter[int] | int | None = None,
2051
2094
  redraw: bool = True,
2052
2095
  ) -> None:
2096
+ if not self.selected:
2097
+ return
2053
2098
  rows = int_x_iter(rows)
2054
2099
  columns = int_x_iter(columns)
2100
+ curr_box = self.selected.fill_iid
2055
2101
  if is_iterable(rows) and is_iterable(columns):
2056
2102
  rows = tuple(consecutive_ranges(sorted(rows)))
2057
2103
  columns = tuple(consecutive_ranges(sorted(columns)))
@@ -2066,6 +2112,8 @@ class MainTable(tk.Canvas):
2066
2112
  (cols_end >= c1 and cols_end <= c2) or (cols_st >= c1 and cols_st < c2)
2067
2113
  ):
2068
2114
  hidden = self.hide_selection_box(item)
2115
+ if item == curr_box:
2116
+ self.hide_dropdown_editor_all_canvases()
2069
2117
  break
2070
2118
  elif is_iterable(rows):
2071
2119
  rows = tuple(consecutive_ranges(sorted(rows)))
@@ -2074,6 +2122,8 @@ class MainTable(tk.Canvas):
2074
2122
  for rows_st, rows_end in rows:
2075
2123
  if (rows_end >= r1 and rows_end <= r2) or (rows_st >= r1 and rows_st < r2):
2076
2124
  self.hide_selection_box(item)
2125
+ if item == curr_box:
2126
+ self.hide_dropdown_editor_all_canvases()
2077
2127
  break
2078
2128
  elif is_iterable(columns):
2079
2129
  columns = tuple(consecutive_ranges(sorted(columns)))
@@ -2082,6 +2132,8 @@ class MainTable(tk.Canvas):
2082
2132
  for cols_st, cols_end in columns:
2083
2133
  if (cols_end >= c1 and cols_end <= c2) or (cols_st >= c1 and cols_st < c2):
2084
2134
  self.hide_selection_box(item)
2135
+ if item == curr_box:
2136
+ self.hide_dropdown_editor_all_canvases()
2085
2137
  break
2086
2138
  else:
2087
2139
  self.deselect()
@@ -2672,7 +2724,7 @@ class MainTable(tk.Canvas):
2672
2724
  self._enable_binding(bindings.lower())
2673
2725
  self.create_rc_menus()
2674
2726
 
2675
- def disable_bindings(self, bindings):
2727
+ def disable_bindings(self, bindings: object) -> None:
2676
2728
  if not bindings:
2677
2729
  self._disable_binding("all")
2678
2730
  elif isinstance(bindings, (list, tuple)):
@@ -2686,21 +2738,33 @@ class MainTable(tk.Canvas):
2686
2738
  self._disable_binding(bindings)
2687
2739
  self.create_rc_menus()
2688
2740
 
2689
- def _enable_binding(self, binding):
2741
+ def _enable_binding(self, binding: str) -> None:
2690
2742
  if binding == "enable_all":
2691
2743
  binding = "all"
2692
- if binding in ("all", "single", "single_selection_mode", "single_select"):
2693
- self.single_selection_enabled = True
2694
- self.toggle_selection_enabled = False
2695
- elif binding in ("toggle", "toggle_selection_mode", "toggle_select"):
2696
- self.toggle_selection_enabled = True
2697
- self.single_selection_enabled = False
2744
+ if binding in (
2745
+ "all",
2746
+ "single",
2747
+ "single_selection_mode",
2748
+ "single_select",
2749
+ "toggle",
2750
+ "toggle_selection_mode",
2751
+ "toggle_select",
2752
+ ):
2753
+ self._tksheet_bind("row_start_bindings", self.select_row_start)
2754
+ self._tksheet_bind("table_start_bindings", self.select_a1)
2755
+ if binding in ("all", "single", "single_selection_mode", "single_select"):
2756
+ self.single_selection_enabled = True
2757
+ self.toggle_selection_enabled = False
2758
+ elif binding in ("toggle", "toggle_selection_mode", "toggle_select"):
2759
+ self.toggle_selection_enabled = True
2760
+ self.single_selection_enabled = False
2698
2761
  if binding in ("all", "drag_select"):
2699
2762
  self.drag_selection_enabled = True
2700
2763
  if binding in ("all", "column_width_resize"):
2701
2764
  self.CH.width_resizing_enabled = True
2702
2765
  if binding in ("all", "column_select"):
2703
2766
  self.CH.col_selection_enabled = True
2767
+ self._tksheet_bind("select_columns_bindings", self.select_columns)
2704
2768
  if binding in ("all", "column_height_resize"):
2705
2769
  self.CH.height_resizing_enabled = True
2706
2770
  self.TL.rh_state()
@@ -2717,6 +2781,7 @@ class MainTable(tk.Canvas):
2717
2781
  self.TL.rw_state()
2718
2782
  if binding in ("all", "row_select"):
2719
2783
  self.RI.row_selection_enabled = True
2784
+ self._tksheet_bind("select_rows_bindings", self.select_rows)
2720
2785
  if binding in ("all", "row_drag_and_drop", "move_rows"):
2721
2786
  self.RI.drag_and_drop_enabled = True
2722
2787
  if binding in ("all", "select_all"):
@@ -2802,21 +2867,29 @@ class MainTable(tk.Canvas):
2802
2867
  for binding in self.PAR.ops[bindings_key]:
2803
2868
  widget.bind(binding, func)
2804
2869
 
2805
- def _disable_binding(self, binding):
2870
+ def _disable_binding(self, binding: str) -> None:
2806
2871
  if binding == "disable_all":
2807
2872
  binding = "all"
2808
- if binding in ("all", "single", "single_selection_mode", "single_select"):
2873
+ if binding in (
2874
+ "all",
2875
+ "single",
2876
+ "single_selection_mode",
2877
+ "single_select",
2878
+ "toggle",
2879
+ "toggle_selection_mode",
2880
+ "toggle_select",
2881
+ ):
2882
+ self._tksheet_unbind("row_start_bindings")
2883
+ self._tksheet_unbind("table_start_bindings")
2809
2884
  self.single_selection_enabled = False
2810
2885
  self.toggle_selection_enabled = False
2811
- elif binding in ("toggle", "toggle_selection_mode", "toggle_select"):
2812
- self.toggle_selection_enabled = False
2813
- self.single_selection_enabled = False
2814
2886
  if binding in ("all", "drag_select"):
2815
2887
  self.drag_selection_enabled = False
2816
2888
  if binding in ("all", "column_width_resize"):
2817
2889
  self.CH.width_resizing_enabled = False
2818
2890
  if binding in ("all", "column_select"):
2819
2891
  self.CH.col_selection_enabled = False
2892
+ self._tksheet_unbind("select_columns_bindings")
2820
2893
  if binding in ("all", "column_height_resize"):
2821
2894
  self.CH.height_resizing_enabled = False
2822
2895
  self.TL.rh_state("hidden")
@@ -2833,6 +2906,7 @@ class MainTable(tk.Canvas):
2833
2906
  self.TL.rw_state("hidden")
2834
2907
  if binding in ("all", "row_select"):
2835
2908
  self.RI.row_selection_enabled = False
2909
+ self._tksheet_unbind("select_rows_bindings")
2836
2910
  if binding in ("all", "row_drag_and_drop", "move_rows"):
2837
2911
  self.RI.drag_and_drop_enabled = False
2838
2912
  if binding in bind_del_columns:
@@ -3880,7 +3954,7 @@ class MainTable(tk.Canvas):
3880
3954
  self.recreate_all_selection_boxes()
3881
3955
  return self.row_positions, self.col_positions
3882
3956
 
3883
- def set_col_positions(self, itr: Iterator[float]) -> None:
3957
+ def set_col_positions(self, itr: AnyIter[float]) -> None:
3884
3958
  self.col_positions = list(accumulate(chain([0], itr)))
3885
3959
 
3886
3960
  def reset_col_positions(self, ncols: int | None = None):
@@ -3892,7 +3966,7 @@ class MainTable(tk.Canvas):
3892
3966
  else:
3893
3967
  self.set_col_positions(itr=repeat(colpos, len(self.displayed_columns)))
3894
3968
 
3895
- def set_row_positions(self, itr: Iterator[float]) -> None:
3969
+ def set_row_positions(self, itr: AnyIter[float]) -> None:
3896
3970
  self.row_positions = list(accumulate(chain([0], itr)))
3897
3971
 
3898
3972
  def reset_row_positions(self, nrows: int | None = None):
@@ -3926,7 +4000,7 @@ class MainTable(tk.Canvas):
3926
4000
  del self.row_positions[idx]
3927
4001
  self.row_positions[idx:] = [e - w for e in islice(self.row_positions, idx, len(self.row_positions))]
3928
4002
 
3929
- def del_col_positions(self, idxs: Iterator[int] | None = None):
4003
+ def del_col_positions(self, idxs: AnyIter[int] | None = None):
3930
4004
  if idxs is None:
3931
4005
  del self.col_positions[-1]
3932
4006
  else:
@@ -3934,7 +4008,7 @@ class MainTable(tk.Canvas):
3934
4008
  idxs = set(idxs)
3935
4009
  self.set_col_positions(itr=(w for i, w in enumerate(self.gen_column_widths()) if i not in idxs))
3936
4010
 
3937
- def del_row_positions(self, idxs: Iterator[int] | None = None):
4011
+ def del_row_positions(self, idxs: AnyIter[int] | None = None):
3938
4012
  if idxs is None:
3939
4013
  del self.row_positions[-1]
3940
4014
  else:
@@ -4934,7 +5008,7 @@ class MainTable(tk.Canvas):
4934
5008
 
4935
5009
  def display_rows(
4936
5010
  self,
4937
- rows: int | Iterator | None = None,
5011
+ rows: int | AnyIter | None = None,
4938
5012
  all_rows_displayed: bool | None = None,
4939
5013
  reset_row_positions: bool = True,
4940
5014
  deselect_all: bool = True,
@@ -4963,7 +5037,7 @@ class MainTable(tk.Canvas):
4963
5037
 
4964
5038
  def display_columns(
4965
5039
  self,
4966
- columns: int | Iterator | None = None,
5040
+ columns: int | AnyIter | None = None,
4967
5041
  all_columns_displayed: bool | None = None,
4968
5042
  reset_col_positions: bool = True,
4969
5043
  deselect_all: bool = True,
tksheet/row_index.py CHANGED
@@ -5,7 +5,6 @@ from collections import defaultdict
5
5
  from collections.abc import (
6
6
  Generator,
7
7
  Hashable,
8
- Iterator,
9
8
  Sequence,
10
9
  )
11
10
  from functools import (
@@ -35,13 +34,15 @@ from .formatters import (
35
34
  )
36
35
  from .functions import (
37
36
  consecutive_chunks,
37
+ consecutive_ranges,
38
38
  event_dict,
39
39
  get_n2a,
40
+ int_x_tuple,
40
41
  is_contiguous,
41
42
  new_tk_event,
42
43
  num2alpha,
43
- stored_event_dict,
44
44
  rounded_box_coords,
45
+ stored_event_dict,
45
46
  try_binding,
46
47
  )
47
48
  from .other_classes import (
@@ -54,6 +55,9 @@ from .other_classes import (
54
55
  from .text_editor import (
55
56
  TextEditor,
56
57
  )
58
+ from .types import (
59
+ AnyIter,
60
+ )
57
61
  from .vars import (
58
62
  rc_binding,
59
63
  symbols_set,
@@ -944,20 +948,31 @@ class RowIndex(tk.Canvas):
944
948
 
945
949
  def select_row(
946
950
  self,
947
- r: int,
951
+ r: int | AnyIter[int],
948
952
  redraw: bool = False,
949
953
  run_binding_func: bool = True,
950
954
  ext: bool = False,
951
955
  ) -> int:
952
956
  boxes_to_hide = tuple(self.MT.selection_boxes)
953
- fill_iid = self.MT.create_selection_box(r, 0, r + 1, len(self.MT.col_positions) - 1, "rows", ext=ext)
957
+ fill_iids = [
958
+ self.MT.create_selection_box(
959
+ start,
960
+ 0,
961
+ end,
962
+ len(self.MT.col_positions) - 1,
963
+ "rows",
964
+ set_current=True,
965
+ ext=ext,
966
+ )
967
+ for start, end in consecutive_ranges(int_x_tuple(r))
968
+ ]
954
969
  for iid in boxes_to_hide:
955
970
  self.MT.hide_selection_box(iid)
956
971
  if redraw:
957
972
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
958
973
  if run_binding_func:
959
974
  self.MT.run_selection_binding("rows")
960
- return fill_iid
975
+ return fill_iids[0] if len(fill_iids) == 1 else fill_iids
961
976
 
962
977
  def add_selection(
963
978
  self,
@@ -1113,7 +1128,7 @@ class RowIndex(tk.Canvas):
1113
1128
 
1114
1129
  def get_index_text_width(
1115
1130
  self,
1116
- only_rows: Iterator[int] | None = None,
1131
+ only_rows: AnyIter[int] | None = None,
1117
1132
  ) -> int:
1118
1133
  self.fix_index()
1119
1134
  w = self.PAR.ops.default_row_index_width
tksheet/sheet.py CHANGED
@@ -83,6 +83,7 @@ from .themes import (
83
83
  )
84
84
  from .top_left_rectangle import TopLeftRectangle
85
85
  from .types import (
86
+ AnyIter,
86
87
  CreateSpanTypes,
87
88
  )
88
89
  from .vars import (
@@ -544,7 +545,7 @@ class Sheet(tk.Frame):
544
545
  def set_header_data(
545
546
  self,
546
547
  value: object,
547
- c: int | None | Iterator[int] = None,
548
+ c: int | None | AnyIter[int] = None,
548
549
  redraw: bool = True,
549
550
  ) -> Sheet:
550
551
  if c is None:
@@ -580,7 +581,7 @@ class Sheet(tk.Frame):
580
581
  def set_index_data(
581
582
  self,
582
583
  value: object,
583
- r: int | None | Iterator[int] = None,
584
+ r: int | None | AnyIter[int] = None,
584
585
  redraw: bool = True,
585
586
  ) -> Sheet:
586
587
  if r is None:
@@ -2305,7 +2306,7 @@ class Sheet(tk.Frame):
2305
2306
 
2306
2307
  def del_rows(
2307
2308
  self,
2308
- rows: int | Iterator[int],
2309
+ rows: int | AnyIter[int],
2309
2310
  data_indexes: bool = True,
2310
2311
  undo: bool = False,
2311
2312
  emit_event: bool = False,
@@ -2347,7 +2348,7 @@ class Sheet(tk.Frame):
2347
2348
 
2348
2349
  def del_columns(
2349
2350
  self,
2350
- columns: int | Iterator[int],
2351
+ columns: int | AnyIter[int],
2351
2352
  data_indexes: bool = True,
2352
2353
  undo: bool = False,
2353
2354
  emit_event: bool = False,
@@ -3463,8 +3464,8 @@ class Sheet(tk.Frame):
3463
3464
 
3464
3465
  def deselect_any(
3465
3466
  self,
3466
- rows: Iterator[int] | int | None,
3467
- columns: Iterator[int] | int | None,
3467
+ rows: AnyIter[int] | int | None,
3468
+ columns: AnyIter[int] | int | None,
3468
3469
  redraw: bool = True,
3469
3470
  ) -> Sheet:
3470
3471
  self.MT.deselect_any(rows=rows, columns=columns, redraw=False)
@@ -3622,7 +3623,7 @@ class Sheet(tk.Frame):
3622
3623
 
3623
3624
  def set_column_widths(
3624
3625
  self,
3625
- column_widths: Iterator[float] | None = None,
3626
+ column_widths: AnyIter[float] | None = None,
3626
3627
  canvas_positions: bool = False,
3627
3628
  reset: bool = False,
3628
3629
  ) -> Sheet:
@@ -3637,7 +3638,7 @@ class Sheet(tk.Frame):
3637
3638
 
3638
3639
  def set_row_heights(
3639
3640
  self,
3640
- row_heights: Iterator[float] | None = None,
3641
+ row_heights: AnyIter[float] | None = None,
3641
3642
  canvas_positions: bool = False,
3642
3643
  reset: bool = False,
3643
3644
  ) -> Sheet:
@@ -3684,7 +3685,7 @@ class Sheet(tk.Frame):
3684
3685
 
3685
3686
  delete_row_position = del_row_position
3686
3687
 
3687
- def del_row_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
3688
+ def del_row_positions(self, idxs: AnyIter[int] | None = None) -> Sheet:
3688
3689
  self.MT.del_row_positions(idxs=idxs)
3689
3690
  self.set_refresh_timer()
3690
3691
  return self
@@ -3695,7 +3696,7 @@ class Sheet(tk.Frame):
3695
3696
 
3696
3697
  delete_column_position = del_column_position
3697
3698
 
3698
- def del_column_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
3699
+ def del_column_positions(self, idxs: AnyIter[int] | None = None) -> Sheet:
3699
3700
  self.MT.del_col_positions(idxs=idxs)
3700
3701
  self.set_refresh_timer()
3701
3702
  return self
@@ -3968,7 +3969,7 @@ class Sheet(tk.Frame):
3968
3969
 
3969
3970
  def display_columns(
3970
3971
  self,
3971
- columns: None | Literal["all"] | Iterator[int] = None,
3972
+ columns: None | Literal["all"] | AnyIter[int] = None,
3972
3973
  all_columns_displayed: None | bool = None,
3973
3974
  reset_col_positions: bool = True,
3974
3975
  redraw: bool = False,
@@ -3992,7 +3993,7 @@ class Sheet(tk.Frame):
3992
3993
 
3993
3994
  def hide_columns(
3994
3995
  self,
3995
- columns: int | set[int] | Iterator[int],
3996
+ columns: int | set[int] | AnyIter[int],
3996
3997
  redraw: bool = True,
3997
3998
  deselect_all: bool = True,
3998
3999
  data_indexes: bool = False,
@@ -4036,7 +4037,7 @@ class Sheet(tk.Frame):
4036
4037
 
4037
4038
  def show_columns(
4038
4039
  self,
4039
- columns: int | Iterator[int],
4040
+ columns: int | AnyIter[int],
4040
4041
  redraw: bool = True,
4041
4042
  deselect_all: bool = True,
4042
4043
  ) -> Sheet:
@@ -4102,7 +4103,7 @@ class Sheet(tk.Frame):
4102
4103
 
4103
4104
  def display_rows(
4104
4105
  self,
4105
- rows: None | Literal["all"] | Iterator[int] = None,
4106
+ rows: None | Literal["all"] | AnyIter[int] = None,
4106
4107
  all_rows_displayed: None | bool = None,
4107
4108
  reset_row_positions: bool = True,
4108
4109
  redraw: bool = False,
@@ -4124,7 +4125,7 @@ class Sheet(tk.Frame):
4124
4125
 
4125
4126
  def hide_rows(
4126
4127
  self,
4127
- rows: int | set[int] | Iterator[int],
4128
+ rows: int | set[int] | AnyIter[int],
4128
4129
  redraw: bool = True,
4129
4130
  deselect_all: bool = True,
4130
4131
  data_indexes: bool = False,
@@ -4170,7 +4171,7 @@ class Sheet(tk.Frame):
4170
4171
 
4171
4172
  def show_rows(
4172
4173
  self,
4173
- rows: int | Iterator[int],
4174
+ rows: int | AnyIter[int],
4174
4175
  redraw: bool = True,
4175
4176
  deselect_all: bool = True,
4176
4177
  ) -> Sheet:
@@ -4790,7 +4791,7 @@ class Sheet(tk.Frame):
4790
4791
  def tag(
4791
4792
  self,
4792
4793
  *key: CreateSpanTypes,
4793
- tags: Iterator[str] | str = "",
4794
+ tags: AnyIter[str] | str = "",
4794
4795
  ) -> Sheet:
4795
4796
  span = self.span_from_key(*key)
4796
4797
  rows, cols = self.ranges_from_span(span)
@@ -4835,7 +4836,7 @@ class Sheet(tk.Frame):
4835
4836
 
4836
4837
  def tag_rows(
4837
4838
  self,
4838
- rows: int | Iterator[int],
4839
+ rows: int | AnyIter[int],
4839
4840
  *tags,
4840
4841
  ) -> Sheet:
4841
4842
  if isinstance(rows, int):
@@ -4848,7 +4849,7 @@ class Sheet(tk.Frame):
4848
4849
 
4849
4850
  def tag_columns(
4850
4851
  self,
4851
- columns: int | Iterator[int],
4852
+ columns: int | AnyIter[int],
4852
4853
  *tags,
4853
4854
  ) -> Sheet:
4854
4855
  if isinstance(columns, int):
@@ -4862,8 +4863,8 @@ class Sheet(tk.Frame):
4862
4863
  def untag(
4863
4864
  self,
4864
4865
  cell: tuple[int, int] | None = None,
4865
- rows: int | Iterator[int] | None = None,
4866
- columns: int | Iterator[int] | None = None,
4866
+ rows: int | AnyIter[int] | None = None,
4867
+ columns: int | AnyIter[int] | None = None,
4867
4868
  ) -> Sheet:
4868
4869
  if isinstance(cell, tuple):
4869
4870
  for tagged in self.MT.tagged_cells.values():
@@ -4923,7 +4924,7 @@ class Sheet(tk.Frame):
4923
4924
  text_column: None | int | list[str] = None,
4924
4925
  push_ops: bool = False,
4925
4926
  row_heights: Sequence[int] | None | False = None,
4926
- open_ids: Iterator[str] | None = None,
4927
+ open_ids: AnyIter[str] | None = None,
4927
4928
  safety: bool = True,
4928
4929
  ncols: int | None = None,
4929
4930
  lower: bool = False,
@@ -4950,7 +4951,7 @@ class Sheet(tk.Frame):
4950
4951
  if not iid:
4951
4952
  continue
4952
4953
  tally_of_ids[iid] += 1
4953
- if tally_of_ids[iid] > 0:
4954
+ if tally_of_ids[iid]:
4954
4955
  x = 1
4955
4956
  while iid in tally_of_ids:
4956
4957
  new = f"{row[iid_column]}_DUPLICATED_{x}"
@@ -5032,7 +5033,7 @@ class Sheet(tk.Frame):
5032
5033
  """
5033
5034
  return self.RI.tree_open_ids
5034
5035
 
5035
- def tree_set_open(self, open_ids: Iterator[str]) -> Sheet:
5036
+ def tree_set_open(self, open_ids: AnyIter[str]) -> Sheet:
5036
5037
  """
5037
5038
  Accepts set[str] of iids that are open in the treeview
5038
5039
  Closes everything else
@@ -5087,7 +5088,7 @@ class Sheet(tk.Frame):
5087
5088
  deselect_all=False,
5088
5089
  )
5089
5090
 
5090
- def _tree_close(self, items: Iterator[str]) -> list[int]:
5091
+ def _tree_close(self, items: AnyIter[str]) -> list[int]:
5091
5092
  """
5092
5093
  Only meant for internal use
5093
5094
  """
@@ -5129,6 +5130,9 @@ class Sheet(tk.Frame):
5129
5130
  ) -> str:
5130
5131
  """
5131
5132
  Insert an item into the treeview
5133
+
5134
+ Returns:
5135
+ str: new item iid
5132
5136
  """
5133
5137
  if not iid:
5134
5138
  i = 0
@@ -5187,7 +5191,12 @@ class Sheet(tk.Frame):
5187
5191
  include_text_column: bool = True,
5188
5192
  ) -> dict[str, int]:
5189
5193
  """
5190
- Insert multiple items into the treeview at once, under the same parent
5194
+ Insert multiple items into the treeview at once, under the same parent.
5195
+
5196
+ Returns:
5197
+ dict:
5198
+ - Keys (str): iid
5199
+ - Values (int): row numbers
5191
5200
  """
5192
5201
  to_insert = []
5193
5202
  pid = parent
@@ -5778,7 +5787,7 @@ class Sheet(tk.Frame):
5778
5787
  get_displayed: bool = False,
5779
5788
  get_index: bool = False,
5780
5789
  get_index_displayed: bool = True,
5781
- only_columns: int | Iterator[int] | None = None,
5790
+ only_columns: int | AnyIter[int] | None = None,
5782
5791
  ) -> list[object]:
5783
5792
  if only_columns is not None:
5784
5793
  if isinstance(only_columns, int):
@@ -5804,7 +5813,7 @@ class Sheet(tk.Frame):
5804
5813
  get_displayed: bool = False,
5805
5814
  get_header: bool = False,
5806
5815
  get_header_displayed: bool = True,
5807
- only_rows: int | Iterator[int] | None = None,
5816
+ only_rows: int | AnyIter[int] | None = None,
5808
5817
  ) -> list[object]:
5809
5818
  if only_rows is not None:
5810
5819
  if isinstance(only_rows, int):
@@ -5823,8 +5832,8 @@ class Sheet(tk.Frame):
5823
5832
  get_index: bool = False,
5824
5833
  get_header_displayed: bool = True,
5825
5834
  get_index_displayed: bool = True,
5826
- only_rows: Iterator[int] | int | None = None,
5827
- only_columns: Iterator[int] | int | None = None,
5835
+ only_rows: AnyIter[int] | int | None = None,
5836
+ only_columns: AnyIter[int] | int | None = None,
5828
5837
  ) -> list[object]:
5829
5838
  if only_rows is not None:
5830
5839
  if isinstance(only_rows, int):
@@ -5872,8 +5881,8 @@ class Sheet(tk.Frame):
5872
5881
  get_index: bool = False,
5873
5882
  get_index_displayed: bool = True,
5874
5883
  get_header_displayed: bool = True,
5875
- only_rows: int | Iterator[int] | None = None,
5876
- only_columns: int | Iterator[int] | None = None,
5884
+ only_rows: int | AnyIter[int] | None = None,
5885
+ only_columns: int | AnyIter[int] | None = None,
5877
5886
  ) -> Iterator[list[object]]:
5878
5887
  if only_rows is not None:
5879
5888
  if isinstance(only_rows, int):
@@ -6142,7 +6151,7 @@ class Sheet(tk.Frame):
6142
6151
 
6143
6152
  def highlight_rows(
6144
6153
  self,
6145
- rows: Iterator[int] | int,
6154
+ rows: AnyIter[int] | int,
6146
6155
  bg: None | str = None,
6147
6156
  fg: None | str = None,
6148
6157
  highlight_index: bool = True,
@@ -6160,7 +6169,7 @@ class Sheet(tk.Frame):
6160
6169
 
6161
6170
  def highlight_columns(
6162
6171
  self,
6163
- columns: Iterator[int] | int,
6172
+ columns: AnyIter[int] | int,
6164
6173
  bg: bool | None | str = False,
6165
6174
  fg: bool | None | str = False,
6166
6175
  highlight_header: bool = True,
@@ -6460,7 +6469,12 @@ class Sheet(tk.Frame):
6460
6469
  ) -> None:
6461
6470
  self.create_checkbox(r=r, c=c, **get_checkbox_kwargs(*args, **kwargs))
6462
6471
 
6463
- def checkbox_row(self, r: Iterator[int] | int | Literal["all"] = 0, *args, **kwargs) -> None:
6472
+ def checkbox_row(
6473
+ self,
6474
+ r: AnyIter[int] | int | Literal["all"] = 0,
6475
+ *args,
6476
+ **kwargs,
6477
+ ) -> None:
6464
6478
  kwargs = get_checkbox_kwargs(*args, **kwargs)
6465
6479
  d = get_checkbox_dict(**kwargs)
6466
6480
  if isinstance(r, str) and r.lower() == "all":
@@ -6482,7 +6496,7 @@ class Sheet(tk.Frame):
6482
6496
 
6483
6497
  def checkbox_column(
6484
6498
  self,
6485
- c: Iterator[int] | int | Literal["all"] = 0,
6499
+ c: AnyIter[int] | int | Literal["all"] = 0,
6486
6500
  *args,
6487
6501
  **kwargs,
6488
6502
  ) -> None:
@@ -6505,7 +6519,12 @@ class Sheet(tk.Frame):
6505
6519
  for r in range(self.MT.total_data_rows()):
6506
6520
  self.MT.set_cell_data(r, c, v)
6507
6521
 
6508
- def create_header_checkbox(self, c: Iterator[int] | int | Literal["all"] = 0, *args, **kwargs) -> None:
6522
+ def create_header_checkbox(
6523
+ self,
6524
+ c: AnyIter[int] | int | Literal["all"] = 0,
6525
+ *args,
6526
+ **kwargs,
6527
+ ) -> None:
6509
6528
  kwargs = get_checkbox_kwargs(*args, **kwargs)
6510
6529
  d = get_checkbox_dict(**kwargs)
6511
6530
  if isinstance(c, str) and c.lower() == "all":
@@ -6523,7 +6542,12 @@ class Sheet(tk.Frame):
6523
6542
  add_to_options(self.CH.cell_options, c, "checkbox", d)
6524
6543
  self.CH.set_cell_data(c, v)
6525
6544
 
6526
- def create_index_checkbox(self, r: Iterator[int] | int | Literal["all"] = 0, *args, **kwargs) -> None:
6545
+ def create_index_checkbox(
6546
+ self,
6547
+ r: AnyIter[int] | int | Literal["all"] = 0,
6548
+ *args,
6549
+ **kwargs,
6550
+ ) -> None:
6527
6551
  kwargs = get_checkbox_kwargs(*args, **kwargs)
6528
6552
  d = get_checkbox_dict(**kwargs)
6529
6553
  if isinstance(r, str) and r.lower() == "all":
@@ -6568,7 +6592,10 @@ class Sheet(tk.Frame):
6568
6592
  ) -> None:
6569
6593
  self.delete_checkbox(r, c)
6570
6594
 
6571
- def delete_row_checkbox(self, r: Iterator[int] | int | Literal["all"] = 0) -> None:
6595
+ def delete_row_checkbox(
6596
+ self,
6597
+ r: AnyIter[int] | int | Literal["all"] = 0,
6598
+ ) -> None:
6572
6599
  if isinstance(r, str) and r.lower() == "all":
6573
6600
  for r_ in self.MT.row_options:
6574
6601
  self.del_table_row_options_checkbox(r_)
@@ -6578,7 +6605,10 @@ class Sheet(tk.Frame):
6578
6605
  for r_ in r:
6579
6606
  self.del_table_row_options_checkbox(r_)
6580
6607
 
6581
- def delete_column_checkbox(self, c: Iterator[int] | int | Literal["all"] = 0) -> None:
6608
+ def delete_column_checkbox(
6609
+ self,
6610
+ c: AnyIter[int] | int | Literal["all"] = 0,
6611
+ ) -> None:
6582
6612
  if isinstance(c, str) and c.lower() == "all":
6583
6613
  for c_ in self.MT.col_options:
6584
6614
  self.del_table_column_options_checkbox(c_)
@@ -6588,7 +6618,10 @@ class Sheet(tk.Frame):
6588
6618
  for c_ in c:
6589
6619
  self.del_table_column_options_checkbox(c_)
6590
6620
 
6591
- def delete_header_checkbox(self, c: Iterator[int] | int | Literal["all"] = 0) -> None:
6621
+ def delete_header_checkbox(
6622
+ self,
6623
+ c: AnyIter[int] | int | Literal["all"] = 0,
6624
+ ) -> None:
6592
6625
  if isinstance(c, str) and c.lower() == "all":
6593
6626
  for c_ in self.CH.cell_options:
6594
6627
  if "checkbox" in self.CH.cell_options[c_]:
@@ -6599,7 +6632,10 @@ class Sheet(tk.Frame):
6599
6632
  for c_ in c:
6600
6633
  self.del_header_cell_options_checkbox(c_)
6601
6634
 
6602
- def delete_index_checkbox(self, r: Iterator[int] | int | Literal["all"] = 0) -> None:
6635
+ def delete_index_checkbox(
6636
+ self,
6637
+ r: AnyIter[int] | int | Literal["all"] = 0,
6638
+ ) -> None:
6603
6639
  if isinstance(r, str) and r.lower() == "all":
6604
6640
  for r_ in self.RI.cell_options:
6605
6641
  if "checkbox" in self.RI.cell_options[r_]:
@@ -6688,7 +6724,7 @@ class Sheet(tk.Frame):
6688
6724
 
6689
6725
  def dropdown_row(
6690
6726
  self,
6691
- r: Iterator[int] | int | Literal["all"] = 0,
6727
+ r: AnyIter[int] | int | Literal["all"] = 0,
6692
6728
  *args,
6693
6729
  **kwargs,
6694
6730
  ) -> Sheet:
@@ -6713,7 +6749,7 @@ class Sheet(tk.Frame):
6713
6749
 
6714
6750
  def dropdown_column(
6715
6751
  self,
6716
- c: Iterator[int] | int | Literal["all"] = 0,
6752
+ c: AnyIter[int] | int | Literal["all"] = 0,
6717
6753
  *args,
6718
6754
  **kwargs,
6719
6755
  ) -> Sheet:
@@ -6738,7 +6774,7 @@ class Sheet(tk.Frame):
6738
6774
 
6739
6775
  def create_header_dropdown(
6740
6776
  self,
6741
- c: Iterator[int] | int | Literal["all"] = 0,
6777
+ c: AnyIter[int] | int | Literal["all"] = 0,
6742
6778
  *args,
6743
6779
  **kwargs,
6744
6780
  ) -> Sheet:
@@ -6762,7 +6798,7 @@ class Sheet(tk.Frame):
6762
6798
 
6763
6799
  def create_index_dropdown(
6764
6800
  self,
6765
- r: Iterator[int] | int | Literal["all"] = 0,
6801
+ r: AnyIter[int] | int | Literal["all"] = 0,
6766
6802
  *args,
6767
6803
  **kwargs,
6768
6804
  ) -> Sheet:
@@ -6813,7 +6849,7 @@ class Sheet(tk.Frame):
6813
6849
 
6814
6850
  def delete_row_dropdown(
6815
6851
  self,
6816
- r: Iterator[int] | int | Literal["all"] = "all",
6852
+ r: AnyIter[int] | int | Literal["all"] = "all",
6817
6853
  ) -> None:
6818
6854
  if isinstance(r, str) and r.lower() == "all":
6819
6855
  for r_ in self.MT.row_options:
@@ -6827,7 +6863,7 @@ class Sheet(tk.Frame):
6827
6863
 
6828
6864
  def delete_column_dropdown(
6829
6865
  self,
6830
- c: Iterator[int] | int | Literal["all"] = "all",
6866
+ c: AnyIter[int] | int | Literal["all"] = "all",
6831
6867
  ) -> None:
6832
6868
  if isinstance(c, str) and c.lower() == "all":
6833
6869
  for c_ in self.MT.col_options:
@@ -6839,7 +6875,7 @@ class Sheet(tk.Frame):
6839
6875
  for c_ in c:
6840
6876
  self.del_column_options_dropdown(datacn=c_)
6841
6877
 
6842
- def delete_header_dropdown(self, c: Iterator[int] | int | Literal["all"]) -> None:
6878
+ def delete_header_dropdown(self, c: AnyIter[int] | int | Literal["all"]) -> None:
6843
6879
  if isinstance(c, str) and c.lower() == "all":
6844
6880
  for c_ in self.CH.cell_options:
6845
6881
  if "dropdown" in self.CH.cell_options[c_]:
@@ -6850,7 +6886,7 @@ class Sheet(tk.Frame):
6850
6886
  for c_ in c:
6851
6887
  self.del_header_cell_options_dropdown(c_)
6852
6888
 
6853
- def delete_index_dropdown(self, r: Iterator[int] | int | Literal["all"]) -> None:
6889
+ def delete_index_dropdown(self, r: AnyIter[int] | int | Literal["all"]) -> None:
6854
6890
  if isinstance(r, str) and r.lower() == "all":
6855
6891
  for r_ in self.RI.cell_options:
6856
6892
  if "dropdown" in self.RI.cell_options[r_]:
@@ -7079,7 +7115,7 @@ class Sheet(tk.Frame):
7079
7115
 
7080
7116
  def format_row(
7081
7117
  self,
7082
- r: Iterator[int] | int | Literal["all"],
7118
+ r: AnyIter[int] | int | Literal["all"],
7083
7119
  formatter_options: dict = {},
7084
7120
  formatter_class: object = None,
7085
7121
  redraw: bool = True,
@@ -7109,7 +7145,7 @@ class Sheet(tk.Frame):
7109
7145
 
7110
7146
  def delete_row_format(
7111
7147
  self,
7112
- r: Iterator[int] | int | Literal["all"] = "all",
7148
+ r: AnyIter[int] | int | Literal["all"] = "all",
7113
7149
  clear_values: bool = False,
7114
7150
  ) -> Sheet:
7115
7151
  if is_iterable(r):
@@ -7121,7 +7157,7 @@ class Sheet(tk.Frame):
7121
7157
 
7122
7158
  def format_column(
7123
7159
  self,
7124
- c: Iterator[int] | int | Literal["all"],
7160
+ c: AnyIter[int] | int | Literal["all"],
7125
7161
  formatter_options: dict = {},
7126
7162
  formatter_class: object = None,
7127
7163
  redraw: bool = True,
@@ -7151,7 +7187,7 @@ class Sheet(tk.Frame):
7151
7187
 
7152
7188
  def delete_column_format(
7153
7189
  self,
7154
- c: Iterator[int] | int | Literal["all"] = "all",
7190
+ c: AnyIter[int] | int | Literal["all"] = "all",
7155
7191
  clear_values: bool = False,
7156
7192
  ) -> Sheet:
7157
7193
  if is_iterable(c):
tksheet/sheet_options.py CHANGED
@@ -103,6 +103,20 @@ def new_sheet_options() -> DotDict:
103
103
  "select_all_bindings": [
104
104
  f"<{ctrl_key}-a>",
105
105
  f"<{ctrl_key}-A>",
106
+ f"<{ctrl_key}-Shift-space>",
107
+ ],
108
+ "select_columns_bindings": [
109
+ "<Control-space>",
110
+ ],
111
+ "select_rows_bindings": [
112
+ "<Shift-space>",
113
+ ],
114
+ "row_start_bindings": [
115
+ "<Command-Left>",
116
+ "<Home>",
117
+ ],
118
+ "table_start_bindings": [
119
+ f"<{ctrl_key}-Home>",
106
120
  ],
107
121
  "tab_bindings": [
108
122
  "<Tab>",
tksheet/types.py CHANGED
@@ -1,3 +1,9 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import (
4
+ Iterable,
5
+ Iterator,
6
+ )
1
7
  from typing import Tuple, Union
2
8
 
3
9
  from .other_classes import (
@@ -15,3 +21,5 @@ CreateSpanTypes = Union[
15
21
  Tuple[int, None, int, None, int, None, int, None],
16
22
  Span,
17
23
  ]
24
+
25
+ AnyIter = Iterable | Iterator
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.3.0
3
+ Version: 7.3.1
4
4
  Summary: Tkinter table / sheet widget
5
5
  Author-email: ragardner <github@ragardner.simplelogin.com>
6
6
  License: Copyright (c) 2019 ragardner and open source contributors
@@ -0,0 +1,20 @@
1
+ tksheet/__init__.py,sha256=D2eEiYomTgytJd1HZ-b4qwbtJnpbRa5Dh-EcE_EsYWE,2236
2
+ tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
+ tksheet/column_headers.py,sha256=9HcSz_rEPM3pelnYfrQr4AI7LR1C8Ae3GTQY9eNhMOw,102876
4
+ tksheet/formatters.py,sha256=_exO2KnjtcnE_MVWLG1ngOZ-wmrXZhuh7uEi2iPs1Tk,10546
5
+ tksheet/functions.py,sha256=egowBJuShOPuNiX46v9M8E5pzPiX2FrobCqVgKLBKWo,43482
6
+ tksheet/main_table.py,sha256=9SDXmEc-uqM58iovq52s_VgI_Ykt4i42-65-YzxDviU,337745
7
+ tksheet/other_classes.py,sha256=cYcu8TYgGdsJ6ZGG51AQFVrzj7Lu0LwAn62V7iUh_mc,16488
8
+ tksheet/row_index.py,sha256=RiIfxCfDZgDEPb7OwwCSo8O4hY1Lkh8P6p_YkHE7bWc,111666
9
+ tksheet/sheet.py,sha256=dI8tg6fLZH2Zvmm5q1NhYDd_RH6jghUA8BMuPeeazus,289010
10
+ tksheet/sheet_options.py,sha256=YzZWhqmZgrZqdR4NZV8Xe8xRgs5_2MHpUlBSDUhXHzY,7429
11
+ tksheet/text_editor.py,sha256=zrBdURBFNBbnl8GmZ4vQMFZ3UmvAvfBZ7KSJi_WtrNI,7449
12
+ tksheet/themes.py,sha256=AoNAxibnQi04MN0Zpbn9-kyDnkiiV8TDNWP9FYjpuf0,18473
13
+ tksheet/top_left_rectangle.py,sha256=0vzhYK7oGe9M_v7mlxFLh595XuXuXDOjooCDuR5sqnM,8593
14
+ tksheet/types.py,sha256=4NIFPmq64g1vcbApWzLJrOZ8xhcRcOh2wCAzdn5LS2w,475
15
+ tksheet/vars.py,sha256=-NWaHEEpcQ0YHn4yGDf8SSffjceiEOayGqnEYw6VwPM,3507
16
+ tksheet-7.3.1.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
+ tksheet-7.3.1.dist-info/METADATA,sha256=5Xbqc5dFTlp-UFOdDr1g7zmoFI7JE9moRklUMsm1_m8,7282
18
+ tksheet-7.3.1.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
19
+ tksheet-7.3.1.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
+ tksheet-7.3.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.7.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,20 +0,0 @@
1
- tksheet/__init__.py,sha256=og5YQbRL0wYfgixmKn9svO5aBxbujfvRhBsWlhmOtVs,2236
2
- tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
- tksheet/column_headers.py,sha256=qNDoJoERLKs9hG9rVgclIk-HAZkmJ6Y6qwvdlCa2-l8,102502
4
- tksheet/formatters.py,sha256=_exO2KnjtcnE_MVWLG1ngOZ-wmrXZhuh7uEi2iPs1Tk,10546
5
- tksheet/functions.py,sha256=v9_YH1-6cQ-tixl-P2ZR0bGNOsOa6FyYMwBsAl1YLrQ,43224
6
- tksheet/main_table.py,sha256=6rhc4RtK4s8Mh5bhq_hyVlX56l-1B7a2D1WWd3nfacI,334819
7
- tksheet/other_classes.py,sha256=cYcu8TYgGdsJ6ZGG51AQFVrzj7Lu0LwAn62V7iUh_mc,16488
8
- tksheet/row_index.py,sha256=oe71E_Y3nj5dhbRTw5DhYDgqxPlL0mGYmaZaMu8AP5w,111295
9
- tksheet/sheet.py,sha256=vMsZdciGrNvg0xcDaVAbadlHhCDj_XAy3HgXIz63FPw,288653
10
- tksheet/sheet_options.py,sha256=j2e0ij8Pf9ey85GKuMXoCDMkFGJVcDk3t_NNVlBGbuI,6991
11
- tksheet/text_editor.py,sha256=zrBdURBFNBbnl8GmZ4vQMFZ3UmvAvfBZ7KSJi_WtrNI,7449
12
- tksheet/themes.py,sha256=AoNAxibnQi04MN0Zpbn9-kyDnkiiV8TDNWP9FYjpuf0,18473
13
- tksheet/top_left_rectangle.py,sha256=0vzhYK7oGe9M_v7mlxFLh595XuXuXDOjooCDuR5sqnM,8593
14
- tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
15
- tksheet/vars.py,sha256=-NWaHEEpcQ0YHn4yGDf8SSffjceiEOayGqnEYw6VwPM,3507
16
- tksheet-7.3.0.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
- tksheet-7.3.0.dist-info/METADATA,sha256=Fheob3WhJC4xXiBM01uelrZdxT0pVu-p_t6JQmziReI,7282
18
- tksheet-7.3.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
19
- tksheet-7.3.0.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
- tksheet-7.3.0.dist-info/RECORD,,