tksheet 7.4.4__tar.gz → 7.4.6__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 (27) hide show
  1. {tksheet-7.4.4/tksheet.egg-info → tksheet-7.4.6}/PKG-INFO +4 -2
  2. {tksheet-7.4.4 → tksheet-7.4.6}/pyproject.toml +8 -4
  3. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/__init__.py +1 -1
  4. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/column_headers.py +84 -86
  5. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/constants.py +4 -3
  6. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/find_window.py +8 -8
  7. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/formatters.py +58 -74
  8. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/functions.py +65 -79
  9. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/main_table.py +330 -448
  10. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/other_classes.py +19 -25
  11. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/row_index.py +114 -92
  12. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/sheet.py +191 -208
  13. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/sorting.py +23 -22
  14. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/text_editor.py +18 -12
  15. tksheet-7.4.6/tksheet/tksheet_types.py +216 -0
  16. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/top_left_rectangle.py +18 -18
  17. {tksheet-7.4.4 → tksheet-7.4.6/tksheet.egg-info}/PKG-INFO +4 -2
  18. tksheet-7.4.4/tksheet/tksheet_types.py +0 -29
  19. {tksheet-7.4.4 → tksheet-7.4.6}/LICENSE.txt +0 -0
  20. {tksheet-7.4.4 → tksheet-7.4.6}/README.md +0 -0
  21. {tksheet-7.4.4 → tksheet-7.4.6}/setup.cfg +0 -0
  22. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/colors.py +0 -0
  23. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/sheet_options.py +0 -0
  24. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/themes.py +0 -0
  25. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet.egg-info/SOURCES.txt +0 -0
  26. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet.egg-info/dependency_links.txt +0 -0
  27. {tksheet-7.4.4 → tksheet-7.4.6}/tksheet.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tksheet
3
- Version: 7.4.4
3
+ Version: 7.4.6
4
4
  Summary: Tkinter table / sheet and treeview widget
5
5
  Author-email: ragardner <github@ragardner.simplelogin.com>
6
6
  License: Copyright (c) 2019 ragardner and open source contributors
@@ -24,7 +24,9 @@ License: Copyright (c) 2019 ragardner and open source contributors
24
24
  SOFTWARE.
25
25
 
26
26
  Project-URL: Homepage, https://github.com/ragardner/tksheet
27
- Project-URL: Bug Reports, https://github.com/ragardner/tksheet/issues
27
+ Project-URL: Documentation, https://github.com/ragardner/tksheet/wiki/Version-7
28
+ Project-URL: Changelog, https://github.com/ragardner/tksheet/blob/master/docs/CHANGELOG.md
29
+ Project-URL: Issues, https://github.com/ragardner/tksheet/issues
28
30
  Project-URL: Funding, https://github.com/ragardner
29
31
  Keywords: tkinter,table,widget,tree,treeview,sheet,grid,tk
30
32
  Classifier: Development Status :: 5 - Production/Stable
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
  name = "tksheet"
7
7
  description = "Tkinter table / sheet and treeview widget"
8
8
  readme = "README.md"
9
- version = "7.4.4"
9
+ version = "7.4.6"
10
10
  authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
11
11
  requires-python = ">=3.8"
12
12
  license = {file = "LICENSE.txt"}
@@ -25,9 +25,13 @@ classifiers = [
25
25
  ]
26
26
 
27
27
  [project.urls]
28
- "Homepage" = "https://github.com/ragardner/tksheet"
29
- "Bug Reports" = "https://github.com/ragardner/tksheet/issues"
30
- "Funding" = "https://github.com/ragardner"
28
+ Homepage = "https://github.com/ragardner/tksheet"
29
+ Documentation = "https://github.com/ragardner/tksheet/wiki/Version-7"
30
+ Changelog = "https://github.com/ragardner/tksheet/blob/master/docs/CHANGELOG.md"
31
+ Issues = "https://github.com/ragardner/tksheet/issues"
32
+ Funding = "https://github.com/ragardner"
31
33
 
32
34
  [tool.ruff]
33
35
  line-length = 120
36
+ extend-select = ["I", "F", "C4", "E", "B", "SIM"]
37
+ fix = true
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.4.4"
7
+ __version__ = "7.4.6"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
@@ -7,7 +7,7 @@ from functools import partial
7
7
  from itertools import cycle, islice, repeat
8
8
  from math import ceil, floor
9
9
  from operator import itemgetter
10
- from typing import Literal
10
+ from typing import Any, Literal
11
11
 
12
12
  from .colors import color_map
13
13
  from .constants import (
@@ -89,7 +89,7 @@ class ColumnHeaders(tk.Canvas):
89
89
  self.edit_cell_enabled = False
90
90
  self.dragged_col = None
91
91
  self.visible_col_dividers = {}
92
- self.col_height_resize_bbox = tuple()
92
+ self.col_height_resize_bbox = ()
93
93
  self.cell_options = {}
94
94
  self.rsz_w = None
95
95
  self.rsz_h = None
@@ -166,7 +166,7 @@ class ColumnHeaders(tk.Canvas):
166
166
  self.current_height = new_height
167
167
  return expanded
168
168
 
169
- def rc(self, event: object) -> None:
169
+ def rc(self, event: Any) -> None:
170
170
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
171
171
  self.focus_set()
172
172
  popup_menu = None
@@ -193,7 +193,7 @@ class ColumnHeaders(tk.Canvas):
193
193
  self.popup_menu_loc = c
194
194
  popup_menu.tk_popup(event.x_root, event.y_root)
195
195
 
196
- def ctrl_b1_press(self, event: object) -> None:
196
+ def ctrl_b1_press(self, event: Any) -> None:
197
197
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
198
198
  if (
199
199
  (self.drag_and_drop_enabled or self.col_selection_enabled)
@@ -216,7 +216,7 @@ class ColumnHeaders(tk.Canvas):
216
216
  elif not self.MT.ctrl_select_enabled:
217
217
  self.b1_press(event)
218
218
 
219
- def ctrl_shift_b1_press(self, event: object) -> None:
219
+ def ctrl_shift_b1_press(self, event: Any) -> None:
220
220
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
221
221
  x = event.x
222
222
  c = self.MT.identify_col(x=x)
@@ -252,31 +252,35 @@ class ColumnHeaders(tk.Canvas):
252
252
  elif not self.MT.ctrl_select_enabled:
253
253
  self.shift_b1_press(event)
254
254
 
255
- def shift_b1_press(self, event: object) -> None:
255
+ def shift_b1_press(self, event: Any) -> None:
256
256
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
257
257
  c = self.MT.identify_col(x=event.x)
258
- if (self.drag_and_drop_enabled or self.col_selection_enabled) and self.rsz_h is None and self.rsz_w is None:
259
- if c < len(self.MT.col_positions) - 1:
260
- c_selected = self.MT.col_selected(c)
261
- if not c_selected and self.col_selection_enabled:
262
- if self.MT.selected and self.MT.selected.type_ == "columns":
263
- r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
264
- self.MT.deselect("all", redraw=False)
265
- self.being_drawn_item = self.MT.create_selection_box(
266
- *self.get_shift_select_box(c, c_to_sel), "columns"
267
- )
268
- self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
269
- else:
270
- self.being_drawn_item = self.select_col(c, run_binding_func=False)
271
- self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
272
- sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
273
- try_binding(self.shift_selection_binding_func, sel_event)
274
- self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
275
- elif c_selected:
276
- self.dragged_col = DraggedRowColumn(
277
- dragged=c,
278
- to_move=sorted(self.MT.get_selected_cols()),
258
+ if (
259
+ (self.drag_and_drop_enabled or self.col_selection_enabled)
260
+ and self.rsz_h is None
261
+ and self.rsz_w is None
262
+ and c < len(self.MT.col_positions) - 1
263
+ ):
264
+ c_selected = self.MT.col_selected(c)
265
+ if not c_selected and self.col_selection_enabled:
266
+ if self.MT.selected and self.MT.selected.type_ == "columns":
267
+ r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
268
+ self.MT.deselect("all", redraw=False)
269
+ self.being_drawn_item = self.MT.create_selection_box(
270
+ *self.get_shift_select_box(c, c_to_sel), "columns"
279
271
  )
272
+ self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
273
+ else:
274
+ self.being_drawn_item = self.select_col(c, run_binding_func=False)
275
+ self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
276
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
277
+ try_binding(self.shift_selection_binding_func, sel_event)
278
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
279
+ elif c_selected:
280
+ self.dragged_col = DraggedRowColumn(
281
+ dragged=c,
282
+ to_move=sorted(self.MT.get_selected_cols()),
283
+ )
280
284
 
281
285
  def get_shift_select_box(self, c: int, min_c: int) -> tuple[int, int, int, int, str]:
282
286
  if c >= min_c:
@@ -319,7 +323,7 @@ class ColumnHeaders(tk.Canvas):
319
323
  if x >= x1 and y >= y1 and x <= x2 and y <= y2:
320
324
  return c
321
325
 
322
- def mouse_motion(self, event: object) -> None:
326
+ def mouse_motion(self, event: Any) -> None:
323
327
  if not self.currently_resizing_height and not self.currently_resizing_width:
324
328
  x = self.canvasx(event.x)
325
329
  y = self.canvasy(event.y)
@@ -351,17 +355,16 @@ class ColumnHeaders(tk.Canvas):
351
355
  self.rsz_h = None
352
356
  except Exception:
353
357
  self.rsz_h = None
354
- if not mouse_over_resize:
355
- if self.MT.col_selected(self.MT.identify_col(event, allow_end=False)):
356
- mouse_over_selected = True
357
- if self.MT.current_cursor != "hand2":
358
- self.config(cursor="hand2")
359
- self.MT.current_cursor = "hand2"
358
+ if not mouse_over_resize and self.MT.col_selected(self.MT.identify_col(event, allow_end=False)):
359
+ mouse_over_selected = True
360
+ if self.MT.current_cursor != "hand2":
361
+ self.config(cursor="hand2")
362
+ self.MT.current_cursor = "hand2"
360
363
  if not mouse_over_resize and not mouse_over_selected:
361
364
  self.MT.reset_mouse_motion_creations()
362
365
  try_binding(self.extra_motion_func, event)
363
366
 
364
- def double_b1(self, event: object) -> None:
367
+ def double_b1(self, event: Any) -> None:
365
368
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
366
369
  self.focus_set()
367
370
  if (
@@ -401,7 +404,7 @@ class ColumnHeaders(tk.Canvas):
401
404
  self.mouse_motion(event)
402
405
  try_binding(self.extra_double_b1_func, event)
403
406
 
404
- def b1_press(self, event: object) -> None:
407
+ def b1_press(self, event: Any) -> None:
405
408
  self.MT.unbind("<MouseWheel>")
406
409
  self.focus_set()
407
410
  self.closed_dropdown = self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
@@ -462,7 +465,7 @@ class ColumnHeaders(tk.Canvas):
462
465
  self.toggle_select_col(c, redraw=True)
463
466
  try_binding(self.extra_b1_press_func, event)
464
467
 
465
- def b1_motion(self, event: object) -> None:
468
+ def b1_motion(self, event: Any) -> None:
466
469
  x1, y1, x2, y2 = self.MT.get_canvas_visible_area()
467
470
  if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
468
471
  x = self.canvasx(event.x)
@@ -565,7 +568,7 @@ class ColumnHeaders(tk.Canvas):
565
568
  elif end_col < start_col:
566
569
  return 0, end_col, len(self.MT.row_positions) - 1, start_col + 1, "columns"
567
570
 
568
- def ctrl_b1_motion(self, event: object) -> None:
571
+ def ctrl_b1_motion(self, event: Any) -> None:
569
572
  x1, y1, x2, y2 = self.MT.get_canvas_visible_area()
570
573
  if (
571
574
  self.drag_and_drop_enabled
@@ -619,7 +622,7 @@ class ColumnHeaders(tk.Canvas):
619
622
  elif not self.MT.ctrl_select_enabled:
620
623
  self.b1_motion(event)
621
624
 
622
- def drag_and_drop_motion(self, event: object) -> float:
625
+ def drag_and_drop_motion(self, event: Any) -> float:
623
626
  x = event.x
624
627
  wend = self.winfo_width()
625
628
  xcheck = self.xview()
@@ -687,7 +690,7 @@ class ColumnHeaders(tk.Canvas):
687
690
  if ctrl_lines:
688
691
  self.MT.delete_ctrl_outlines()
689
692
 
690
- def scroll_if_event_offscreen(self, event: object) -> bool:
693
+ def scroll_if_event_offscreen(self, event: Any) -> bool:
691
694
  xcheck = self.xview()
692
695
  need_redraw = False
693
696
  if event.x > self.winfo_width() and len(xcheck) > 1 and xcheck[1] < 1:
@@ -717,24 +720,20 @@ class ColumnHeaders(tk.Canvas):
717
720
  elif len(xcheck) > 1 and xcheck[1] > 1:
718
721
  self.MT.set_xviews("moveto", 1)
719
722
 
720
- def event_over_dropdown(self, c: int, datacn: int, event: object, canvasx: float) -> bool:
721
- if (
723
+ def event_over_dropdown(self, c: int, datacn: int, event: Any, canvasx: float) -> bool:
724
+ return (
722
725
  event.y < self.MT.header_txt_height + 5
723
726
  and self.get_cell_kwargs(datacn, key="dropdown")
724
727
  and canvasx < self.MT.col_positions[c + 1]
725
728
  and canvasx > self.MT.col_positions[c + 1] - self.MT.header_txt_height - 4
726
- ):
727
- return True
728
- return False
729
+ )
729
730
 
730
- def event_over_checkbox(self, c: int, datacn: int, event: object, canvasx: float) -> bool:
731
- if (
731
+ def event_over_checkbox(self, c: int, datacn: int, event: Any, canvasx: float) -> bool:
732
+ return (
732
733
  event.y < self.MT.header_txt_height + 5
733
734
  and self.get_cell_kwargs(datacn, key="checkbox")
734
735
  and canvasx < self.MT.col_positions[c] + self.MT.header_txt_height + 4
735
- ):
736
- return True
737
- return False
736
+ )
738
737
 
739
738
  def drag_width_resize(self) -> None:
740
739
  new_col_pos = int(self.coords("rwl")[0])
@@ -762,7 +761,7 @@ class ColumnHeaders(tk.Canvas):
762
761
  )
763
762
  )
764
763
 
765
- def b1_release(self, event: object) -> None:
764
+ def b1_release(self, event: Any) -> None:
766
765
  to_hide = self.being_drawn_item
767
766
  if self.being_drawn_item is not None and (to_sel := self.MT.coords_and_type(self.being_drawn_item)):
768
767
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
@@ -1183,10 +1182,7 @@ class ColumnHeaders(tk.Canvas):
1183
1182
  # table
1184
1183
  if self.MT.data:
1185
1184
  if self.MT.all_rows_displayed:
1186
- if visible_only:
1187
- iterable = range(*self.MT.visible_text_rows)
1188
- else:
1189
- iterable = range(0, len(self.MT.data))
1185
+ iterable = range(*self.MT.visible_text_rows) if visible_only else range(0, len(self.MT.data))
1190
1186
  else:
1191
1187
  if visible_only:
1192
1188
  start_row, end_row = self.MT.visible_text_rows
@@ -1203,11 +1199,13 @@ class ColumnHeaders(tk.Canvas):
1203
1199
  qconf(qtxtm, text=txt, font=qfont)
1204
1200
  b = qbbox(qtxtm)
1205
1201
  if (
1206
- self.MT.get_cell_kwargs(datarn, datacn, key="dropdown")
1207
- or self.MT.get_cell_kwargs(datarn, datacn, key="checkbox")
1208
- ) and (tw := b[2] - b[0] + qtxth + 7) > w:
1209
- w = tw
1210
- elif (tw := b[2] - b[0] + 7) > w:
1202
+ (
1203
+ self.MT.get_cell_kwargs(datarn, datacn, key="dropdown")
1204
+ or self.MT.get_cell_kwargs(datarn, datacn, key="checkbox")
1205
+ )
1206
+ and (tw := b[2] - b[0] + qtxth + 7) > w
1207
+ or (tw := b[2] - b[0] + 7) > w
1208
+ ):
1211
1209
  w = tw
1212
1210
  if hw > w:
1213
1211
  w = hw
@@ -1516,9 +1514,8 @@ class ColumnHeaders(tk.Canvas):
1516
1514
  col_pos_exists: bool,
1517
1515
  set_scrollregion: bool,
1518
1516
  ) -> bool:
1519
- if set_scrollregion:
1520
- if not self.configure_scrollregion(last_col_line_pos=last_col_line_pos):
1521
- return False
1517
+ if set_scrollregion and not self.configure_scrollregion(last_col_line_pos=last_col_line_pos):
1518
+ return False
1522
1519
  self.hidd_text.update(self.disp_text)
1523
1520
  self.disp_text = {}
1524
1521
  self.hidd_high.update(self.disp_high)
@@ -1634,7 +1631,7 @@ class ColumnHeaders(tk.Canvas):
1634
1631
  if not text:
1635
1632
  continue
1636
1633
  max_lines = int((self.current_height - top - 2) / txt_h)
1637
- for text in wrap_text(
1634
+ for wrapped in wrap_text(
1638
1635
  text=text,
1639
1636
  max_width=max_width,
1640
1637
  max_lines=max_lines,
@@ -1648,7 +1645,7 @@ class ColumnHeaders(tk.Canvas):
1648
1645
  if showing:
1649
1646
  self.itemconfig(
1650
1647
  iid,
1651
- text=text,
1648
+ text=wrapped,
1652
1649
  fill=fill,
1653
1650
  font=font,
1654
1651
  anchor=align,
@@ -1656,7 +1653,7 @@ class ColumnHeaders(tk.Canvas):
1656
1653
  else:
1657
1654
  self.itemconfig(
1658
1655
  iid,
1659
- text=text,
1656
+ text=wrapped,
1660
1657
  fill=fill,
1661
1658
  font=font,
1662
1659
  anchor=align,
@@ -1667,7 +1664,7 @@ class ColumnHeaders(tk.Canvas):
1667
1664
  iid = self.create_text(
1668
1665
  draw_x,
1669
1666
  draw_y,
1670
- text=text,
1667
+ text=wrapped,
1671
1668
  fill=fill,
1672
1669
  font=font,
1673
1670
  anchor=align,
@@ -1720,7 +1717,7 @@ class ColumnHeaders(tk.Canvas):
1720
1717
  d[box.type_ if box.type_ != "rows" else "cells"].add(c)
1721
1718
  return d
1722
1719
 
1723
- def open_cell(self, event: object = None, ignore_existing_editor: bool = False) -> None:
1720
+ def open_cell(self, event: Any = None, ignore_existing_editor: bool = False) -> None:
1724
1721
  if not self.MT.anything_selected() or (not ignore_existing_editor and self.text_editor.open):
1725
1722
  return
1726
1723
  if not self.MT.selected:
@@ -1750,9 +1747,9 @@ class ColumnHeaders(tk.Canvas):
1750
1747
  # c is displayed col
1751
1748
  def open_text_editor(
1752
1749
  self,
1753
- event: object = None,
1750
+ event: Any = None,
1754
1751
  c: int = 0,
1755
- text: object = None,
1752
+ text: Any = None,
1756
1753
  state: str = "normal",
1757
1754
  dropdown: bool = False,
1758
1755
  ) -> bool:
@@ -1795,7 +1792,7 @@ class ColumnHeaders(tk.Canvas):
1795
1792
  self.text_editor.set_text(self.text_editor.get() + "" if not isinstance(text, str) else text)
1796
1793
  return False
1797
1794
  self.hide_text_editor()
1798
- if not self.MT.see(r=0, c=c, keep_yscroll=True, check_cell_visibility=True):
1795
+ if not self.MT.see(0, c, keep_yscroll=True):
1799
1796
  self.MT.main_table_redraw_grid_and_text(True, True)
1800
1797
  x = self.MT.col_positions[c] + 1
1801
1798
  y = 0
@@ -1866,7 +1863,7 @@ class ColumnHeaders(tk.Canvas):
1866
1863
  self.coords(self.text_editor.canvas_id, self.MT.col_positions[c] + 1, 0)
1867
1864
 
1868
1865
  # displayed indexes
1869
- def text_editor_newline_binding(self, event: object = None, check_lines: bool = True) -> None:
1866
+ def text_editor_newline_binding(self, event: Any = None, check_lines: bool = True) -> None:
1870
1867
  if not self.height_resizing_enabled:
1871
1868
  return
1872
1869
  curr_height = self.text_editor.window.winfo_height()
@@ -2053,7 +2050,7 @@ class ColumnHeaders(tk.Canvas):
2053
2050
  self.text_editor.autocomplete(self.dropdown.window.search_and_see(event_data))
2054
2051
  return "break"
2055
2052
 
2056
- def open_dropdown_window(self, c: int, event: object = None) -> None:
2053
+ def open_dropdown_window(self, c: int, event: Any = None) -> None:
2057
2054
  self.hide_text_editor()
2058
2055
  kwargs = self.get_cell_kwargs(self.MT.datacn(c), key="dropdown")
2059
2056
  if kwargs["state"] == "disabled":
@@ -2123,7 +2120,7 @@ class ColumnHeaders(tk.Canvas):
2123
2120
  def close_dropdown_window(
2124
2121
  self,
2125
2122
  c: None | int = None,
2126
- selection: object = None,
2123
+ selection: Any = None,
2127
2124
  redraw: bool = True,
2128
2125
  ) -> None:
2129
2126
  if c is not None and selection is not None:
@@ -2187,7 +2184,7 @@ class ColumnHeaders(tk.Canvas):
2187
2184
  self,
2188
2185
  c: int = 0,
2189
2186
  datacn: int | None = None,
2190
- value: object = "",
2187
+ value: Any = "",
2191
2188
  cell_resize: bool = True,
2192
2189
  undo: bool = True,
2193
2190
  redraw: bool = True,
@@ -2232,7 +2229,7 @@ class ColumnHeaders(tk.Canvas):
2232
2229
  self.MT.sheet_modified(event_data)
2233
2230
  return edited
2234
2231
 
2235
- def set_cell_data(self, datacn: int | None = None, value: object = "") -> None:
2232
+ def set_cell_data(self, datacn: int | None = None, value: Any = "") -> None:
2236
2233
  if isinstance(self.MT._headers, int):
2237
2234
  self.MT.set_cell_data(datarn=self.MT._headers, datacn=datacn, value=value)
2238
2235
  else:
@@ -2242,20 +2239,21 @@ class ColumnHeaders(tk.Canvas):
2242
2239
  else:
2243
2240
  self.MT._headers[datacn] = value
2244
2241
 
2245
- def input_valid_for_cell(self, datacn: int, value: object, check_readonly: bool = True) -> bool:
2242
+ def input_valid_for_cell(self, datacn: int, value: Any, check_readonly: bool = True) -> bool:
2246
2243
  kwargs = self.get_cell_kwargs(datacn, key=None)
2247
2244
  if check_readonly and "readonly" in kwargs:
2248
2245
  return False
2249
2246
  elif "checkbox" in kwargs:
2250
2247
  return is_bool_like(value)
2251
- elif self.cell_equal_to(datacn, value):
2252
- return False
2253
- elif (kwargs := kwargs.get("dropdown", {})) and kwargs["validate_input"] and value not in kwargs["values"]:
2254
- return False
2255
2248
  else:
2256
- return True
2249
+ return not (
2250
+ self.cell_equal_to(datacn, value)
2251
+ or (kwargs := kwargs.get("dropdown", {}))
2252
+ and kwargs["validate_input"]
2253
+ and value not in kwargs["values"]
2254
+ )
2257
2255
 
2258
- def cell_equal_to(self, datacn: int, value: object) -> bool:
2256
+ def cell_equal_to(self, datacn: int, value: Any) -> bool:
2259
2257
  self.fix_header(datacn)
2260
2258
  if isinstance(self.MT._headers, list):
2261
2259
  return self.MT._headers[datacn] == value
@@ -2268,7 +2266,7 @@ class ColumnHeaders(tk.Canvas):
2268
2266
  get_displayed: bool = False,
2269
2267
  none_to_empty_str: bool = False,
2270
2268
  redirect_int: bool = False,
2271
- ) -> object:
2269
+ ) -> Any:
2272
2270
  if get_displayed:
2273
2271
  return self.get_valid_cell_data_as_str(datacn, fix=False)
2274
2272
  if redirect_int and isinstance(self.MT._headers, int): # internal use
@@ -2307,7 +2305,7 @@ class ColumnHeaders(tk.Canvas):
2307
2305
  value = get_n2a(datacn, self.ops.default_header)
2308
2306
  return value
2309
2307
 
2310
- def get_value_for_empty_cell(self, datacn: int, c_ops: bool = True) -> object:
2308
+ def get_value_for_empty_cell(self, datacn: int, c_ops: bool = True) -> Any:
2311
2309
  kwargs = self.get_cell_kwargs(datacn, key=None, cell=c_ops)
2312
2310
  if "checkbox" in kwargs:
2313
2311
  return False
@@ -2316,7 +2314,7 @@ class ColumnHeaders(tk.Canvas):
2316
2314
  else:
2317
2315
  return ""
2318
2316
 
2319
- def get_empty_header_seq(self, end: int, start: int = 0, c_ops: bool = True) -> list[object]:
2317
+ def get_empty_header_seq(self, end: int, start: int = 0, c_ops: bool = True) -> list[Any]:
2320
2318
  return [self.get_value_for_empty_cell(datacn, c_ops=c_ops) for datacn in range(start, end)]
2321
2319
 
2322
2320
  def fix_header(self, datacn: None | int = None) -> None:
@@ -1,14 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from platform import system as get_os
4
+ from typing import Hashable
4
5
 
5
6
  USER_OS: str = f"{get_os()}".lower()
6
7
  ctrl_key: str = "Command" if USER_OS == "darwin" else "Control"
7
8
  rc_binding: str = "<2>" if USER_OS == "darwin" else "<3>"
8
9
  symbols_set: set[str] = set("""!#$%&'()*+,-./:;"@[]^_`{|}~>?= \\""")
9
- nonelike: set[object] = {None, "none", ""}
10
- truthy: set[object] = {True, "true", "t", "yes", "y", "on", "1", 1, 1.0}
11
- falsy: set[object] = {False, "false", "f", "no", "n", "off", "0", 0, 0.0}
10
+ nonelike: set[Hashable] = {None, "none", ""}
11
+ truthy: set[Hashable] = {True, "true", "t", "yes", "y", "on", "1"}
12
+ falsy: set[Hashable] = {False, "false", "f", "no", "n", "off", "0"}
12
13
  _test_str: str = "aiW_-|"
13
14
 
14
15
  val_modifying_options: set[str] = {"checkbox", "format", "dropdown"}
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import tkinter as tk
4
4
  from collections.abc import Callable
5
- from typing import Literal
5
+ from typing import Any, Literal
6
6
 
7
7
  from .constants import ctrl_key, rc_binding
8
8
  from .functions import recursive_bind
@@ -83,11 +83,11 @@ class FindWindowTkText(tk.Text):
83
83
  **menu_kwargs,
84
84
  )
85
85
 
86
- def rc(self, event: object) -> None:
86
+ def rc(self, event: Any) -> None:
87
87
  self.focus_set()
88
88
  self.rc_popup_menu.tk_popup(event.x_root, event.y_root)
89
89
 
90
- def delete_key(self, event: object = None) -> None:
90
+ def delete_key(self, event: Any = None) -> None:
91
91
  if self.editor_del_key == "forward":
92
92
  return
93
93
  elif not self.editor_del_key:
@@ -100,27 +100,27 @@ class FindWindowTkText(tk.Text):
100
100
  self.delete("insert-1c")
101
101
  return "break"
102
102
 
103
- def select_all(self, event: object = None) -> Literal["break"]:
103
+ def select_all(self, event: Any = None) -> Literal["break"]:
104
104
  self.tag_add(tk.SEL, "1.0", tk.END)
105
105
  self.mark_set(tk.INSERT, tk.END)
106
106
  # self.see(tk.INSERT)
107
107
  return "break"
108
108
 
109
- def cut(self, event: object = None) -> Literal["break"]:
109
+ def cut(self, event: Any = None) -> Literal["break"]:
110
110
  self.event_generate(f"<{ctrl_key}-x>")
111
111
  self.event_generate("<KeyRelease>")
112
112
  return "break"
113
113
 
114
- def copy(self, event: object = None) -> Literal["break"]:
114
+ def copy(self, event: Any = None) -> Literal["break"]:
115
115
  self.event_generate(f"<{ctrl_key}-c>")
116
116
  return "break"
117
117
 
118
- def paste(self, event: object = None) -> Literal["break"]:
118
+ def paste(self, event: Any = None) -> Literal["break"]:
119
119
  self.event_generate(f"<{ctrl_key}-v>")
120
120
  self.event_generate("<KeyRelease>")
121
121
  return "break"
122
122
 
123
- def undo(self, event: object = None) -> Literal["break"]:
123
+ def undo(self, event: Any = None) -> Literal["break"]:
124
124
  self.event_generate(f"<{ctrl_key}-z>")
125
125
  self.event_generate("<KeyRelease>")
126
126
  return "break"