tksheet 7.2.12__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.12/tksheet.egg-info → tksheet-7.2.13}/PKG-INFO +1 -1
  2. {tksheet-7.2.12 → tksheet-7.2.13}/pyproject.toml +1 -1
  3. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/__init__.py +1 -0
  4. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/column_headers.py +1 -2
  5. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/functions.py +10 -1
  6. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/main_table.py +2 -2
  7. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/row_index.py +45 -35
  8. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/sheet.py +28 -14
  9. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/sheet_options.py +2 -0
  10. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/text_editor.py +1 -1
  11. {tksheet-7.2.12 → tksheet-7.2.13/tksheet.egg-info}/PKG-INFO +1 -1
  12. {tksheet-7.2.12 → tksheet-7.2.13}/LICENSE.txt +0 -0
  13. {tksheet-7.2.12 → tksheet-7.2.13}/README.md +0 -0
  14. {tksheet-7.2.12 → tksheet-7.2.13}/setup.cfg +0 -0
  15. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/colors.py +0 -0
  16. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/formatters.py +0 -0
  17. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/other_classes.py +0 -0
  18. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/themes.py +0 -0
  19. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/top_left_rectangle.py +0 -0
  20. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/types.py +0 -0
  21. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet/vars.py +0 -0
  22. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet.egg-info/SOURCES.txt +0 -0
  23. {tksheet-7.2.12 → tksheet-7.2.13}/tksheet.egg-info/dependency_links.txt +0 -0
  24. {tksheet-7.2.12 → 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.12
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.12"
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"}
@@ -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
 
@@ -2270,7 +2269,7 @@ class ColumnHeaders(tk.Canvas):
2270
2269
  except Exception:
2271
2270
  value = ""
2272
2271
  if not value and self.PAR.ops.show_default_header_for_empty:
2273
- value = get_n2a(datacn, self.default_header)
2272
+ value = get_n2a(datacn, self.PAR.ops.default_header)
2274
2273
  return value
2275
2274
 
2276
2275
  def get_value_for_empty_cell(self, datacn: int, c_ops: bool = True) -> object:
@@ -37,8 +37,17 @@ unpickle_obj = pickle.loads
37
37
 
38
38
 
39
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)
40
49
  try:
41
- 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)
42
51
  except Exception:
43
52
  return csv.excel_tab
44
53
 
@@ -6345,7 +6345,7 @@ class MainTable(tk.Canvas):
6345
6345
  for r in range(box.coords.from_r, box.coords.upto_r)
6346
6346
  }
6347
6347
  if get_cells_as_rows:
6348
- return s | set(tup[0] for tup in self.get_selected_cells())
6348
+ return s | set(map(itemgetter(0), self.gen_selected_cells()))
6349
6349
  return s
6350
6350
 
6351
6351
  def get_selected_cols(
@@ -6369,7 +6369,7 @@ class MainTable(tk.Canvas):
6369
6369
  for c in range(box.coords.from_c, box.coords.upto_c)
6370
6370
  }
6371
6371
  if get_cells_as_cols:
6372
- return s | set(tup[1] for tup in self.get_selected_cells())
6372
+ return s | set(map(itemgetter(1), self.gen_selected_cells()))
6373
6373
  return s
6374
6374
 
6375
6375
  def get_selected_cells(
@@ -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()
@@ -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
@@ -2388,7 +2398,7 @@ class RowIndex(tk.Canvas):
2388
2398
  except Exception:
2389
2399
  value = ""
2390
2400
  if not value and self.PAR.ops.show_default_index_for_empty:
2391
- value = get_n2a(datarn, self.default_index)
2401
+ value = get_n2a(datarn, self.PAR.ops.default_row_index)
2392
2402
  return value
2393
2403
 
2394
2404
  def get_value_for_empty_cell(self, datarn: int, r_ops: bool = True) -> object:
@@ -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)
@@ -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.12
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