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.
- {tksheet-7.4.4/tksheet.egg-info → tksheet-7.4.6}/PKG-INFO +4 -2
- {tksheet-7.4.4 → tksheet-7.4.6}/pyproject.toml +8 -4
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/__init__.py +1 -1
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/column_headers.py +84 -86
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/constants.py +4 -3
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/find_window.py +8 -8
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/formatters.py +58 -74
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/functions.py +65 -79
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/main_table.py +330 -448
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/other_classes.py +19 -25
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/row_index.py +114 -92
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/sheet.py +191 -208
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/sorting.py +23 -22
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/text_editor.py +18 -12
- tksheet-7.4.6/tksheet/tksheet_types.py +216 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/top_left_rectangle.py +18 -18
- {tksheet-7.4.4 → tksheet-7.4.6/tksheet.egg-info}/PKG-INFO +4 -2
- tksheet-7.4.4/tksheet/tksheet_types.py +0 -29
- {tksheet-7.4.4 → tksheet-7.4.6}/LICENSE.txt +0 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/README.md +0 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/setup.cfg +0 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/colors.py +0 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/sheet_options.py +0 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet/themes.py +0 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.4.4 → tksheet-7.4.6}/tksheet.egg-info/dependency_links.txt +0 -0
- {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.
|
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:
|
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.
|
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
|
-
|
29
|
-
|
30
|
-
|
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
|
@@ -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 =
|
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:
|
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:
|
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:
|
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:
|
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 (
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
self.
|
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:
|
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
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
721
|
-
|
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:
|
731
|
-
|
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:
|
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
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
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
|
-
|
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
|
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=
|
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=
|
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=
|
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:
|
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:
|
1750
|
+
event: Any = None,
|
1754
1751
|
c: int = 0,
|
1755
|
-
text:
|
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(
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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
|
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:
|
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
|
-
) ->
|
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) ->
|
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[
|
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[
|
10
|
-
truthy: set[
|
11
|
-
falsy: set[
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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"
|