tksheet 7.2.19__tar.gz → 7.2.20__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.2.19/tksheet.egg-info → tksheet-7.2.20}/PKG-INFO +1 -1
- {tksheet-7.2.19 → tksheet-7.2.20}/pyproject.toml +1 -1
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/__init__.py +4 -1
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/column_headers.py +1 -2
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/formatters.py +25 -7
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/main_table.py +10 -13
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/row_index.py +1 -2
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/sheet.py +1 -2
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/text_editor.py +2 -4
- {tksheet-7.2.19 → tksheet-7.2.20/tksheet.egg-info}/PKG-INFO +1 -1
- {tksheet-7.2.19 → tksheet-7.2.20}/LICENSE.txt +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/README.md +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/setup.cfg +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/colors.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/functions.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/other_classes.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/sheet_options.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/themes.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/top_left_rectangle.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/types.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet/vars.py +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet.egg-info/dependency_links.txt +0 -0
- {tksheet-7.2.19 → tksheet-7.2.20}/tksheet.egg-info/top_level.txt +0 -0
@@ -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.
|
9
|
+
version = "7.2.20"
|
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.
|
7
|
+
__version__ = "7.2.20"
|
8
8
|
|
9
9
|
from .colors import (
|
10
10
|
color_map,
|
@@ -12,6 +12,8 @@ from .colors import (
|
|
12
12
|
from .column_headers import ColumnHeaders
|
13
13
|
from .formatters import (
|
14
14
|
Formatter,
|
15
|
+
alt_percentage_to_str,
|
16
|
+
alt_to_percentage,
|
15
17
|
bool_formatter,
|
16
18
|
data_to_str,
|
17
19
|
float_formatter,
|
@@ -28,6 +30,7 @@ from .formatters import (
|
|
28
30
|
to_bool,
|
29
31
|
to_float,
|
30
32
|
to_int,
|
33
|
+
to_percentage,
|
31
34
|
to_str,
|
32
35
|
try_to_bool,
|
33
36
|
)
|
@@ -5,19 +5,25 @@ from collections.abc import Callable
|
|
5
5
|
from .vars import falsy, nonelike, truthy
|
6
6
|
|
7
7
|
|
8
|
-
def is_none_like(o: object):
|
8
|
+
def is_none_like(o: object) -> bool:
|
9
9
|
if (isinstance(o, str) and o.lower().replace(" ", "") in nonelike) or o in nonelike:
|
10
10
|
return True
|
11
11
|
return False
|
12
12
|
|
13
13
|
|
14
|
-
def to_int(o: object, **kwargs):
|
14
|
+
def to_int(o: object, **kwargs) -> int:
|
15
15
|
if isinstance(o, int):
|
16
16
|
return o
|
17
17
|
return int(float(o))
|
18
18
|
|
19
19
|
|
20
|
-
def to_float(o: object, **kwargs):
|
20
|
+
def to_float(o: object, **kwargs) -> float:
|
21
|
+
if isinstance(o, float):
|
22
|
+
return o
|
23
|
+
return float(o)
|
24
|
+
|
25
|
+
|
26
|
+
def to_percentage(o: object, **kwargs) -> float:
|
21
27
|
if isinstance(o, float):
|
22
28
|
return o
|
23
29
|
if isinstance(o, str) and o.endswith("%"):
|
@@ -25,7 +31,15 @@ def to_float(o: object, **kwargs):
|
|
25
31
|
return float(o)
|
26
32
|
|
27
33
|
|
28
|
-
def
|
34
|
+
def alt_to_percentage(o: object, **kwargs) -> float:
|
35
|
+
if isinstance(o, float):
|
36
|
+
return o
|
37
|
+
if isinstance(o, str) and o.endswith("%"):
|
38
|
+
return float(o.replace("%", ""))
|
39
|
+
return float(o)
|
40
|
+
|
41
|
+
|
42
|
+
def to_bool(val: object, **kwargs) -> bool:
|
29
43
|
if isinstance(val, bool):
|
30
44
|
return val
|
31
45
|
if isinstance(val, str):
|
@@ -47,14 +61,14 @@ def to_bool(val: object, **kwargs):
|
|
47
61
|
raise ValueError(f'Cannot map "{val}" to bool.')
|
48
62
|
|
49
63
|
|
50
|
-
def try_to_bool(o: object, **kwargs):
|
64
|
+
def try_to_bool(o: object, **kwargs) -> object:
|
51
65
|
try:
|
52
66
|
return to_bool(o)
|
53
67
|
except Exception:
|
54
68
|
return o
|
55
69
|
|
56
70
|
|
57
|
-
def is_bool_like(o: object, **kwargs):
|
71
|
+
def is_bool_like(o: object, **kwargs) -> bool:
|
58
72
|
try:
|
59
73
|
to_bool(o)
|
60
74
|
return True
|
@@ -91,6 +105,10 @@ def percentage_to_str(v: object, **kwargs: dict) -> str:
|
|
91
105
|
return f"{v}%"
|
92
106
|
|
93
107
|
|
108
|
+
def alt_percentage_to_str(v: object, **kwargs: dict) -> str:
|
109
|
+
return f"{float_to_str(v)}%"
|
110
|
+
|
111
|
+
|
94
112
|
def bool_to_str(v: object, **kwargs: dict) -> str:
|
95
113
|
return f"{v}"
|
96
114
|
|
@@ -127,7 +145,7 @@ def float_formatter(
|
|
127
145
|
|
128
146
|
def percentage_formatter(
|
129
147
|
datatypes: tuple[object] | object = float,
|
130
|
-
format_function: Callable =
|
148
|
+
format_function: Callable = to_percentage,
|
131
149
|
to_str_function: Callable = percentage_to_str,
|
132
150
|
decimals: int = 2,
|
133
151
|
**kwargs,
|
@@ -115,8 +115,7 @@ from .vars import (
|
|
115
115
|
|
116
116
|
class MainTable(tk.Canvas):
|
117
117
|
def __init__(self, *args, **kwargs):
|
118
|
-
|
119
|
-
self,
|
118
|
+
super().__init__(
|
120
119
|
kwargs["parent"],
|
121
120
|
background=kwargs["parent"].ops.table_bg,
|
122
121
|
highlightthickness=0,
|
@@ -671,8 +670,6 @@ class MainTable(tk.Canvas):
|
|
671
670
|
event_data,
|
672
671
|
)
|
673
672
|
writer.writerow(row)
|
674
|
-
if event_data["cells"]["table"]:
|
675
|
-
self.undo_stack.append(pickled_event_dict(event_data))
|
676
673
|
self.clipboard_clear()
|
677
674
|
if len(event_data["cells"]["table"]) == 1 and self.PAR.ops.to_clipboard_lineterminator not in next(
|
678
675
|
iter(event_data["cells"]["table"].values())
|
@@ -685,9 +682,10 @@ class MainTable(tk.Canvas):
|
|
685
682
|
for r1, c1, r2, c2 in boxes:
|
686
683
|
self.show_ctrl_outline(canvas="table", start_cell=(c1, r1), end_cell=(c2, r2))
|
687
684
|
if event_data["cells"]["table"]:
|
685
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
688
686
|
try_binding(self.extra_end_ctrl_x_func, event_data, "end_ctrl_x")
|
689
|
-
|
690
|
-
|
687
|
+
self.sheet_modified(event_data)
|
688
|
+
self.PAR.emit_event("<<Cut>>", event_data)
|
691
689
|
return event_data
|
692
690
|
|
693
691
|
def ctrl_v(self, event: object = None, validation: bool = True) -> None | EventDataDict:
|
@@ -937,8 +935,6 @@ class MainTable(tk.Canvas):
|
|
937
935
|
)
|
938
936
|
event_data["selection_boxes"] = self.get_boxes()
|
939
937
|
event_data["selected"] = self.selected
|
940
|
-
if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
|
941
|
-
self.undo_stack.append(pickled_event_dict(event_data))
|
942
938
|
self.see(
|
943
939
|
r=selected_r,
|
944
940
|
c=selected_c,
|
@@ -950,9 +946,10 @@ class MainTable(tk.Canvas):
|
|
950
946
|
)
|
951
947
|
self.refresh()
|
952
948
|
if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
|
949
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
953
950
|
try_binding(self.extra_end_ctrl_v_func, event_data, "end_ctrl_v")
|
954
|
-
|
955
|
-
|
951
|
+
self.sheet_modified(event_data)
|
952
|
+
self.PAR.emit_event("<<Paste>>", event_data)
|
956
953
|
return event_data
|
957
954
|
|
958
955
|
def delete_key(self, event: object = None, validation: bool = True) -> None | EventDataDict:
|
@@ -988,11 +985,11 @@ class MainTable(tk.Canvas):
|
|
988
985
|
event_data,
|
989
986
|
)
|
990
987
|
if event_data["cells"]["table"]:
|
988
|
+
self.refresh()
|
991
989
|
self.undo_stack.append(pickled_event_dict(event_data))
|
992
990
|
try_binding(self.extra_end_delete_key_func, event_data, "end_delete")
|
993
|
-
|
994
|
-
|
995
|
-
self.PAR.emit_event("<<Delete>>", event_data)
|
991
|
+
self.sheet_modified(event_data)
|
992
|
+
self.PAR.emit_event("<<Delete>>", event_data)
|
996
993
|
return event_data
|
997
994
|
|
998
995
|
def event_data_set_cell(self, datarn: int, datacn: int, value: object, event_data: dict) -> EventDataDict:
|
@@ -289,8 +289,7 @@ class Sheet(tk.Frame):
|
|
289
289
|
row_index_width: int | None = None,
|
290
290
|
expand_sheet_if_paste_too_big: bool | None = None,
|
291
291
|
) -> None:
|
292
|
-
|
293
|
-
self,
|
292
|
+
super().__init__(
|
294
293
|
parent,
|
295
294
|
background=frame_bg,
|
296
295
|
highlightthickness=outline_thickness,
|
@@ -22,8 +22,7 @@ class TextEditorTkText(tk.Text):
|
|
22
22
|
parent: tk.Misc,
|
23
23
|
newline_binding: None | Callable = None,
|
24
24
|
) -> None:
|
25
|
-
|
26
|
-
self,
|
25
|
+
super().__init__(
|
27
26
|
parent,
|
28
27
|
spacing1=0,
|
29
28
|
spacing2=1,
|
@@ -170,8 +169,7 @@ class TextEditor(tk.Frame):
|
|
170
169
|
parent: tk.Misc,
|
171
170
|
newline_binding: None | Callable = None,
|
172
171
|
) -> None:
|
173
|
-
|
174
|
-
self,
|
172
|
+
super().__init__(
|
175
173
|
parent,
|
176
174
|
width=0,
|
177
175
|
height=0,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|