tksheet 7.2.11__tar.gz → 7.2.13__tar.gz

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.
Files changed (24) hide show
  1. {tksheet-7.2.11/tksheet.egg-info → tksheet-7.2.13}/PKG-INFO +1 -1
  2. {tksheet-7.2.11 → tksheet-7.2.13}/pyproject.toml +1 -1
  3. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/__init__.py +2 -1
  4. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/column_headers.py +12 -4
  5. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/functions.py +24 -3
  6. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/main_table.py +21 -2
  7. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/row_index.py +58 -40
  8. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/sheet.py +29 -15
  9. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/sheet_options.py +2 -0
  10. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/text_editor.py +1 -1
  11. {tksheet-7.2.11 → tksheet-7.2.13/tksheet.egg-info}/PKG-INFO +1 -1
  12. {tksheet-7.2.11 → tksheet-7.2.13}/LICENSE.txt +0 -0
  13. {tksheet-7.2.11 → tksheet-7.2.13}/README.md +0 -0
  14. {tksheet-7.2.11 → tksheet-7.2.13}/setup.cfg +0 -0
  15. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/colors.py +0 -0
  16. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/formatters.py +0 -0
  17. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/other_classes.py +0 -0
  18. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/themes.py +0 -0
  19. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/top_left_rectangle.py +0 -0
  20. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/types.py +0 -0
  21. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/vars.py +0 -0
  22. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet.egg-info/SOURCES.txt +0 -0
  23. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet.egg-info/dependency_links.txt +0 -0
  24. {tksheet-7.2.11 → tksheet-7.2.13}/tksheet.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.2.11
3
+ Version: 7.2.13
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
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
  name = "tksheet"
7
7
  description = "Tkinter table / sheet widget"
8
8
  readme = "README.md"
9
- version = "7.2.11"
9
+ version = "7.2.13"
10
10
  authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
11
11
  requires-python = ">=3.8"
12
12
  license = {file = "LICENSE.txt"}
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.2.11"
7
+ __version__ = "7.2.12"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
@@ -37,6 +37,7 @@ from .functions import (
37
37
  alpha2num,
38
38
  consecutive_chunks,
39
39
  consecutive_ranges,
40
+ convert_align,
40
41
  data_to_displayed_idxs,
41
42
  displayed_to_data_idxs,
42
43
  dropdown_search_function,
@@ -128,7 +128,6 @@ class ColumnHeaders(tk.Canvas):
128
128
  self.hidd_checkbox = {}
129
129
  self.hidd_boxes = set()
130
130
 
131
- self.default_header = kwargs["default_header"].lower()
132
131
  self.align = kwargs["header_align"]
133
132
  self.basic_bindings()
134
133
 
@@ -599,7 +598,7 @@ class ColumnHeaders(tk.Canvas):
599
598
  if need_redraw:
600
599
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
601
600
  try_binding(self.extra_b1_motion_func, event)
602
-
601
+
603
602
  def drag_height_resize(self) -> None:
604
603
  self.set_height(self.new_col_height, set_TL=True)
605
604
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
@@ -2176,7 +2175,16 @@ class ColumnHeaders(tk.Canvas):
2176
2175
  )
2177
2176
  edited = False
2178
2177
  if isinstance(self.MT._headers, int):
2179
- edited = self.MT.set_cell_data_undo(r=self.MT._headers, c=c, datacn=datacn, value=value, undo=True)
2178
+ disprn = self.MT.try_disprn(self.MT._headers)
2179
+ edited = self.MT.set_cell_data_undo(
2180
+ r=disprn if isinstance(disprn, int) else 0,
2181
+ c=c,
2182
+ datarn=self.MT._headers,
2183
+ datacn=datacn,
2184
+ value=value,
2185
+ undo=True,
2186
+ cell_resize=isinstance(disprn, int),
2187
+ )
2180
2188
  else:
2181
2189
  self.fix_header(datacn)
2182
2190
  if not check_input_valid or self.input_valid_for_cell(datacn, value):
@@ -2261,7 +2269,7 @@ class ColumnHeaders(tk.Canvas):
2261
2269
  except Exception:
2262
2270
  value = ""
2263
2271
  if not value and self.PAR.ops.show_default_header_for_empty:
2264
- value = get_n2a(datacn, self.default_header)
2272
+ value = get_n2a(datacn, self.PAR.ops.default_header)
2265
2273
  return value
2266
2274
 
2267
2275
  def get_value_for_empty_cell(self, datacn: int, c_ops: bool = True) -> object:
@@ -1,12 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
- import bisect
4
3
  import csv
5
4
  import io
6
5
  import pickle
7
6
  import re
8
7
  import tkinter as tk
9
8
  import zlib
9
+ from bisect import (
10
+ bisect_left,
11
+ )
10
12
  from collections import deque
11
13
  from collections.abc import (
12
14
  Callable,
@@ -35,8 +37,17 @@ unpickle_obj = pickle.loads
35
37
 
36
38
 
37
39
  def get_csv_str_dialect(s: str, delimiters: str) -> csv.Dialect:
40
+ if len(s) > 6000:
41
+ try:
42
+ _upto = next(
43
+ match.start() + 1 for i, match in enumerate(re.finditer("\n", s), 1) if i == 300 or match.start() > 6000
44
+ )
45
+ except Exception:
46
+ _upto = len(s)
47
+ else:
48
+ _upto = len(s)
38
49
  try:
39
- return csv.Sniffer().sniff(s[:5000] if len(s) > 5000 else s, delimiters=delimiters)
50
+ return csv.Sniffer().sniff(s[:_upto] if len(s) > 6000 else s, delimiters=delimiters)
40
51
  except Exception:
41
52
  return csv.excel_tab
42
53
 
@@ -208,6 +219,16 @@ def len_to_idx(n: int) -> int:
208
219
  return n - 1
209
220
 
210
221
 
222
+ def b_index(sorted_seq: Sequence[int], num_to_index: int) -> int:
223
+ """
224
+ Designed to be a faster way of finding the index of an int
225
+ in a sorted list of ints than list.index()
226
+ """
227
+ if (idx := bisect_left(sorted_seq, num_to_index)) == len(sorted_seq) or sorted_seq[idx] != num_to_index:
228
+ raise ValueError(f"{num_to_index} is not in Sequence")
229
+ return idx
230
+
231
+
211
232
  def get_dropdown_kwargs(
212
233
  values: list = [],
213
234
  set_value: object = None,
@@ -379,7 +400,7 @@ def get_seq_without_gaps_at_index(
379
400
  position: int,
380
401
  get_st_end: bool = False,
381
402
  ) -> tuple[int, int] | list[int]:
382
- start_idx = bisect.bisect_left(seq, position)
403
+ start_idx = bisect_left(seq, position)
383
404
  forward_gap = get_index_of_gap_in_sorted_integer_seq_forward(seq, start_idx)
384
405
  reverse_gap = get_index_of_gap_in_sorted_integer_seq_reverse(seq, start_idx)
385
406
  if forward_gap is not None:
@@ -49,6 +49,7 @@ from .formatters import (
49
49
  try_to_bool,
50
50
  )
51
51
  from .functions import (
52
+ b_index,
52
53
  consecutive_ranges,
53
54
  decompress_load,
54
55
  diff_gen,
@@ -6344,7 +6345,7 @@ class MainTable(tk.Canvas):
6344
6345
  for r in range(box.coords.from_r, box.coords.upto_r)
6345
6346
  }
6346
6347
  if get_cells_as_rows:
6347
- return s | set(tup[0] for tup in self.get_selected_cells())
6348
+ return s | set(map(itemgetter(0), self.gen_selected_cells()))
6348
6349
  return s
6349
6350
 
6350
6351
  def get_selected_cols(
@@ -6368,7 +6369,7 @@ class MainTable(tk.Canvas):
6368
6369
  for c in range(box.coords.from_c, box.coords.upto_c)
6369
6370
  }
6370
6371
  if get_cells_as_cols:
6371
- return s | set(tup[1] for tup in self.get_selected_cells())
6372
+ return s | set(map(itemgetter(1), self.gen_selected_cells()))
6372
6373
  return s
6373
6374
 
6374
6375
  def get_selected_cells(
@@ -7460,3 +7461,21 @@ class MainTable(tk.Canvas):
7460
7461
 
7461
7462
  def datarn(self, r: int) -> int:
7462
7463
  return r if self.all_rows_displayed else self.displayed_rows[r]
7464
+
7465
+ def dispcn(self, datacn: int) -> int:
7466
+ return datacn if self.all_columns_displayed else b_index(self.displayed_columns, datacn)
7467
+
7468
+ def try_dispcn(self, datacn: int) -> int | None:
7469
+ try:
7470
+ return self.dispcn(datacn)
7471
+ except Exception:
7472
+ return None
7473
+
7474
+ def disprn(self, datarn: int) -> int:
7475
+ return datarn if self.all_rows_displayed else b_index(self.displayed_rows, datarn)
7476
+
7477
+ def try_disprn(self, datarn: int) -> int | None:
7478
+ try:
7479
+ return self.disprn(datarn)
7480
+ except Exception:
7481
+ return None
@@ -140,7 +140,6 @@ class RowIndex(tk.Canvas):
140
140
  self.hidd_boxes = set()
141
141
 
142
142
  self.align = kwargs["row_index_align"]
143
- self.default_index = kwargs["default_row_index"].lower()
144
143
 
145
144
  self.tree_reset()
146
145
  self.basic_bindings()
@@ -780,7 +779,7 @@ class RowIndex(tk.Canvas):
780
779
  and self.get_cell_kwargs(datarn, key="checkbox")
781
780
  and event.x < self.MT.index_txt_height + 4
782
781
  )
783
-
782
+
784
783
  def drag_width_resize(self) -> None:
785
784
  self.set_width(self.new_row_width, set_TL=True)
786
785
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
@@ -1200,11 +1199,11 @@ class RowIndex(tk.Canvas):
1200
1199
 
1201
1200
  def auto_set_index_width(self, end_row: int, only_rows: list) -> bool:
1202
1201
  if not isinstance(self.MT._row_index, int) and not self.MT._row_index:
1203
- if self.default_index == "letters":
1202
+ if self.PAR.ops.default_row_index == "letters":
1204
1203
  new_w = self.MT.get_txt_w(f"{num2alpha(end_row)}") + 20
1205
- elif self.default_index == "numbers":
1204
+ elif self.PAR.ops.default_row_index == "numbers":
1206
1205
  new_w = self.MT.get_txt_w(f"{end_row}") + 20
1207
- elif self.default_index == "both":
1206
+ elif self.PAR.ops.default_row_index == "both":
1208
1207
  new_w = self.MT.get_txt_w(f"{end_row + 1} {num2alpha(end_row)}") + 20
1209
1208
  elif self.PAR.ops.auto_resize_row_index is True:
1210
1209
  new_w = self.get_index_text_width(only_rows=only_rows)
@@ -1336,33 +1335,44 @@ class RowIndex(tk.Canvas):
1336
1335
  fill: str,
1337
1336
  tag: str | tuple[str],
1338
1337
  indent: float,
1338
+ has_children: bool = False,
1339
1339
  open_: bool = False,
1340
1340
  ) -> None:
1341
1341
  mod = (self.MT.index_txt_height - 1) if self.MT.index_txt_height % 2 else self.MT.index_txt_height
1342
1342
  small_mod = int(mod / 5)
1343
1343
  mid_y = floor(self.MT.min_row_height / 2)
1344
- # up arrow
1345
- if open_:
1346
- points = (
1347
- # the left hand downward point
1348
- x1 + 5 + indent,
1349
- y1 + mid_y + small_mod,
1350
- # the middle upward point
1351
- x1 + 5 + indent + small_mod + small_mod,
1352
- y1 + mid_y - small_mod,
1353
- # the right hand downward point
1354
- x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
1355
- y1 + mid_y + small_mod,
1356
- )
1357
- # right pointing arrow
1344
+ if has_children:
1345
+ # up arrow
1346
+ if open_:
1347
+ points = (
1348
+ # the left hand downward point
1349
+ x1 + 5 + indent,
1350
+ y1 + mid_y + small_mod,
1351
+ # the middle upward point
1352
+ x1 + 5 + indent + small_mod + small_mod,
1353
+ y1 + mid_y - small_mod,
1354
+ # the right hand downward point
1355
+ x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
1356
+ y1 + mid_y + small_mod,
1357
+ )
1358
+ # right pointing arrow
1359
+ else:
1360
+ points = (
1361
+ # the upper point
1362
+ x1 + 5 + indent + small_mod + small_mod,
1363
+ y1 + mid_y - small_mod - small_mod,
1364
+ # the middle point
1365
+ x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
1366
+ y1 + mid_y,
1367
+ # the bottom point
1368
+ x1 + 5 + indent + small_mod + small_mod,
1369
+ y1 + mid_y + small_mod + small_mod,
1370
+ )
1358
1371
  else:
1359
1372
  points = (
1360
1373
  # the upper point
1361
1374
  x1 + 5 + indent + small_mod + small_mod,
1362
1375
  y1 + mid_y - small_mod - small_mod,
1363
- # the middle point
1364
- x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
1365
- y1 + mid_y,
1366
1376
  # the bottom point
1367
1377
  x1 + 5 + indent + small_mod + small_mod,
1368
1378
  y1 + mid_y + small_mod + small_mod,
@@ -1371,14 +1381,14 @@ class RowIndex(tk.Canvas):
1371
1381
  t, sh = self.hidd_tree_arrow.popitem()
1372
1382
  self.coords(t, points)
1373
1383
  if sh:
1374
- self.itemconfig(t, fill=fill)
1384
+ self.itemconfig(t, fill=fill if has_children else self.PAR.ops.index_grid_fg)
1375
1385
  else:
1376
- self.itemconfig(t, fill=fill, tag=tag, state="normal")
1386
+ self.itemconfig(t, fill=fill if has_children else self.PAR.ops.index_grid_fg, tag=tag, state="normal")
1377
1387
  self.lift(t)
1378
1388
  else:
1379
1389
  t = self.create_line(
1380
1390
  points,
1381
- fill=fill,
1391
+ fill=fill if has_children else self.PAR.ops.index_grid_fg,
1382
1392
  tag=tag,
1383
1393
  width=2,
1384
1394
  capstyle=tk.ROUND,
@@ -1689,16 +1699,16 @@ class RowIndex(tk.Canvas):
1689
1699
  draw_x += self.MT.index_txt_height + 3
1690
1700
  indent = self.get_treeview_indent(iid)
1691
1701
  draw_x += indent + 5
1692
- if self.tree[iid].children:
1693
- self.redraw_tree_arrow(
1694
- 2,
1695
- rtopgridln,
1696
- r=r,
1697
- fill=tree_arrow_fg,
1698
- tag="ta",
1699
- indent=indent,
1700
- open_=self.MT._row_index[datarn].iid in self.tree_open_ids,
1701
- )
1702
+ self.redraw_tree_arrow(
1703
+ 2,
1704
+ rtopgridln,
1705
+ r=r,
1706
+ fill=tree_arrow_fg,
1707
+ tag="ta",
1708
+ indent=indent,
1709
+ has_children=bool(self.tree[iid].children),
1710
+ open_=self.MT._row_index[datarn].iid in self.tree_open_ids,
1711
+ )
1702
1712
  lns = self.get_valid_cell_data_as_str(datarn, fix=False)
1703
1713
  if not lns:
1704
1714
  continue
@@ -2296,7 +2306,16 @@ class RowIndex(tk.Canvas):
2296
2306
  )
2297
2307
  edited = False
2298
2308
  if isinstance(self.MT._row_index, int):
2299
- edited = self.MT.set_cell_data_undo(r=r, c=self.MT._row_index, datarn=datarn, value=value, undo=True)
2309
+ dispcn = self.MT.try_dispcn(self.MT._row_index)
2310
+ edited = self.MT.set_cell_data_undo(
2311
+ r=r,
2312
+ c=dispcn if isinstance(dispcn, int) else 0,
2313
+ datarn=datarn,
2314
+ datacn=self.MT._row_index,
2315
+ value=value,
2316
+ undo=True,
2317
+ cell_resize=isinstance(dispcn, int),
2318
+ )
2300
2319
  else:
2301
2320
  self.fix_index(datarn)
2302
2321
  if not check_input_valid or self.input_valid_for_cell(datarn, value):
@@ -2379,7 +2398,7 @@ class RowIndex(tk.Canvas):
2379
2398
  except Exception:
2380
2399
  value = ""
2381
2400
  if not value and self.PAR.ops.show_default_index_for_empty:
2382
- value = get_n2a(datarn, self.default_index)
2401
+ value = get_n2a(datarn, self.PAR.ops.default_row_index)
2383
2402
  return value
2384
2403
 
2385
2404
  def get_value_for_empty_cell(self, datarn: int, r_ops: bool = True) -> object:
@@ -2431,7 +2450,7 @@ class RowIndex(tk.Canvas):
2431
2450
  elif isinstance(self.MT._row_index, int):
2432
2451
  value = (
2433
2452
  not self.MT.data[datarn][self.MT._row_index]
2434
- if type(self.MT.data[datarn][self.MT._row_index], bool)
2453
+ if isinstance(self.MT.data[datarn][self.MT._row_index], bool)
2435
2454
  else False
2436
2455
  )
2437
2456
  else:
@@ -2476,8 +2495,7 @@ class RowIndex(tk.Canvas):
2476
2495
  if iid not in self.tree_open_ids:
2477
2496
  return False
2478
2497
  return True
2479
- else:
2480
- return all(iid in self.tree_open_ids for iid in self.get_iid_ancestors(iid))
2498
+ return all(map(self.tree_open_ids.__contains__, self.get_iid_ancestors(iid)))
2481
2499
 
2482
2500
  def get_iid_ancestors(self, iid: str) -> Generator[str]:
2483
2501
  if self.tree[iid].parent:
@@ -339,11 +339,9 @@ class Sheet(tk.Frame):
339
339
  row_index_align=(
340
340
  convert_align(row_index_align) if row_index_align is not None else convert_align(index_align)
341
341
  ),
342
- default_row_index=default_row_index,
343
342
  )
344
343
  self.CH = ColumnHeaders(
345
344
  parent=self,
346
- default_header=default_header,
347
345
  header_align=convert_align(header_align),
348
346
  )
349
347
  self.MT = MainTable(
@@ -1502,6 +1500,8 @@ class Sheet(tk.Frame):
1502
1500
  if displayed_rows:
1503
1501
  self.MT.displayed_rows = []
1504
1502
  self.MT.all_rows_displayed = True
1503
+ if selections:
1504
+ self.MT.deselect(redraw=False)
1505
1505
  if row_heights:
1506
1506
  self.MT.saved_row_heights = {}
1507
1507
  self.MT.set_row_positions([])
@@ -1514,8 +1514,6 @@ class Sheet(tk.Frame):
1514
1514
  self.MT.reset_tags()
1515
1515
  if undo_stack:
1516
1516
  self.reset_undos()
1517
- if selections:
1518
- self.MT.deselect(redraw=False)
1519
1517
  if sheet_options:
1520
1518
  self.ops = new_sheet_options()
1521
1519
  self.change_theme(redraw=False)
@@ -1556,7 +1554,7 @@ class Sheet(tk.Frame):
1556
1554
  @data.setter
1557
1555
  def data(self, value: list[list[object]]) -> None:
1558
1556
  self.data_reference(value)
1559
-
1557
+
1560
1558
  def new_tksheet_event(self) -> EventDataDict:
1561
1559
  return event_dict(
1562
1560
  name="",
@@ -2924,7 +2922,7 @@ class Sheet(tk.Frame):
2924
2922
 
2925
2923
  def table_align(
2926
2924
  self,
2927
- align: str = None,
2925
+ align: str | None = None,
2928
2926
  redraw: bool = True,
2929
2927
  ) -> str | Sheet:
2930
2928
  if align is None:
@@ -2937,7 +2935,7 @@ class Sheet(tk.Frame):
2937
2935
 
2938
2936
  def header_align(
2939
2937
  self,
2940
- align: str = None,
2938
+ align: str | None = None,
2941
2939
  redraw: bool = True,
2942
2940
  ) -> str | Sheet:
2943
2941
  if align is None:
@@ -2950,7 +2948,7 @@ class Sheet(tk.Frame):
2950
2948
 
2951
2949
  def row_index_align(
2952
2950
  self,
2953
- align: str = None,
2951
+ align: str | None = None,
2954
2952
  redraw: bool = True,
2955
2953
  ) -> str | Sheet:
2956
2954
  if align is None:
@@ -3461,6 +3459,17 @@ class Sheet(tk.Frame):
3461
3459
  return self.MT.row_positions
3462
3460
  return self.MT.get_row_heights()
3463
3461
 
3462
+ def get_safe_row_heights(self) -> list[int]:
3463
+ default_h = self.MT.get_default_row_height()
3464
+ return [0 if e == default_h else e for e in self.MT.gen_row_heights()]
3465
+
3466
+ def set_safe_row_heights(self, heights: list[int]) -> Sheet:
3467
+ default_h = self.MT.get_default_row_height()
3468
+ self.MT.row_positions = list(
3469
+ accumulate(chain([0], (self.valid_row_height(e) if e else default_h for e in heights)))
3470
+ )
3471
+ return self
3472
+
3464
3473
  def get_row_text_height(
3465
3474
  self,
3466
3475
  row: int,
@@ -3823,8 +3832,14 @@ class Sheet(tk.Frame):
3823
3832
  return c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
3824
3833
 
3825
3834
  data_c = displayed_column_to_data
3835
+ datacn = displayed_column_to_data
3826
3836
  dcol = displayed_column_to_data
3827
3837
 
3838
+ def data_column_to_displayed(self, c: int) -> int:
3839
+ return self.MT.dispcn(c)
3840
+
3841
+ dispcn = data_column_to_displayed
3842
+
3828
3843
  def display_columns(
3829
3844
  self,
3830
3845
  columns: None | Literal["all"] | Iterator[int] = None,
@@ -3951,8 +3966,14 @@ class Sheet(tk.Frame):
3951
3966
  return r if self.MT.all_rows_displayed else self.MT.displayed_rows[r]
3952
3967
 
3953
3968
  data_r = displayed_row_to_data
3969
+ datarn = displayed_row_to_data
3954
3970
  drow = displayed_row_to_data
3955
3971
 
3972
+ def data_row_to_displayed(self, r: int) -> int:
3973
+ return self.MT.disprn(r)
3974
+
3975
+ disprn = data_row_to_displayed
3976
+
3956
3977
  def display_rows(
3957
3978
  self,
3958
3979
  rows: None | Literal["all"] | Iterator[int] = None,
@@ -4297,10 +4318,6 @@ class Sheet(tk.Frame):
4297
4318
  )
4298
4319
  if "default_row_height" in kwargs:
4299
4320
  self.default_row_height(kwargs["default_row_height"])
4300
- if "default_header" in kwargs:
4301
- self.CH.default_header = kwargs["default_header"].lower()
4302
- if "default_row_index" in kwargs:
4303
- self.RI.default_index = kwargs["default_row_index"].lower()
4304
4321
  if "max_column_width" in kwargs:
4305
4322
  self.MT.max_column_width = float(kwargs["max_column_width"])
4306
4323
  if "max_row_height" in kwargs:
@@ -6675,9 +6692,6 @@ class Sheet(tk.Frame):
6675
6692
  if self.RI.get_cell_kwargs(r, key="dropdown"):
6676
6693
  return self.MT._row_index[r]
6677
6694
 
6678
- def delete_all_formatting(self, clear_values: bool = False) -> None:
6679
- self.MT.delete_all_formatting(clear_values=clear_values)
6680
-
6681
6695
  def format_cell(
6682
6696
  self,
6683
6697
  r: int | Literal["all"],
@@ -217,6 +217,8 @@ def new_sheet_options() -> DotDict:
217
217
  "default_row_height": "1",
218
218
  "default_column_width": 120,
219
219
  "default_row_index_width": 70,
220
+ "default_row_index": "numbers",
221
+ "default_header": "letters",
220
222
  "page_up_down_select_row": True,
221
223
  "paste_can_expand_x": False,
222
224
  "paste_can_expand_y": False,
@@ -63,7 +63,7 @@ class TextEditorTkText(tk.Text):
63
63
  state=state,
64
64
  )
65
65
  self.align = align
66
- self.rc_popup_menu.delete(0, None)
66
+ self.rc_popup_menu.delete(0, "end")
67
67
  self.rc_popup_menu.add_command(
68
68
  label=sheet_ops.select_all_label,
69
69
  accelerator=sheet_ops.select_all_accelerator,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.2.11
3
+ Version: 7.2.13
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes