tksheet 7.4.8__py3-none-any.whl → 7.4.10__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
@@ -87,7 +87,7 @@ from .themes import (
87
87
  theme_light_blue,
88
88
  theme_light_green,
89
89
  )
90
- from .tksheet_types import AnyIter, Binding, CellPropertyKey, CreateSpanTypes, ExtraBinding
90
+ from .tksheet_types import Binding, CellPropertyKey, CreateSpanTypes, ExtraBinding
91
91
  from .top_left_rectangle import TopLeftRectangle
92
92
 
93
93
 
@@ -543,7 +543,7 @@ class Sheet(tk.Frame):
543
543
  def set_header_data(
544
544
  self,
545
545
  value: Any,
546
- c: int | None | AnyIter[int] = None,
546
+ c: int | None | Iterator[int] = None,
547
547
  redraw: bool = True,
548
548
  ) -> Sheet:
549
549
  if c is None:
@@ -579,7 +579,7 @@ class Sheet(tk.Frame):
579
579
  def set_index_data(
580
580
  self,
581
581
  value: Any,
582
- r: int | None | AnyIter[int] = None,
582
+ r: int | None | Iterator[int] = None,
583
583
  redraw: bool = True,
584
584
  ) -> Sheet:
585
585
  if r is None:
@@ -1048,7 +1048,7 @@ class Sheet(tk.Frame):
1048
1048
  def get_data(self, *key: CreateSpanTypes) -> Any:
1049
1049
  """
1050
1050
  e.g. retrieves entire table as pandas dataframe
1051
- sheet["A1"].expand().options(pandas.DataFrame).data
1051
+ sheet["A1"].expand().options(convert=pandas.DataFrame).data
1052
1052
 
1053
1053
  must deal with
1054
1054
  - format
@@ -1107,56 +1107,48 @@ class Sheet(tk.Frame):
1107
1107
  """
1108
1108
  span = self.span_from_key(*key)
1109
1109
  rows, cols = self.ranges_from_span(span)
1110
- tdisp, idisp, hdisp = span.tdisp, span.idisp, span.hdisp
1111
1110
  table, index, header = span.table, span.index, span.header
1112
1111
  fmt_kw = span.kwargs if span.type_ == "format" and span.kwargs else None
1113
- quick_tdata, quick_idata, quick_hdata = self.MT.get_cell_data, self.RI.get_cell_data, self.CH.get_cell_data
1112
+ t_data = partial(self.MT.get_cell_data, get_displayed=True) if span.tdisp else self.MT.get_cell_data
1113
+ i_data = self.RI.cell_str if span.idisp else self.RI.get_cell_data
1114
+ h_data = self.CH.cell_str if span.hdisp else self.CH.get_cell_data
1114
1115
  res = []
1115
1116
  if span.transposed:
1117
+ # Index row (first row when transposed)
1116
1118
  if index:
1117
- if index and header:
1118
- if table:
1119
- res.append([""] + [quick_idata(r, get_displayed=idisp) for r in rows])
1120
- else:
1121
- res.append([quick_idata(r, get_displayed=idisp) for r in rows])
1122
- else:
1123
- res.append([quick_idata(r, get_displayed=idisp) for r in rows])
1119
+ index_row = [""] if header and table else []
1120
+ index_row.extend(i_data(r) for r in rows)
1121
+ res.append(index_row)
1122
+ # Header and/or table data as columns
1124
1123
  if header:
1125
- if table:
1126
- res.extend(
1127
- [quick_hdata(c, get_displayed=hdisp)]
1128
- + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows]
1129
- for c in cols
1130
- )
1131
- else:
1132
- res.extend([quick_hdata(c, get_displayed=hdisp)] for c in cols)
1124
+ for c in cols:
1125
+ col = [h_data(c)]
1126
+ if table:
1127
+ col.extend(t_data(r, c, fmt_kw=fmt_kw) for r in rows)
1128
+ res.append(col)
1133
1129
  elif table:
1134
- res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows] for c in cols)
1135
- elif not span.transposed:
1130
+ res.extend([t_data(r, c, fmt_kw=fmt_kw) for r in rows] for c in cols)
1131
+ else:
1132
+ # Header row
1136
1133
  if header:
1137
- if header and index:
1138
- if table:
1139
- res.append([""] + [quick_hdata(c, get_displayed=hdisp) for c in cols])
1140
- else:
1141
- res.append([quick_hdata(c, get_displayed=hdisp) for c in cols])
1142
- else:
1143
- res.append([quick_hdata(c, get_displayed=hdisp) for c in cols])
1134
+ header_row = [""] if index and table else []
1135
+ header_row.extend(h_data(c) for c in cols)
1136
+ res.append(header_row)
1137
+ # Index and/or table data as rows
1144
1138
  if index:
1145
- if table:
1146
- res.extend(
1147
- [quick_idata(r, get_displayed=idisp)]
1148
- + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols]
1149
- for r in rows
1150
- )
1151
- else:
1152
- res.extend([quick_idata(r, get_displayed=idisp)] for r in rows)
1139
+ for r in rows:
1140
+ row = [i_data(r)]
1141
+ if table:
1142
+ row.extend(t_data(r, c, fmt_kw=fmt_kw) for c in cols)
1143
+ res.append(row)
1153
1144
  elif table:
1154
- res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols] for r in rows)
1145
+ res.extend([t_data(r, c, fmt_kw=fmt_kw) for c in cols] for r in rows)
1146
+
1155
1147
  if not span.ndim:
1156
1148
  # it's a cell
1157
1149
  if len(res) == 1 and len(res[0]) == 1:
1158
1150
  res = res[0][0]
1159
- # it's a single list
1151
+ # it's a single sublist
1160
1152
  elif len(res) == 1:
1161
1153
  res = res[0]
1162
1154
  # retrieving a list of index cells or
@@ -1168,11 +1160,12 @@ class Sheet(tk.Frame):
1168
1160
  elif span.ndim == 1:
1169
1161
  # flatten sublists
1170
1162
  res = res[0] if len(res) == 1 and len(res[0]) == 1 else list(chain.from_iterable(res))
1171
- # if span.ndim == 2 res keeps its current
1172
- # dimensions as a list of lists
1173
- if span.convert is not None:
1163
+ # if span.ndim == 2 res keeps its current dimensions as a list of lists
1164
+
1165
+ if span.convert is None:
1166
+ return res
1167
+ else:
1174
1168
  return span.convert(res)
1175
- return res
1176
1169
 
1177
1170
  def get_total_rows(self, include_index: bool = False) -> int:
1178
1171
  return self.MT.total_data_rows(include_index=include_index)
@@ -1308,6 +1301,7 @@ class Sheet(tk.Frame):
1308
1301
  undo: bool | None = None,
1309
1302
  emit_event: bool | None = None,
1310
1303
  redraw: bool = True,
1304
+ event_data: EventDataDict | None = None,
1311
1305
  ) -> EventDataDict:
1312
1306
  """
1313
1307
  e.g.
@@ -1364,12 +1358,13 @@ class Sheet(tk.Frame):
1364
1358
  fmt_kw = span.kwargs if span.type_ == "format" and span.kwargs else None
1365
1359
  transposed = span.transposed
1366
1360
  maxr, maxc = startr, startc
1367
- event_data = event_dict(
1368
- name="edit_table",
1369
- sheet=self.name,
1370
- widget=self,
1371
- selected=self.MT.selected,
1372
- )
1361
+ if event_data is None:
1362
+ event_data = event_dict(
1363
+ name="edit_table",
1364
+ sheet=self.name,
1365
+ widget=self,
1366
+ selected=self.MT.selected,
1367
+ )
1373
1368
  set_t = self.event_data_set_table_cell
1374
1369
  set_i, set_h = self.event_data_set_index_cell, self.event_data_set_header_cell
1375
1370
  istart = 1 if index else 0
@@ -1540,28 +1535,32 @@ class Sheet(tk.Frame):
1540
1535
  event_data = set_h(startc, data, event_data)
1541
1536
  # add row/column lines (positions) if required
1542
1537
  if self.MT.all_columns_displayed and maxc >= (ncols := len(self.MT.col_positions) - 1):
1538
+ _, _, widths = self.MT.get_args_for_add_columns(
1539
+ data_ins_col=len(self.MT.col_positions) - 1,
1540
+ displayed_ins_col=len(self.MT.col_positions) - 1,
1541
+ columns=maxc + 1 - ncols,
1542
+ widths=None,
1543
+ headers=False,
1544
+ )
1543
1545
  event_data = self.MT.add_columns(
1544
- *self.MT.get_args_for_add_columns(
1545
- data_ins_col=len(self.MT.col_positions) - 1,
1546
- displayed_ins_col=len(self.MT.col_positions) - 1,
1547
- numcols=maxc + 1 - ncols,
1548
- columns=[],
1549
- widths=None,
1550
- headers=False,
1551
- ),
1546
+ columns={},
1547
+ header={},
1548
+ column_widths=widths,
1552
1549
  event_data=event_data,
1553
1550
  create_selections=False,
1554
1551
  )
1555
1552
  if self.MT.all_rows_displayed and maxr >= (nrows := len(self.MT.row_positions) - 1):
1553
+ _, _, heights = self.MT.get_args_for_add_rows(
1554
+ data_ins_row=len(self.MT.row_positions) - 1,
1555
+ displayed_ins_row=len(self.MT.row_positions) - 1,
1556
+ rows=maxr + 1 - nrows,
1557
+ heights=None,
1558
+ row_index=False,
1559
+ )
1556
1560
  event_data = self.MT.add_rows(
1557
- *self.MT.get_args_for_add_rows(
1558
- data_ins_row=len(self.MT.row_positions) - 1,
1559
- displayed_ins_row=len(self.MT.row_positions) - 1,
1560
- numrows=maxr + 1 - nrows,
1561
- rows=[],
1562
- heights=None,
1563
- row_index=False,
1564
- ),
1561
+ rows={},
1562
+ index={},
1563
+ row_heights=heights,
1565
1564
  event_data=event_data,
1566
1565
  create_selections=False,
1567
1566
  )
@@ -1703,7 +1702,7 @@ class Sheet(tk.Frame):
1703
1702
 
1704
1703
  def insert_rows(
1705
1704
  self,
1706
- rows: list[tuple[Any] | list[Any]] | tuple[tuple[Any] | list[Any]] | int = 1,
1705
+ rows: Iterator[list[Any]] | int = 1,
1707
1706
  idx: str | int | None = None,
1708
1707
  heights: list[int] | tuple[int] | None = None,
1709
1708
  row_index: bool = False,
@@ -1722,34 +1721,10 @@ class Sheet(tk.Frame):
1722
1721
  if isinstance(rows, int):
1723
1722
  if rows < 1:
1724
1723
  raise ValueError(f"rows arg must be greater than 0, not {rows}")
1725
- total_cols = self.MT.total_data_cols()
1726
- if row_index:
1727
- data = [
1728
- [self.RI.get_value_for_empty_cell(idx + i, r_ops=False)]
1729
- + self.MT.get_empty_row_seq(
1730
- idx + i,
1731
- total_cols,
1732
- r_ops=False,
1733
- c_ops=False,
1734
- )
1735
- for i in range(rows)
1736
- ]
1737
- else:
1738
- data = [
1739
- self.MT.get_empty_row_seq(
1740
- idx + i,
1741
- total_cols,
1742
- r_ops=False,
1743
- c_ops=False,
1744
- )
1745
- for i in range(rows)
1746
- ]
1747
- else:
1748
- data = rows
1749
- if not isinstance(rows, int) and fill:
1724
+ elif fill:
1750
1725
  total_cols = self.MT.total_data_cols() if total_cols is None else total_cols
1751
1726
  len_check = (total_cols + 1) if row_index else total_cols
1752
- for rn, r in enumerate(data):
1727
+ for rn, r in enumerate(rows):
1753
1728
  if len_check > (lnr := len(r)):
1754
1729
  r += self.MT.get_empty_row_seq(
1755
1730
  rn,
@@ -1758,14 +1733,11 @@ class Sheet(tk.Frame):
1758
1733
  r_ops=False,
1759
1734
  c_ops=False,
1760
1735
  )
1761
- numrows = len(data)
1762
- displayed_ins_idx = idx if self.MT.all_rows_displayed else bisect_left(self.MT.displayed_rows, idx)
1763
1736
  event_data = self.MT.add_rows(
1764
1737
  *self.MT.get_args_for_add_rows(
1765
1738
  data_ins_row=idx,
1766
- displayed_ins_row=displayed_ins_idx,
1767
- numrows=numrows,
1768
- rows=data,
1739
+ displayed_ins_row=idx if self.MT.all_rows_displayed else bisect_left(self.MT.displayed_rows, idx),
1740
+ rows=rows,
1769
1741
  heights=heights,
1770
1742
  row_index=row_index,
1771
1743
  ),
@@ -1784,7 +1756,7 @@ class Sheet(tk.Frame):
1784
1756
 
1785
1757
  def insert_columns(
1786
1758
  self,
1787
- columns: list[tuple[Any] | list[Any]] | tuple[tuple[Any] | list[Any]] | int = 1,
1759
+ columns: Iterator[list[Any]] | int = 1,
1788
1760
  idx: str | int | None = None,
1789
1761
  widths: list[int] | tuple[int] | None = None,
1790
1762
  headers: bool = False,
@@ -1803,60 +1775,24 @@ class Sheet(tk.Frame):
1803
1775
  if isinstance(columns, int):
1804
1776
  if columns < 1:
1805
1777
  raise ValueError(f"columns arg must be greater than 0, not {columns}")
1806
- if headers:
1807
- data = [
1808
- [self.CH.get_value_for_empty_cell(datacn, c_ops=False)]
1809
- + [
1810
- self.MT.get_value_for_empty_cell(
1811
- datarn,
1812
- datacn,
1813
- r_ops=False,
1814
- c_ops=False,
1815
- )
1816
- for datarn in range(total_rows)
1817
- ]
1818
- for datacn in range(idx, idx + columns)
1819
- ]
1820
- else:
1821
- data = [
1822
- [
1778
+ elif fill:
1779
+ len_check = (total_rows + 1) if headers else total_rows
1780
+ for i, column in enumerate(columns):
1781
+ if (col_len := len(column)) < len_check:
1782
+ column += [
1823
1783
  self.MT.get_value_for_empty_cell(
1824
- datarn,
1825
- datacn,
1784
+ r,
1785
+ idx + i,
1826
1786
  r_ops=False,
1827
1787
  c_ops=False,
1828
1788
  )
1829
- for datarn in range(total_rows)
1789
+ for r in range((col_len - 1) if headers else col_len, total_rows)
1830
1790
  ]
1831
- for datacn in range(idx, idx + columns)
1832
- ]
1833
- numcols = columns
1834
- else:
1835
- data = columns
1836
- numcols = len(columns)
1837
- if fill:
1838
- len_check = (total_rows + 1) if headers else total_rows
1839
- for i, column in enumerate(data):
1840
- if (col_len := len(column)) < len_check:
1841
- column += [
1842
- self.MT.get_value_for_empty_cell(
1843
- r,
1844
- idx + i,
1845
- r_ops=False,
1846
- c_ops=False,
1847
- )
1848
- for r in range((col_len - 1) if headers else col_len, total_rows)
1849
- ]
1850
- if self.MT.all_columns_displayed:
1851
- displayed_ins_idx = idx
1852
- elif not self.MT.all_columns_displayed:
1853
- displayed_ins_idx = bisect_left(self.MT.displayed_columns, idx)
1854
1791
  event_data = self.MT.add_columns(
1855
1792
  *self.MT.get_args_for_add_columns(
1856
1793
  data_ins_col=idx,
1857
- displayed_ins_col=displayed_ins_idx,
1858
- numcols=numcols,
1859
- columns=data,
1794
+ displayed_ins_col=idx if self.MT.all_columns_displayed else bisect_left(self.MT.displayed_columns, idx),
1795
+ columns=columns,
1860
1796
  widths=widths,
1861
1797
  headers=headers,
1862
1798
  ),
@@ -1874,7 +1810,7 @@ class Sheet(tk.Frame):
1874
1810
 
1875
1811
  def del_rows(
1876
1812
  self,
1877
- rows: int | AnyIter[int],
1813
+ rows: int | Iterator[int],
1878
1814
  data_indexes: bool = True,
1879
1815
  undo: bool = True,
1880
1816
  emit_event: bool = False,
@@ -1895,7 +1831,7 @@ class Sheet(tk.Frame):
1895
1831
 
1896
1832
  def del_columns(
1897
1833
  self,
1898
- columns: int | AnyIter[int],
1834
+ columns: int | Iterator[int],
1899
1835
  data_indexes: bool = True,
1900
1836
  undo: bool = True,
1901
1837
  emit_event: bool = False,
@@ -2187,7 +2123,7 @@ class Sheet(tk.Frame):
2187
2123
 
2188
2124
  def sort_rows(
2189
2125
  self,
2190
- rows: AnyIter[int] | Span | int | None = None,
2126
+ rows: Iterator[int] | Span | int | None = None,
2191
2127
  reverse: bool = False,
2192
2128
  validation: bool = True,
2193
2129
  key: Callable | None = None,
@@ -2201,7 +2137,7 @@ class Sheet(tk.Frame):
2201
2137
 
2202
2138
  def sort_columns(
2203
2139
  self,
2204
- columns: AnyIter[int] | Span | int | None = None,
2140
+ columns: Iterator[int] | Span | int | None = None,
2205
2141
  reverse: bool = False,
2206
2142
  validation: bool = True,
2207
2143
  key: Callable | None = None,
@@ -2533,13 +2469,13 @@ class Sheet(tk.Frame):
2533
2469
  self.del_index_cell_options_dropdown_and_checkbox(r)
2534
2470
  add_to_options(self.RI.cell_options, r, "checkbox", d)
2535
2471
  if edit_data:
2536
- set_idata(r, checked if isinstance(checked, bool) else force_bool(self.get_index_data(r)))
2472
+ set_idata(r, checked if isinstance(checked, bool) else force_bool(self.RI.get_cell_data(r)))
2537
2473
  if header:
2538
2474
  for c in cols:
2539
2475
  self.del_header_cell_options_dropdown_and_checkbox(c)
2540
2476
  add_to_options(self.CH.cell_options, c, "checkbox", d)
2541
2477
  if edit_data:
2542
- set_hdata(c, checked if isinstance(checked, bool) else force_bool(self.get_header_data(c)))
2478
+ set_hdata(c, checked if isinstance(checked, bool) else force_bool(self.CH.get_cell_data(c)))
2543
2479
  if table:
2544
2480
  if span.kind == "cell":
2545
2481
  for r in rows:
@@ -3190,8 +3126,8 @@ class Sheet(tk.Frame):
3190
3126
 
3191
3127
  def deselect_any(
3192
3128
  self,
3193
- rows: AnyIter[int] | int | None,
3194
- columns: AnyIter[int] | int | None,
3129
+ rows: Iterator[int] | int | None,
3130
+ columns: Iterator[int] | int | None,
3195
3131
  redraw: bool = True,
3196
3132
  ) -> Sheet:
3197
3133
  self.MT.deselect_any(rows=rows, columns=columns, redraw=False)
@@ -3393,7 +3329,7 @@ class Sheet(tk.Frame):
3393
3329
 
3394
3330
  def set_column_widths(
3395
3331
  self,
3396
- column_widths: AnyIter[float] | None = None,
3332
+ column_widths: Iterator[float] | None = None,
3397
3333
  canvas_positions: bool = False,
3398
3334
  reset: bool = False,
3399
3335
  ) -> Sheet:
@@ -3408,7 +3344,7 @@ class Sheet(tk.Frame):
3408
3344
 
3409
3345
  def set_row_heights(
3410
3346
  self,
3411
- row_heights: AnyIter[float] | None = None,
3347
+ row_heights: Iterator[float] | None = None,
3412
3348
  canvas_positions: bool = False,
3413
3349
  reset: bool = False,
3414
3350
  ) -> Sheet:
@@ -3455,7 +3391,7 @@ class Sheet(tk.Frame):
3455
3391
 
3456
3392
  delete_row_position = del_row_position
3457
3393
 
3458
- def del_row_positions(self, idxs: AnyIter[int] | None = None) -> Sheet:
3394
+ def del_row_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
3459
3395
  self.MT.del_row_positions(idxs=idxs)
3460
3396
  self.set_refresh_timer()
3461
3397
  return self
@@ -3466,7 +3402,7 @@ class Sheet(tk.Frame):
3466
3402
 
3467
3403
  delete_column_position = del_column_position
3468
3404
 
3469
- def del_column_positions(self, idxs: AnyIter[int] | None = None) -> Sheet:
3405
+ def del_column_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
3470
3406
  self.MT.del_col_positions(idxs=idxs)
3471
3407
  self.set_refresh_timer()
3472
3408
  return self
@@ -3743,7 +3679,7 @@ class Sheet(tk.Frame):
3743
3679
 
3744
3680
  def display_columns(
3745
3681
  self,
3746
- columns: None | Literal["all"] | AnyIter[int] = None,
3682
+ columns: None | Literal["all"] | Iterator[int] = None,
3747
3683
  all_columns_displayed: None | bool = None,
3748
3684
  reset_col_positions: bool = True,
3749
3685
  redraw: bool = False,
@@ -3767,7 +3703,7 @@ class Sheet(tk.Frame):
3767
3703
 
3768
3704
  def hide_columns(
3769
3705
  self,
3770
- columns: int | set[int] | AnyIter[int],
3706
+ columns: int | set[int] | Iterator[int],
3771
3707
  redraw: bool = True,
3772
3708
  deselect_all: bool = True,
3773
3709
  data_indexes: bool = False,
@@ -3811,7 +3747,7 @@ class Sheet(tk.Frame):
3811
3747
 
3812
3748
  def show_columns(
3813
3749
  self,
3814
- columns: int | AnyIter[int],
3750
+ columns: int | Iterator[int],
3815
3751
  redraw: bool = True,
3816
3752
  deselect_all: bool = True,
3817
3753
  ) -> Sheet:
@@ -3878,7 +3814,7 @@ class Sheet(tk.Frame):
3878
3814
 
3879
3815
  def display_rows(
3880
3816
  self,
3881
- rows: None | Literal["all"] | AnyIter[int] = None,
3817
+ rows: None | Literal["all"] | Iterator[int] = None,
3882
3818
  all_rows_displayed: None | bool = None,
3883
3819
  reset_row_positions: bool = True,
3884
3820
  redraw: bool = False,
@@ -3900,7 +3836,7 @@ class Sheet(tk.Frame):
3900
3836
 
3901
3837
  def hide_rows(
3902
3838
  self,
3903
- rows: int | set[int] | AnyIter[int],
3839
+ rows: int | set[int] | Iterator[int],
3904
3840
  redraw: bool = True,
3905
3841
  deselect_all: bool = True,
3906
3842
  data_indexes: bool = False,
@@ -3946,7 +3882,7 @@ class Sheet(tk.Frame):
3946
3882
 
3947
3883
  def show_rows(
3948
3884
  self,
3949
- rows: int | AnyIter[int],
3885
+ rows: int | Iterator[int],
3950
3886
  redraw: bool = True,
3951
3887
  deselect_all: bool = True,
3952
3888
  ) -> Sheet:
@@ -4506,7 +4442,7 @@ class Sheet(tk.Frame):
4506
4442
  def tag(
4507
4443
  self,
4508
4444
  *key: CreateSpanTypes,
4509
- tags: AnyIter[str] | str = "",
4445
+ tags: Iterator[str] | str = "",
4510
4446
  ) -> Sheet:
4511
4447
  span = self.span_from_key(*key)
4512
4448
  rows, cols = self.ranges_from_span(span)
@@ -4551,7 +4487,7 @@ class Sheet(tk.Frame):
4551
4487
 
4552
4488
  def tag_rows(
4553
4489
  self,
4554
- rows: int | AnyIter[int],
4490
+ rows: int | Iterator[int],
4555
4491
  *tags,
4556
4492
  ) -> Sheet:
4557
4493
  if isinstance(rows, int):
@@ -4564,7 +4500,7 @@ class Sheet(tk.Frame):
4564
4500
 
4565
4501
  def tag_columns(
4566
4502
  self,
4567
- columns: int | AnyIter[int],
4503
+ columns: int | Iterator[int],
4568
4504
  *tags,
4569
4505
  ) -> Sheet:
4570
4506
  if isinstance(columns, int):
@@ -4578,8 +4514,8 @@ class Sheet(tk.Frame):
4578
4514
  def untag(
4579
4515
  self,
4580
4516
  cell: tuple[int, int] | None = None,
4581
- rows: int | AnyIter[int] | None = None,
4582
- columns: int | AnyIter[int] | None = None,
4517
+ rows: int | Iterator[int] | None = None,
4518
+ columns: int | Iterator[int] | None = None,
4583
4519
  ) -> Sheet:
4584
4520
  if isinstance(cell, tuple):
4585
4521
  for tagged in self.MT.tagged_cells.values():
@@ -4639,7 +4575,7 @@ class Sheet(tk.Frame):
4639
4575
  text_column: None | int | list[str] = None,
4640
4576
  push_ops: bool = False,
4641
4577
  row_heights: Sequence[int] | None | False = None,
4642
- open_ids: AnyIter[str] | None = None,
4578
+ open_ids: Iterator[str] | None = None,
4643
4579
  safety: bool = True,
4644
4580
  ncols: int | None = None,
4645
4581
  lower: bool = False,
@@ -4647,7 +4583,9 @@ class Sheet(tk.Frame):
4647
4583
  include_parent_column: bool = True,
4648
4584
  include_text_column: bool = True,
4649
4585
  ) -> Sheet:
4650
- self.RI.tree_build(
4586
+ build = self.RI.safe_tree_build if safety else self.RI.tree_build
4587
+ self.reset(cell_options=False, column_widths=False, header=False, redraw=False)
4588
+ build(
4651
4589
  data=data,
4652
4590
  iid_column=iid_column,
4653
4591
  parent_column=parent_column,
@@ -4655,7 +4593,6 @@ class Sheet(tk.Frame):
4655
4593
  push_ops=push_ops,
4656
4594
  row_heights=row_heights,
4657
4595
  open_ids=open_ids,
4658
- safety=safety,
4659
4596
  ncols=ncols,
4660
4597
  lower=lower,
4661
4598
  include_iid_column=include_iid_column,
@@ -4675,7 +4612,7 @@ class Sheet(tk.Frame):
4675
4612
  """
4676
4613
  return self.RI.tree_open_ids
4677
4614
 
4678
- def tree_set_open(self, open_ids: AnyIter[str]) -> Sheet:
4615
+ def tree_set_open(self, open_ids: Iterator[str]) -> Sheet:
4679
4616
  """
4680
4617
  Accepts set[str] of iids that are open in the treeview
4681
4618
  Closes everything else
@@ -4702,12 +4639,12 @@ class Sheet(tk.Frame):
4702
4639
  """
4703
4640
  to_open = []
4704
4641
  disp_set = set(self.MT.displayed_rows)
4705
- tree = self.RI.tree
4706
- rns = self.RI.tree_rns
4642
+ index = self.MT._row_index
4643
+ rns = self.RI.rns
4707
4644
  open_ids = self.RI.tree_open_ids
4708
4645
  descendants = self.RI.get_iid_descendants
4709
4646
  for item in filter(items.__contains__, self.get_children()):
4710
- if tree[item].children:
4647
+ if index[rns[item]].children:
4711
4648
  open_ids.add(item)
4712
4649
  if rns[item] in disp_set:
4713
4650
  to_disp = [rns[did] for did in descendants(item, check_open=True)]
@@ -4727,20 +4664,22 @@ class Sheet(tk.Frame):
4727
4664
  deselect_all=False,
4728
4665
  )
4729
4666
 
4730
- def _tree_close(self, items: AnyIter[str]) -> list[int]:
4667
+ def _tree_close(self, items: Iterator[str]) -> list[int]:
4731
4668
  """
4732
4669
  Only meant for internal use
4733
4670
  """
4734
4671
  to_close = set()
4735
4672
  disp_set = set(self.MT.displayed_rows)
4736
- quick_rns = self.RI.tree_rns
4737
- quick_open_ids = self.RI.tree_open_ids
4673
+ index = self.MT._row_index
4674
+ rns = self.RI.rns
4675
+ open_ids = self.RI.tree_open_ids
4676
+ descendants = self.RI.get_iid_descendants
4738
4677
  for item in items:
4739
- if self.RI.tree[item].children:
4740
- quick_open_ids.discard(item)
4741
- if quick_rns[item] in disp_set:
4742
- for did in self.RI.get_iid_descendants(item, check_open=True):
4743
- to_close.add(quick_rns[did])
4678
+ if index[rns[item]].children:
4679
+ open_ids.discard(item)
4680
+ if rns[item] in disp_set:
4681
+ for did in descendants(item, check_open=True):
4682
+ to_close.add(rns[did])
4744
4683
  return to_close
4745
4684
 
4746
4685
  def tree_close(self, *items, redraw: bool = True) -> Sheet:
@@ -4773,11 +4712,11 @@ class Sheet(tk.Frame):
4773
4712
  """
4774
4713
  if not iid:
4775
4714
  iid = self.RI.new_iid()
4776
- if iid in self.RI.tree:
4715
+ if iid in self.RI.rns:
4777
4716
  raise ValueError(f"iid '{iid}' already exists.")
4778
4717
  if iid == parent:
4779
4718
  raise ValueError(f"iid '{iid}' cannot be equal to parent '{parent}'.")
4780
- if parent and parent not in self.RI.tree:
4719
+ if parent and parent not in self.RI.rns:
4781
4720
  raise ValueError(f"parent '{parent}' does not exist.")
4782
4721
  if text is None:
4783
4722
  text = iid
@@ -4786,6 +4725,7 @@ class Sheet(tk.Frame):
4786
4725
  self.insert_rows(
4787
4726
  rows=[[new_node] + ([] if values is None else values)],
4788
4727
  idx=datarn,
4728
+ heights=[],
4789
4729
  row_index=True,
4790
4730
  create_selections=create_selections,
4791
4731
  fill=False,
@@ -4800,15 +4740,15 @@ class Sheet(tk.Frame):
4800
4740
  def _get_id_insert_row(self, index: int, parent: str) -> int:
4801
4741
  if parent:
4802
4742
  if isinstance(index, int):
4803
- index = min(index, len(self.RI.tree[parent].children))
4743
+ index = min(index, len(self.RI.iid_children(parent)))
4804
4744
  datarn = (
4805
- self.RI.tree_rns[parent]
4745
+ self.RI.rns[parent]
4806
4746
  + index
4807
4747
  + 1
4808
4748
  + sum(self.RI.num_descendants(cid) for cid in islice(self.get_children(parent), index))
4809
4749
  )
4810
4750
  else:
4811
- datarn = self.RI.tree_rns[parent] + self.RI.num_descendants(parent) + 1
4751
+ datarn = self.RI.rns[parent] + self.RI.num_descendants(parent) + 1
4812
4752
  else:
4813
4753
  if isinstance(index, int):
4814
4754
  datarn = index
@@ -4839,7 +4779,7 @@ class Sheet(tk.Frame):
4839
4779
  - Values (int): row numbers
4840
4780
  """
4841
4781
  to_insert = []
4842
- if parent and parent not in self.RI.tree:
4782
+ if parent and parent not in self.RI.rns:
4843
4783
  raise ValueError(f"parent '{parent}' does not exist.")
4844
4784
  datarn = self._get_id_insert_row(index=index, parent=parent)
4845
4785
  rns_to_add = {}
@@ -4863,6 +4803,7 @@ class Sheet(tk.Frame):
4863
4803
  self.insert_rows(
4864
4804
  rows=to_insert,
4865
4805
  idx=datarn,
4806
+ heights=[],
4866
4807
  row_index=True,
4867
4808
  create_selections=create_selections,
4868
4809
  fill=False,
@@ -4880,6 +4821,8 @@ class Sheet(tk.Frame):
4880
4821
  text: str | None = None,
4881
4822
  values: list | None = None,
4882
4823
  open_: bool | None = None,
4824
+ undo: bool = True,
4825
+ emit_event: bool = True,
4883
4826
  redraw: bool = True,
4884
4827
  ) -> DotDict | Sheet:
4885
4828
  """
@@ -4887,19 +4830,17 @@ class Sheet(tk.Frame):
4887
4830
  If no options are set then returns DotDict of options for item
4888
4831
  Else returns Sheet
4889
4832
  """
4890
- if item not in self.RI.tree:
4833
+ if item not in self.RI.rns:
4891
4834
  raise ValueError(f"Item '{item}' does not exist.")
4892
- if isinstance(text, str):
4893
- self.RI.tree[item].text = text
4894
- if isinstance(values, list):
4895
- self.set_data(self.RI.tree_rns[item], data=values)
4835
+ get_only = all(param is None for param in (iid, text, values, open_))
4836
+
4896
4837
  if isinstance(open_, bool):
4897
- if self.RI.tree[item].children:
4838
+ if self.RI.iid_children(item):
4898
4839
  if open_:
4899
4840
  self.RI.tree_open_ids.add(item)
4900
4841
  if self.item_displayed(item):
4901
4842
  self.show_rows(
4902
- rows=map(self.RI.tree_rns.__getitem__, self.RI.get_iid_descendants(item, check_open=True)),
4843
+ rows=map(self.RI.rns.__getitem__, self.RI.get_iid_descendants(item, check_open=True)),
4903
4844
  redraw=False,
4904
4845
  deselect_all=False,
4905
4846
  )
@@ -4907,43 +4848,47 @@ class Sheet(tk.Frame):
4907
4848
  self.RI.tree_open_ids.discard(item)
4908
4849
  if self.item_displayed(item):
4909
4850
  self.hide_rows(
4910
- rows=set(
4911
- map(self.RI.tree_rns.__getitem__, self.RI.get_iid_descendants(item, check_open=True))
4912
- ),
4851
+ rows=set(map(self.RI.rns.__getitem__, self.RI.get_iid_descendants(item, check_open=True))),
4913
4852
  redraw=False,
4914
4853
  deselect_all=False,
4915
4854
  data_indexes=True,
4916
4855
  )
4917
4856
  else:
4918
4857
  self.RI.tree_open_ids.discard(item)
4858
+
4859
+ event_data = None if get_only else self.MT.new_event_dict("edit_table", state=True)
4860
+
4861
+ if isinstance(text, str):
4862
+ event_data.cells.index = {self.RI.rns[item]: self.MT._row_index[self.RI.rns[item]].text}
4863
+ self.MT._row_index[self.RI.rns[item]].text = text
4864
+
4865
+ if isinstance(values, list):
4866
+ span = self.span(self.RI.rns[item], undo=False, emit_event=False)
4867
+ event_data = self.set_data(span, data=values, event_data=event_data)
4868
+
4919
4869
  if isinstance(iid, str):
4920
- if iid in self.RI.tree:
4870
+ if iid in self.RI.rns:
4921
4871
  raise ValueError(f"Cannot rename '{iid}', it already exists.")
4922
- for ciid in self.RI.tree[item].children:
4923
- self.RI.tree[ciid].parent = iid
4924
- if self.RI.tree[item].parent:
4925
- parent_node = self.RI.parent_node(item)
4926
- item_index = parent_node.children.index(item)
4927
- parent_node.children[item_index] = iid
4928
- self.RI.tree[item].iid = iid
4929
- self.RI.tree[iid] = self.RI.tree.pop(item)
4930
- self.RI.tree_rns[iid] = self.RI.tree_rns.pop(item)
4931
- if item in self.RI.tree_open_ids:
4932
- self.RI.tree_open_ids.discard(item)
4933
- self.RI.tree_open_ids.add(iid)
4934
- get = not (isinstance(iid, str) or isinstance(text, str) or isinstance(values, list) or isinstance(open_, bool))
4935
- self.set_refresh_timer(redraw=not get and redraw)
4936
- if get:
4872
+ event_data = self.RI.rename_iid(old=item, new=iid, event_data=event_data)
4873
+
4874
+ if event_data:
4875
+ if undo and self.MT.undo_enabled:
4876
+ self.MT.undo_stack.append(stored_event_dict(event_data))
4877
+ if emit_event:
4878
+ self.emit_event("<<SheetModified>>", event_data)
4879
+
4880
+ self.set_refresh_timer(redraw=not get_only and redraw)
4881
+ if get_only:
4937
4882
  return DotDict(
4938
- text=self.RI.tree[item].text,
4939
- values=self[self.RI.tree_rns[item]].options(ndim=1).data,
4883
+ text=self.MT._row_index[self.RI.rns[item]].text,
4884
+ values=self[self.RI.rns[item]].options(ndim=1).data,
4940
4885
  open_=item in self.RI.tree_open_ids,
4941
4886
  )
4942
4887
  return self
4943
4888
 
4944
4889
  def itemrow(self, item: str) -> int:
4945
4890
  try:
4946
- return self.RI.tree_rns[item]
4891
+ return self.RI.rns[item]
4947
4892
  except ValueError as error:
4948
4893
  raise ValueError(f"item '{item}' does not exist.") from error
4949
4894
 
@@ -4957,30 +4902,29 @@ class Sheet(tk.Frame):
4957
4902
 
4958
4903
  def get_children(self, item: None | str = None) -> Generator[str]:
4959
4904
  if item is None:
4960
- for iid in self.get_children(""):
4961
- yield iid
4962
- yield from self.RI.get_iid_descendants(iid)
4905
+ yield from map(attrgetter("iid"), self.MT._row_index)
4963
4906
  elif item == "":
4964
4907
  yield from map(attrgetter("iid"), self.RI.gen_top_nodes())
4965
4908
  else:
4966
- yield from self.RI.tree[item].children
4909
+ yield from self.RI.iid_children(item)
4967
4910
 
4968
- def get_iids(self, item: None | str = None) -> Generator[str]:
4911
+ def tree_traverse(self, item: None | str = None) -> Generator[str]:
4969
4912
  if item is None:
4970
- for n in self.RI.tree.values():
4971
- if not n.parent:
4972
- yield n.iid
4973
- yield from self.RI.get_iid_descendants(n.iid)
4913
+ for tiid in map(attrgetter("iid"), self.RI.gen_top_nodes()):
4914
+ yield tiid
4915
+ yield from self.RI.get_iid_descendants(tiid)
4974
4916
  elif item == "":
4975
- yield from (n.iid for n in self.RI.tree.values() if not n.parent)
4917
+ yield from map(attrgetter("iid"), self.RI.gen_top_nodes())
4976
4918
  else:
4977
- yield from self.RI.tree[item].children
4919
+ yield from self.RI.iid_children(item)
4920
+
4921
+ get_iids = tree_traverse
4978
4922
 
4979
4923
  def del_items(self, *items, undo: bool = True) -> Sheet:
4980
4924
  """
4981
4925
  Also deletes all descendants of items
4982
4926
  """
4983
- rows = list(map(self.RI.tree_rns.get, filter(self.exists, unpack(items))))
4927
+ rows = list(map(self.RI.rns.get, filter(self.exists, unpack(items))))
4984
4928
  if rows:
4985
4929
  self.del_rows(rows, data_indexes=True, undo=undo)
4986
4930
  return self.set_refresh_timer(rows)
@@ -4995,7 +4939,7 @@ class Sheet(tk.Frame):
4995
4939
 
4996
4940
  def top_index_row(self, index: int) -> int:
4997
4941
  try:
4998
- return next(self.RI.tree_rns[n.iid] for i, n in enumerate(self.RI.gen_top_nodes()) if i == index)
4942
+ return next(self.RI.rns[n.iid] for i, n in enumerate(self.RI.gen_top_nodes()) if i == index)
4999
4943
  except Exception:
5000
4944
  return None
5001
4945
 
@@ -5012,9 +4956,9 @@ class Sheet(tk.Frame):
5012
4956
  Moves item to be under parent as child at index
5013
4957
  'parent' can be an empty str which will put the item at top level
5014
4958
  """
5015
- if item not in self.RI.tree:
4959
+ if item not in self.RI.rns:
5016
4960
  raise ValueError(f"Item '{item}' does not exist.")
5017
- if parent and parent not in self.RI.tree:
4961
+ if parent and parent not in self.RI.rns:
5018
4962
  raise ValueError(f"Parent '{parent}' does not exist.")
5019
4963
  if self.RI.move_pid_causes_recursive_loop(item, parent):
5020
4964
  raise ValueError(f"Item '{item}' causes recursive loop with parent '{parent}.")
@@ -5039,30 +4983,29 @@ class Sheet(tk.Frame):
5039
4983
  reattach = move
5040
4984
 
5041
4985
  def exists(self, item: str) -> bool:
5042
- return item in self.RI.tree
4986
+ return item in self.RI.rns
5043
4987
 
5044
4988
  def parent(self, item: str) -> str:
5045
- if item not in self.RI.tree:
4989
+ if item not in self.RI.rns:
5046
4990
  raise ValueError(f"Item '{item}' does not exist.")
5047
- return self.RI.tree[item].parent
4991
+ return self.RI.iid_parent(item)
5048
4992
 
5049
4993
  def index(self, item: str) -> int:
5050
- if item not in self.RI.tree:
4994
+ if item not in self.RI.rns:
5051
4995
  raise ValueError(f"Item '{item}' does not exist.")
5052
- elif self.RI.tree[item].parent:
4996
+ elif self.RI.iid_parent(item):
5053
4997
  return self.RI.parent_node(item).children.index(item)
5054
4998
  else:
5055
- find_node = self.RI.tree[item]
5056
- return next(index for index, node in enumerate(self.RI.gen_top_nodes()) if node == find_node)
4999
+ return next(index for index, iid in enumerate(self.get_children("")) if iid == item)
5057
5000
 
5058
5001
  def item_displayed(self, item: str) -> bool:
5059
5002
  """
5060
5003
  Check if an item (row) is currently displayed on the sheet
5061
5004
  - Does not check if the item is visible to the user
5062
5005
  """
5063
- if item not in self.RI.tree:
5006
+ if item not in self.RI.rns:
5064
5007
  raise ValueError(f"Item '{item}' does not exist.")
5065
- return bisect_in(self.MT.displayed_rows, self.RI.tree_rns[item])
5008
+ return bisect_in(self.MT.displayed_rows, self.RI.rns[item])
5066
5009
 
5067
5010
  def display_item(self, item: str, redraw: bool = False) -> Sheet:
5068
5011
  """
@@ -5071,7 +5014,7 @@ class Sheet(tk.Frame):
5071
5014
  - Unlike the ttk treeview 'see' function
5072
5015
  this function does **NOT** scroll to the item
5073
5016
  """
5074
- if not self.item_displayed(item) and self.RI.tree[item].parent:
5017
+ if not self.item_displayed(item) and self.RI.iid_parent(item):
5075
5018
  self.show_rows(
5076
5019
  rows=self._tree_open(list(self.RI.get_iid_ancestors(item))),
5077
5020
  redraw=False,
@@ -5085,7 +5028,7 @@ class Sheet(tk.Frame):
5085
5028
  """
5086
5029
  self.display_item(item, redraw=False)
5087
5030
  self.see(
5088
- row=bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]),
5031
+ row=bisect_left(self.MT.displayed_rows, self.RI.rns[item]),
5089
5032
  keep_xscroll=True,
5090
5033
  redraw=False,
5091
5034
  )
@@ -5120,8 +5063,8 @@ class Sheet(tk.Frame):
5120
5063
  def selection_add(self, *items, run_binding: bool = True, redraw: bool = True) -> Sheet:
5121
5064
  to_open = []
5122
5065
  quick_displayed_check = set(self.MT.displayed_rows)
5123
- for item in filter(self.RI.tree.__contains__, unpack(items)):
5124
- if self.RI.tree_rns[item] not in quick_displayed_check and self.RI.tree[item].parent:
5066
+ for item in filter(self.RI.rns.__contains__, unpack(items)):
5067
+ if self.RI.rns[item] not in quick_displayed_check and self.RI.iid_parent(item):
5125
5068
  to_open.extend(list(self.RI.get_iid_ancestors(item)))
5126
5069
  if to_open:
5127
5070
  self.show_rows(
@@ -5133,9 +5076,9 @@ class Sheet(tk.Frame):
5133
5076
  sorted(
5134
5077
  bisect_left(
5135
5078
  self.MT.displayed_rows,
5136
- self.RI.tree_rns[item],
5079
+ self.RI.rns[item],
5137
5080
  )
5138
- for item in filter(self.RI.tree.__contains__, unpack(items))
5081
+ for item in filter(self.RI.rns.__contains__, unpack(items))
5139
5082
  )
5140
5083
  ):
5141
5084
  self.MT.create_selection_box(
@@ -5153,10 +5096,10 @@ class Sheet(tk.Frame):
5153
5096
 
5154
5097
  def selection_remove(self, *items, redraw: bool = True) -> Sheet:
5155
5098
  for item in unpack(items):
5156
- if item not in self.RI.tree:
5099
+ if item not in self.RI.rns:
5157
5100
  continue
5158
5101
  try:
5159
- self.deselect(bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]), redraw=False)
5102
+ self.deselect(bisect_left(self.MT.displayed_rows, self.RI.rns[item]), redraw=False)
5160
5103
  except Exception:
5161
5104
  continue
5162
5105
  return self.set_refresh_timer(redraw)
@@ -5166,7 +5109,7 @@ class Sheet(tk.Frame):
5166
5109
  add = []
5167
5110
  remove = []
5168
5111
  for item in unpack(items):
5169
- if item in self.RI.tree:
5112
+ if item in self.RI.rns:
5170
5113
  if item in selected:
5171
5114
  remove.append(item)
5172
5115
  else:
@@ -5304,7 +5247,7 @@ class Sheet(tk.Frame):
5304
5247
 
5305
5248
  def get_cell_data(self, r: int, c: int, get_displayed: bool = False) -> Any:
5306
5249
  if get_displayed:
5307
- return self.MT.get_valid_cell_data_as_str(r, c, get_displayed=True)
5250
+ return self.MT.cell_str(r, c, get_displayed=True)
5308
5251
  else:
5309
5252
  return self.MT.get_cell_data(r, c)
5310
5253
 
@@ -5314,7 +5257,7 @@ class Sheet(tk.Frame):
5314
5257
  get_displayed: bool = False,
5315
5258
  get_index: bool = False,
5316
5259
  get_index_displayed: bool = True,
5317
- only_columns: int | AnyIter[int] | None = None,
5260
+ only_columns: int | Iterator[int] | None = None,
5318
5261
  ) -> list[Any]:
5319
5262
  if only_columns is not None:
5320
5263
  if isinstance(only_columns, int):
@@ -5323,15 +5266,16 @@ class Sheet(tk.Frame):
5323
5266
  raise ValueError(tksheet_type_error("only_columns", ["int", "iterable", "None"], only_columns))
5324
5267
  if r >= self.MT.total_data_rows():
5325
5268
  raise IndexError(f"Row #{r} is out of range.")
5269
+
5326
5270
  if r >= len(self.MT.data):
5327
5271
  total_data_cols = self.MT.total_data_cols()
5328
5272
  self.MT.fix_data_len(r, total_data_cols - 1)
5273
+
5329
5274
  iterable = only_columns if only_columns is not None else range(len(self.MT.data[r]))
5330
- f = partial(self.MT.get_valid_cell_data_as_str, get_displayed=True) if get_displayed else self.MT.get_cell_data
5331
- if get_index:
5332
- return [self.get_index_data(r, get_displayed=get_index_displayed)] + [f(r, c) for c in iterable]
5333
- else:
5334
- return [f(r, c) for c in iterable]
5275
+ f = partial(self.MT.cell_str, get_displayed=True) if get_displayed else self.MT.get_cell_data
5276
+ row = [self.RI.get_cell_data(r, get_displayed=get_index_displayed)] if get_index else []
5277
+ row.extend(f(r, c) for c in iterable)
5278
+ return row
5335
5279
 
5336
5280
  def get_column_data(
5337
5281
  self,
@@ -5339,7 +5283,7 @@ class Sheet(tk.Frame):
5339
5283
  get_displayed: bool = False,
5340
5284
  get_header: bool = False,
5341
5285
  get_header_displayed: bool = True,
5342
- only_rows: int | AnyIter[int] | None = None,
5286
+ only_rows: int | Iterator[int] | None = None,
5343
5287
  ) -> list[Any]:
5344
5288
  if only_rows is not None:
5345
5289
  if isinstance(only_rows, int):
@@ -5347,10 +5291,10 @@ class Sheet(tk.Frame):
5347
5291
  elif not is_iterable(only_rows):
5348
5292
  raise ValueError(tksheet_type_error("only_rows", ["int", "iterable", "None"], only_rows))
5349
5293
  iterable = only_rows if only_rows is not None else range(len(self.MT.data))
5350
- f = partial(self.MT.get_valid_cell_data_as_str, get_displayed=True) if get_displayed else self.MT.get_cell_data
5351
- return ([self.get_header_data(c, get_displayed=get_header_displayed)] if get_header else []) + [
5352
- f(r, c) for r in iterable
5353
- ]
5294
+ f = partial(self.MT.cell_str, get_displayed=True) if get_displayed else self.MT.get_cell_data
5295
+ col = [self.CH.get_cell_data(c, get_displayed=get_header_displayed)] if get_header else []
5296
+ col.extend(f(r, c) for r in iterable)
5297
+ return col
5354
5298
 
5355
5299
  def get_sheet_data(
5356
5300
  self,
@@ -5359,9 +5303,9 @@ class Sheet(tk.Frame):
5359
5303
  get_index: bool = False,
5360
5304
  get_header_displayed: bool = True,
5361
5305
  get_index_displayed: bool = True,
5362
- only_rows: AnyIter[int] | int | None = None,
5363
- only_columns: AnyIter[int] | int | None = None,
5364
- ) -> list[Any]:
5306
+ only_rows: Iterator[int] | int | None = None,
5307
+ only_columns: Iterator[int] | int | None = None,
5308
+ ) -> list[list[Any]]:
5365
5309
  if only_rows is not None:
5366
5310
  if isinstance(only_rows, int):
5367
5311
  only_rows = (only_rows,)
@@ -5372,6 +5316,7 @@ class Sheet(tk.Frame):
5372
5316
  only_columns = (only_columns,)
5373
5317
  elif not is_iterable(only_columns):
5374
5318
  raise ValueError(tksheet_type_error("only_columns", ["int", "iterable", "None"], only_columns))
5319
+
5375
5320
  if get_header:
5376
5321
  maxlen = len(self.MT._headers) if isinstance(self.MT._headers, (list, tuple)) else 0
5377
5322
  data = []
@@ -5380,15 +5325,19 @@ class Sheet(tk.Frame):
5380
5325
  if len(r) > maxlen:
5381
5326
  maxlen = len(r)
5382
5327
  if get_index:
5383
- data.append([self.get_index_data(rn, get_displayed=get_index_displayed)] + r)
5328
+ row = [self.RI.get_cell_data(rn, get_displayed=get_index_displayed)]
5329
+ row.extend(r)
5330
+ data.append(row)
5384
5331
  else:
5385
5332
  data.append(r)
5386
5333
  iterable = only_columns if only_columns is not None else range(maxlen)
5387
- if get_index:
5388
- return [[""] + [self.get_header_data(cn, get_displayed=get_header_displayed) for cn in iterable]] + data
5389
- else:
5390
- return [[self.get_header_data(cn, get_displayed=get_header_displayed) for cn in iterable]] + data
5391
- elif not get_header:
5334
+ header_row = [""] if get_index else []
5335
+ header_row.extend(self.CH.get_cell_data(cn, get_displayed=get_header_displayed) for cn in iterable)
5336
+ result = [header_row]
5337
+ result.extend(data)
5338
+ return result
5339
+
5340
+ else:
5392
5341
  iterable = only_rows if only_rows is not None else range(len(self.MT.data))
5393
5342
  return [
5394
5343
  self.get_row_data(
@@ -5408,9 +5357,9 @@ class Sheet(tk.Frame):
5408
5357
  get_index: bool = False,
5409
5358
  get_index_displayed: bool = True,
5410
5359
  get_header_displayed: bool = True,
5411
- only_rows: int | AnyIter[int] | None = None,
5412
- only_columns: int | AnyIter[int] | None = None,
5413
- ) -> Iterator[list[Any]]:
5360
+ only_rows: int | Iterator[int] | None = None,
5361
+ only_columns: int | Iterator[int] | None = None,
5362
+ ) -> Generator[list[Any]]:
5414
5363
  if only_rows is not None:
5415
5364
  if isinstance(only_rows, int):
5416
5365
  only_rows = (only_rows,)
@@ -5421,11 +5370,13 @@ class Sheet(tk.Frame):
5421
5370
  only_columns = (only_columns,)
5422
5371
  elif not is_iterable(only_columns):
5423
5372
  raise ValueError(tksheet_type_error("only_columns", ["int", "iterable", "None"], only_columns))
5373
+
5424
5374
  if get_header:
5425
5375
  iterable = only_columns if only_columns is not None else range(self.MT.total_data_cols())
5426
- yield ([""] if get_index else []) + [
5427
- self.get_header_data(c, get_displayed=get_header_displayed) for c in iterable
5428
- ]
5376
+ header_row = [""] if get_index else []
5377
+ header_row.extend(self.CH.get_cell_data(c, get_displayed=get_header_displayed) for c in iterable)
5378
+ yield header_row
5379
+
5429
5380
  iterable = only_rows if only_rows is not None else range(len(self.MT.data))
5430
5381
  yield from (
5431
5382
  self.get_row_data(
@@ -5666,7 +5617,7 @@ class Sheet(tk.Frame):
5666
5617
 
5667
5618
  def highlight_rows(
5668
5619
  self,
5669
- rows: AnyIter[int] | int,
5620
+ rows: Iterator[int] | int,
5670
5621
  bg: None | str = None,
5671
5622
  fg: None | str = None,
5672
5623
  highlight_index: bool = True,
@@ -5684,7 +5635,7 @@ class Sheet(tk.Frame):
5684
5635
 
5685
5636
  def highlight_columns(
5686
5637
  self,
5687
- columns: AnyIter[int] | int,
5638
+ columns: Iterator[int] | int,
5688
5639
  bg: bool | None | str = False,
5689
5640
  fg: bool | None | str = False,
5690
5641
  highlight_header: bool = True,
@@ -5986,7 +5937,7 @@ class Sheet(tk.Frame):
5986
5937
 
5987
5938
  def checkbox_row(
5988
5939
  self,
5989
- r: AnyIter[int] | int | Literal["all"] = 0,
5940
+ r: Iterator[int] | int | Literal["all"] = 0,
5990
5941
  *args,
5991
5942
  **kwargs,
5992
5943
  ) -> None:
@@ -6011,7 +5962,7 @@ class Sheet(tk.Frame):
6011
5962
 
6012
5963
  def checkbox_column(
6013
5964
  self,
6014
- c: AnyIter[int] | int | Literal["all"] = 0,
5965
+ c: Iterator[int] | int | Literal["all"] = 0,
6015
5966
  *args,
6016
5967
  **kwargs,
6017
5968
  ) -> None:
@@ -6036,7 +5987,7 @@ class Sheet(tk.Frame):
6036
5987
 
6037
5988
  def create_header_checkbox(
6038
5989
  self,
6039
- c: AnyIter[int] | int | Literal["all"] = 0,
5990
+ c: Iterator[int] | int | Literal["all"] = 0,
6040
5991
  *args,
6041
5992
  **kwargs,
6042
5993
  ) -> None:
@@ -6059,7 +6010,7 @@ class Sheet(tk.Frame):
6059
6010
 
6060
6011
  def create_index_checkbox(
6061
6012
  self,
6062
- r: AnyIter[int] | int | Literal["all"] = 0,
6013
+ r: Iterator[int] | int | Literal["all"] = 0,
6063
6014
  *args,
6064
6015
  **kwargs,
6065
6016
  ) -> None:
@@ -6109,7 +6060,7 @@ class Sheet(tk.Frame):
6109
6060
 
6110
6061
  def delete_row_checkbox(
6111
6062
  self,
6112
- r: AnyIter[int] | int | Literal["all"] = 0,
6063
+ r: Iterator[int] | int | Literal["all"] = 0,
6113
6064
  ) -> None:
6114
6065
  if isinstance(r, str) and r.lower() == "all":
6115
6066
  for r_ in self.MT.row_options:
@@ -6122,7 +6073,7 @@ class Sheet(tk.Frame):
6122
6073
 
6123
6074
  def delete_column_checkbox(
6124
6075
  self,
6125
- c: AnyIter[int] | int | Literal["all"] = 0,
6076
+ c: Iterator[int] | int | Literal["all"] = 0,
6126
6077
  ) -> None:
6127
6078
  if isinstance(c, str) and c.lower() == "all":
6128
6079
  for c_ in self.MT.col_options:
@@ -6135,7 +6086,7 @@ class Sheet(tk.Frame):
6135
6086
 
6136
6087
  def delete_header_checkbox(
6137
6088
  self,
6138
- c: AnyIter[int] | int | Literal["all"] = 0,
6089
+ c: Iterator[int] | int | Literal["all"] = 0,
6139
6090
  ) -> None:
6140
6091
  if isinstance(c, str) and c.lower() == "all":
6141
6092
  for c_ in self.CH.cell_options:
@@ -6149,7 +6100,7 @@ class Sheet(tk.Frame):
6149
6100
 
6150
6101
  def delete_index_checkbox(
6151
6102
  self,
6152
- r: AnyIter[int] | int | Literal["all"] = 0,
6103
+ r: Iterator[int] | int | Literal["all"] = 0,
6153
6104
  ) -> None:
6154
6105
  if isinstance(r, str) and r.lower() == "all":
6155
6106
  for r_ in self.RI.cell_options:
@@ -6239,7 +6190,7 @@ class Sheet(tk.Frame):
6239
6190
 
6240
6191
  def dropdown_row(
6241
6192
  self,
6242
- r: AnyIter[int] | int | Literal["all"] = 0,
6193
+ r: Iterator[int] | int | Literal["all"] = 0,
6243
6194
  *args,
6244
6195
  **kwargs,
6245
6196
  ) -> Sheet:
@@ -6264,7 +6215,7 @@ class Sheet(tk.Frame):
6264
6215
 
6265
6216
  def dropdown_column(
6266
6217
  self,
6267
- c: AnyIter[int] | int | Literal["all"] = 0,
6218
+ c: Iterator[int] | int | Literal["all"] = 0,
6268
6219
  *args,
6269
6220
  **kwargs,
6270
6221
  ) -> Sheet:
@@ -6289,7 +6240,7 @@ class Sheet(tk.Frame):
6289
6240
 
6290
6241
  def create_header_dropdown(
6291
6242
  self,
6292
- c: AnyIter[int] | int | Literal["all"] = 0,
6243
+ c: Iterator[int] | int | Literal["all"] = 0,
6293
6244
  *args,
6294
6245
  **kwargs,
6295
6246
  ) -> Sheet:
@@ -6313,7 +6264,7 @@ class Sheet(tk.Frame):
6313
6264
 
6314
6265
  def create_index_dropdown(
6315
6266
  self,
6316
- r: AnyIter[int] | int | Literal["all"] = 0,
6267
+ r: Iterator[int] | int | Literal["all"] = 0,
6317
6268
  *args,
6318
6269
  **kwargs,
6319
6270
  ) -> Sheet:
@@ -6364,7 +6315,7 @@ class Sheet(tk.Frame):
6364
6315
 
6365
6316
  def delete_row_dropdown(
6366
6317
  self,
6367
- r: AnyIter[int] | int | Literal["all"] = "all",
6318
+ r: Iterator[int] | int | Literal["all"] = "all",
6368
6319
  ) -> None:
6369
6320
  if isinstance(r, str) and r.lower() == "all":
6370
6321
  for r_ in self.MT.row_options:
@@ -6378,7 +6329,7 @@ class Sheet(tk.Frame):
6378
6329
 
6379
6330
  def delete_column_dropdown(
6380
6331
  self,
6381
- c: AnyIter[int] | int | Literal["all"] = "all",
6332
+ c: Iterator[int] | int | Literal["all"] = "all",
6382
6333
  ) -> None:
6383
6334
  if isinstance(c, str) and c.lower() == "all":
6384
6335
  for c_ in self.MT.col_options:
@@ -6390,7 +6341,7 @@ class Sheet(tk.Frame):
6390
6341
  for c_ in c:
6391
6342
  self.del_column_options_dropdown(datacn=c_)
6392
6343
 
6393
- def delete_header_dropdown(self, c: AnyIter[int] | int | Literal["all"]) -> None:
6344
+ def delete_header_dropdown(self, c: Iterator[int] | int | Literal["all"]) -> None:
6394
6345
  if isinstance(c, str) and c.lower() == "all":
6395
6346
  for c_ in self.CH.cell_options:
6396
6347
  if "dropdown" in self.CH.cell_options[c_]:
@@ -6401,7 +6352,7 @@ class Sheet(tk.Frame):
6401
6352
  for c_ in c:
6402
6353
  self.del_header_cell_options_dropdown(c_)
6403
6354
 
6404
- def delete_index_dropdown(self, r: AnyIter[int] | int | Literal["all"]) -> None:
6355
+ def delete_index_dropdown(self, r: Iterator[int] | int | Literal["all"]) -> None:
6405
6356
  if isinstance(r, str) and r.lower() == "all":
6406
6357
  for r_ in self.RI.cell_options:
6407
6358
  if "dropdown" in self.RI.cell_options[r_]:
@@ -6637,7 +6588,7 @@ class Sheet(tk.Frame):
6637
6588
 
6638
6589
  def format_row(
6639
6590
  self,
6640
- r: AnyIter[int] | int | Literal["all"],
6591
+ r: Iterator[int] | int | Literal["all"],
6641
6592
  formatter_options: dict | None = None,
6642
6593
  formatter_class: Any = None,
6643
6594
  redraw: bool = True,
@@ -6669,7 +6620,7 @@ class Sheet(tk.Frame):
6669
6620
 
6670
6621
  def delete_row_format(
6671
6622
  self,
6672
- r: AnyIter[int] | int | Literal["all"] = "all",
6623
+ r: Iterator[int] | int | Literal["all"] = "all",
6673
6624
  clear_values: bool = False,
6674
6625
  ) -> Sheet:
6675
6626
  if is_iterable(r):
@@ -6681,7 +6632,7 @@ class Sheet(tk.Frame):
6681
6632
 
6682
6633
  def format_column(
6683
6634
  self,
6684
- c: AnyIter[int] | int | Literal["all"],
6635
+ c: Iterator[int] | int | Literal["all"],
6685
6636
  formatter_options: dict | None = None,
6686
6637
  formatter_class: Any = None,
6687
6638
  redraw: bool = True,
@@ -6713,7 +6664,7 @@ class Sheet(tk.Frame):
6713
6664
 
6714
6665
  def delete_column_format(
6715
6666
  self,
6716
- c: AnyIter[int] | int | Literal["all"] = "all",
6667
+ c: Iterator[int] | int | Literal["all"] = "all",
6717
6668
  clear_values: bool = False,
6718
6669
  ) -> Sheet:
6719
6670
  if is_iterable(c):