tksheet 7.4.23__py3-none-any.whl → 7.5.0__py3-none-any.whl
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/__init__.py +13 -1
- tksheet/column_headers.py +5 -0
- tksheet/constants.py +180 -0
- tksheet/find_window.py +25 -2
- tksheet/functions.py +9 -1
- tksheet/main_table.py +311 -120
- tksheet/row_index.py +5 -0
- tksheet/sheet.py +29 -30
- tksheet/sheet_options.py +123 -20
- tksheet/text_editor.py +26 -2
- tksheet/themes.py +4 -4
- {tksheet-7.4.23.dist-info → tksheet-7.5.0.dist-info}/METADATA +23 -1
- tksheet-7.5.0.dist-info/RECORD +22 -0
- {tksheet-7.4.23.dist-info → tksheet-7.5.0.dist-info}/WHEEL +1 -1
- tksheet-7.5.0.dist-info/licenses/LICENSE.txt +41 -0
- tksheet-7.4.23.dist-info/RECORD +0 -22
- tksheet-7.4.23.dist-info/licenses/LICENSE.txt +0 -19
- {tksheet-7.4.23.dist-info → tksheet-7.5.0.dist-info}/top_level.txt +0 -0
tksheet/row_index.py
CHANGED
@@ -160,6 +160,9 @@ class RowIndex(tk.Canvas):
|
|
160
160
|
self.MT.recreate_all_selection_boxes()
|
161
161
|
self.current_width = new_width
|
162
162
|
|
163
|
+
def is_readonly(self, datarn: int) -> bool:
|
164
|
+
return datarn in self.cell_options and "readonly" in self.cell_options[datarn]
|
165
|
+
|
163
166
|
def rc(self, event: Any) -> None:
|
164
167
|
self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
|
165
168
|
self.focus_set()
|
@@ -185,6 +188,8 @@ class RowIndex(tk.Canvas):
|
|
185
188
|
try_binding(self.extra_rc_func, event)
|
186
189
|
if popup_menu is not None:
|
187
190
|
self.popup_menu_loc = r
|
191
|
+
self.MT.popup_menu_disable_edit_if_readonly(popup_menu)
|
192
|
+
self.MT.popup_menu_disable_undo_redo(popup_menu)
|
188
193
|
popup_menu.tk_popup(event.x_root, event.y_root)
|
189
194
|
|
190
195
|
def ctrl_b1_press(self, event: Any) -> None:
|
tksheet/sheet.py
CHANGED
@@ -329,7 +329,7 @@ class Sheet(tk.Frame):
|
|
329
329
|
index_align = "w"
|
330
330
|
auto_resize_row_index = True
|
331
331
|
paste_can_expand_y = False
|
332
|
-
for k, v in locals().items():
|
332
|
+
for k, v in chain(locals().items(), kwargs.items()):
|
333
333
|
if (xk := backwards_compatibility_keys.get(k, k)) in self.ops and v != self.ops[xk]:
|
334
334
|
self.ops[xk] = v
|
335
335
|
self.ops.from_clipboard_delimiters = (
|
@@ -784,15 +784,19 @@ class Sheet(tk.Frame):
|
|
784
784
|
index_menu: bool = True,
|
785
785
|
header_menu: bool = True,
|
786
786
|
empty_space_menu: bool = True,
|
787
|
+
image: tk.PhotoImage | Literal[""] = "",
|
788
|
+
compound: Literal["top", "bottom", "left", "right", "none"] | None = None,
|
789
|
+
accelerator: str | None = None,
|
787
790
|
) -> Sheet:
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
791
|
+
dct = {"command": func, "image": image, "accelerator": accelerator, "compound": compound}
|
792
|
+
if table_menu:
|
793
|
+
self.MT.extra_table_rc_menu_funcs[label] = dct
|
794
|
+
if index_menu:
|
795
|
+
self.MT.extra_index_rc_menu_funcs[label] = dct
|
796
|
+
if header_menu:
|
797
|
+
self.MT.extra_header_rc_menu_funcs[label] = dct
|
798
|
+
if empty_space_menu:
|
799
|
+
self.MT.extra_empty_space_rc_menu_funcs[label] = dct
|
796
800
|
self.MT.create_rc_menus()
|
797
801
|
return self
|
798
802
|
|
@@ -1565,8 +1569,9 @@ class Sheet(tk.Frame):
|
|
1565
1569
|
):
|
1566
1570
|
if undo is True or (undo is None and span.undo):
|
1567
1571
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1568
|
-
|
1569
|
-
|
1572
|
+
self.MT.sheet_modified(
|
1573
|
+
event_data, emit_event=emit_event is True or (emit_event is None and span.emit_event)
|
1574
|
+
)
|
1570
1575
|
self.set_refresh_timer(redraw)
|
1571
1576
|
return event_data
|
1572
1577
|
|
@@ -1605,8 +1610,9 @@ class Sheet(tk.Frame):
|
|
1605
1610
|
if event_data["cells"]["table"] or event_data["cells"]["header"] or event_data["cells"]["index"]:
|
1606
1611
|
if undo is True or (undo is None and span.undo):
|
1607
1612
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1608
|
-
|
1609
|
-
|
1613
|
+
self.MT.sheet_modified(
|
1614
|
+
event_data, emit_event=emit_event is True or (emit_event is None and span.emit_event)
|
1615
|
+
)
|
1610
1616
|
self.set_refresh_timer(redraw)
|
1611
1617
|
return event_data
|
1612
1618
|
|
@@ -1743,8 +1749,7 @@ class Sheet(tk.Frame):
|
|
1743
1749
|
)
|
1744
1750
|
if undo:
|
1745
1751
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1746
|
-
|
1747
|
-
self.emit_event("<<SheetModified>>", event_data)
|
1752
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
1748
1753
|
self.set_refresh_timer(redraw)
|
1749
1754
|
return event_data
|
1750
1755
|
|
@@ -1797,8 +1802,7 @@ class Sheet(tk.Frame):
|
|
1797
1802
|
)
|
1798
1803
|
if undo:
|
1799
1804
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1800
|
-
|
1801
|
-
self.emit_event("<<SheetModified>>", event_data)
|
1805
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
1802
1806
|
self.set_refresh_timer(redraw)
|
1803
1807
|
return event_data
|
1804
1808
|
|
@@ -1939,8 +1943,7 @@ class Sheet(tk.Frame):
|
|
1939
1943
|
)
|
1940
1944
|
if undo:
|
1941
1945
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1942
|
-
|
1943
|
-
self.emit_event("<<SheetModified>>", event_data)
|
1946
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
1944
1947
|
self.set_refresh_timer(redraw)
|
1945
1948
|
return data_idxs, disp_idxs, event_data
|
1946
1949
|
|
@@ -1974,8 +1977,7 @@ class Sheet(tk.Frame):
|
|
1974
1977
|
)
|
1975
1978
|
if undo:
|
1976
1979
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1977
|
-
|
1978
|
-
self.emit_event("<<SheetModified>>", event_data)
|
1980
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
1979
1981
|
self.set_refresh_timer(redraw)
|
1980
1982
|
return data_idxs, disp_idxs, event_data
|
1981
1983
|
|
@@ -1999,8 +2001,7 @@ class Sheet(tk.Frame):
|
|
1999
2001
|
)
|
2000
2002
|
if undo:
|
2001
2003
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2002
|
-
|
2003
|
-
self.emit_event("<<SheetModified>>", event_data)
|
2004
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
2004
2005
|
self.set_refresh_timer(redraw)
|
2005
2006
|
return data_idxs, disp_idxs, event_data
|
2006
2007
|
|
@@ -2026,8 +2027,7 @@ class Sheet(tk.Frame):
|
|
2026
2027
|
)
|
2027
2028
|
if undo:
|
2028
2029
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2029
|
-
|
2030
|
-
self.emit_event("<<SheetModified>>", event_data)
|
2030
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
2031
2031
|
self.set_refresh_timer(redraw)
|
2032
2032
|
return data_idxs, disp_idxs, event_data
|
2033
2033
|
|
@@ -2242,7 +2242,6 @@ class Sheet(tk.Frame):
|
|
2242
2242
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2243
2243
|
try_binding(self.MT.extra_end_replace_all_func, event_data)
|
2244
2244
|
self.MT.sheet_modified(event_data)
|
2245
|
-
self.emit_event("<<SheetModified>>", event_data)
|
2246
2245
|
return event_data
|
2247
2246
|
|
2248
2247
|
# Highlighting Cells
|
@@ -4142,6 +4141,8 @@ class Sheet(tk.Frame):
|
|
4142
4141
|
self.ops.paste_can_expand_y = kwargs["expand_sheet_if_paste_too_big"]
|
4143
4142
|
if "show_top_left" in kwargs:
|
4144
4143
|
self.show("top_left")
|
4144
|
+
if "popup_menu_font" in kwargs:
|
4145
|
+
self.ops.popup_menu_font = FontTuple(*self.ops.popup_menu_font)
|
4145
4146
|
if "font" in kwargs:
|
4146
4147
|
self.MT.set_table_font(kwargs["font"])
|
4147
4148
|
elif "table_font" in kwargs:
|
@@ -4872,8 +4873,7 @@ class Sheet(tk.Frame):
|
|
4872
4873
|
if event_data:
|
4873
4874
|
if undo and self.MT.undo_enabled:
|
4874
4875
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
4875
|
-
|
4876
|
-
self.emit_event("<<SheetModified>>", event_data)
|
4876
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
4877
4877
|
|
4878
4878
|
self.set_refresh_timer(redraw=not get_only and redraw)
|
4879
4879
|
if get_only:
|
@@ -4973,8 +4973,7 @@ class Sheet(tk.Frame):
|
|
4973
4973
|
)
|
4974
4974
|
if undo:
|
4975
4975
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
4976
|
-
|
4977
|
-
self.emit_event("<<SheetModified>>", event_data)
|
4976
|
+
self.MT.sheet_modified(event_data, emit_event=emit_event)
|
4978
4977
|
self.set_refresh_timer()
|
4979
4978
|
return data_new_idxs, disp_new_idxs, event_data
|
4980
4979
|
|
tksheet/sheet_options.py
CHANGED
@@ -1,6 +1,23 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
|
3
|
+
import tkinter as tk
|
4
|
+
|
5
|
+
from .constants import ( # noqa: F401
|
6
|
+
ICON_ADD,
|
7
|
+
ICON_CLEAR,
|
8
|
+
ICON_COPY,
|
9
|
+
ICON_CUT,
|
10
|
+
ICON_DEL,
|
11
|
+
ICON_EDIT,
|
12
|
+
ICON_PASTE,
|
13
|
+
ICON_REDO,
|
14
|
+
ICON_SELECT_ALL,
|
15
|
+
ICON_SORT_ASC,
|
16
|
+
ICON_SORT_DESC,
|
17
|
+
ICON_UNDO,
|
18
|
+
USER_OS,
|
19
|
+
ctrl_key,
|
20
|
+
)
|
4
21
|
from .other_classes import DotDict, FontTuple
|
5
22
|
from .sorting import fast_sort_key, natural_sort_key, version_sort_key # noqa: F401
|
6
23
|
from .themes import theme_light_blue
|
@@ -30,62 +47,111 @@ def new_sheet_options() -> DotDict:
|
|
30
47
|
13 if USER_OS == "darwin" else 11,
|
31
48
|
"normal",
|
32
49
|
),
|
33
|
-
#
|
50
|
+
# edit header
|
34
51
|
"edit_header_label": "Edit header",
|
35
52
|
"edit_header_accelerator": "",
|
53
|
+
"edit_header_image": tk.PhotoImage(data=ICON_EDIT),
|
54
|
+
"edit_header_compound": "left",
|
55
|
+
# edit index
|
36
56
|
"edit_index_label": "Edit index",
|
37
57
|
"edit_index_accelerator": "",
|
58
|
+
"edit_index_image": tk.PhotoImage(data=ICON_EDIT),
|
59
|
+
"edit_index_compound": "left",
|
60
|
+
# edit cell
|
38
61
|
"edit_cell_label": "Edit cell",
|
39
62
|
"edit_cell_accelerator": "",
|
40
|
-
|
63
|
+
"edit_cell_image": tk.PhotoImage(data=ICON_EDIT),
|
64
|
+
"edit_cell_compound": "left",
|
65
|
+
# cut
|
41
66
|
"cut_label": "Cut",
|
42
67
|
"cut_accelerator": "Ctrl+X",
|
68
|
+
"cut_image": tk.PhotoImage(data=ICON_CUT),
|
69
|
+
"cut_compound": "left",
|
70
|
+
# cut contents
|
43
71
|
"cut_contents_label": "Cut contents",
|
44
72
|
"cut_contents_accelerator": "Ctrl+X",
|
73
|
+
"cut_contents_image": tk.PhotoImage(data=ICON_CUT),
|
74
|
+
"cut_contents_compound": "left",
|
75
|
+
# copy
|
45
76
|
"copy_label": "Copy",
|
46
77
|
"copy_accelerator": "Ctrl+C",
|
78
|
+
"copy_image": tk.PhotoImage(data=ICON_COPY),
|
79
|
+
"copy_compound": "left",
|
80
|
+
# copy contents
|
47
81
|
"copy_contents_label": "Copy contents",
|
48
82
|
"copy_contents_accelerator": "Ctrl+C",
|
83
|
+
"copy_contents_image": tk.PhotoImage(data=ICON_COPY),
|
84
|
+
"copy_contents_compound": "left",
|
85
|
+
# paste
|
49
86
|
"paste_label": "Paste",
|
50
87
|
"paste_accelerator": "Ctrl+V",
|
51
|
-
|
88
|
+
"paste_image": tk.PhotoImage(data=ICON_PASTE),
|
89
|
+
"paste_compound": "left",
|
90
|
+
# delete
|
52
91
|
"delete_label": "Delete",
|
53
92
|
"delete_accelerator": "Del",
|
93
|
+
"delete_image": tk.PhotoImage(data=ICON_CLEAR),
|
94
|
+
"delete_compound": "left",
|
95
|
+
# clear contents
|
54
96
|
"clear_contents_label": "Clear contents",
|
55
97
|
"clear_contents_accelerator": "Del",
|
56
|
-
|
98
|
+
"clear_contents_image": tk.PhotoImage(data=ICON_CLEAR),
|
99
|
+
"clear_contents_compound": "left",
|
100
|
+
# del columns
|
57
101
|
"delete_columns_label": "Delete columns",
|
58
102
|
"delete_columns_accelerator": "",
|
103
|
+
"delete_columns_image": tk.PhotoImage(data=ICON_DEL),
|
104
|
+
"delete_columns_compound": "left",
|
105
|
+
# insert columns left
|
59
106
|
"insert_columns_left_label": "Insert columns left",
|
60
107
|
"insert_columns_left_accelerator": "",
|
61
|
-
"
|
62
|
-
"
|
108
|
+
"insert_columns_left_image": tk.PhotoImage(data=ICON_ADD),
|
109
|
+
"insert_columns_left_compound": "left",
|
110
|
+
# insert columns right
|
63
111
|
"insert_columns_right_label": "Insert columns right",
|
64
112
|
"insert_columns_right_accelerator": "",
|
65
|
-
|
113
|
+
"insert_columns_right_image": tk.PhotoImage(data=ICON_ADD),
|
114
|
+
"insert_columns_right_compound": "left",
|
115
|
+
# insert single column
|
116
|
+
"insert_column_label": "Insert column",
|
117
|
+
"insert_column_accelerator": "",
|
118
|
+
"insert_column_image": tk.PhotoImage(data=ICON_ADD),
|
119
|
+
"insert_column_compound": "left",
|
120
|
+
# del rows
|
66
121
|
"delete_rows_label": "Delete rows",
|
67
122
|
"delete_rows_accelerator": "",
|
123
|
+
"delete_rows_image": tk.PhotoImage(data=ICON_DEL),
|
124
|
+
"delete_rows_compound": "left",
|
125
|
+
# insert rows above
|
68
126
|
"insert_rows_above_label": "Insert rows above",
|
69
127
|
"insert_rows_above_accelerator": "",
|
128
|
+
"insert_rows_above_image": tk.PhotoImage(data=ICON_ADD),
|
129
|
+
"insert_rows_above_compound": "left",
|
130
|
+
# insert rows below
|
70
131
|
"insert_rows_below_label": "Insert rows below",
|
71
132
|
"insert_rows_below_accelerator": "",
|
133
|
+
"insert_rows_below_image": tk.PhotoImage(data=ICON_ADD),
|
134
|
+
"insert_rows_below_compound": "left",
|
135
|
+
# insert single row
|
72
136
|
"insert_row_label": "Insert row",
|
73
137
|
"insert_row_accelerator": "",
|
138
|
+
"insert_row_image": tk.PhotoImage(data=ICON_ADD),
|
139
|
+
"insert_row_compound": "left",
|
74
140
|
# sorting
|
75
141
|
# labels
|
76
|
-
"sort_cells_label": "Sort
|
77
|
-
"sort_cells_x_label": "Sort
|
78
|
-
"sort_row_label": "Sort values
|
79
|
-
"sort_column_label": "Sort values
|
80
|
-
"sort_rows_label": "Sort rows
|
81
|
-
"sort_columns_label": "Sort columns
|
142
|
+
"sort_cells_label": "Sort Asc.",
|
143
|
+
"sort_cells_x_label": "Sort row-wise Asc.",
|
144
|
+
"sort_row_label": "Sort values Asc.",
|
145
|
+
"sort_column_label": "Sort values Asc.",
|
146
|
+
"sort_rows_label": "Sort rows Asc.",
|
147
|
+
"sort_columns_label": "Sort columns Asc.",
|
82
148
|
# reverse labels
|
83
|
-
"sort_cells_reverse_label": "Sort
|
84
|
-
"sort_cells_x_reverse_label": "Sort
|
85
|
-
"sort_row_reverse_label": "Sort values
|
86
|
-
"sort_column_reverse_label": "Sort values
|
87
|
-
"sort_rows_reverse_label": "Sort rows
|
88
|
-
"sort_columns_reverse_label": "Sort columns
|
149
|
+
"sort_cells_reverse_label": "Sort Desc.",
|
150
|
+
"sort_cells_x_reverse_label": "Sort row-wise Desc.",
|
151
|
+
"sort_row_reverse_label": "Sort values Desc.",
|
152
|
+
"sort_column_reverse_label": "Sort values Desc.",
|
153
|
+
"sort_rows_reverse_label": "Sort rows Desc.",
|
154
|
+
"sort_columns_reverse_label": "Sort columns Desc.",
|
89
155
|
# accelerators
|
90
156
|
"sort_cells_accelerator": "",
|
91
157
|
"sort_cells_x_accelerator": "",
|
@@ -100,12 +166,49 @@ def new_sheet_options() -> DotDict:
|
|
100
166
|
"sort_column_reverse_accelerator": "",
|
101
167
|
"sort_rows_reverse_accelerator": "",
|
102
168
|
"sort_columns_reverse_accelerator": "",
|
169
|
+
# images
|
170
|
+
"sort_cells_image": tk.PhotoImage(data=ICON_SORT_ASC),
|
171
|
+
"sort_cells_x_image": tk.PhotoImage(data=ICON_SORT_ASC),
|
172
|
+
"sort_row_image": tk.PhotoImage(data=ICON_SORT_ASC),
|
173
|
+
"sort_column_image": tk.PhotoImage(data=ICON_SORT_ASC),
|
174
|
+
"sort_rows_image": tk.PhotoImage(data=ICON_SORT_ASC),
|
175
|
+
"sort_columns_image": tk.PhotoImage(data=ICON_SORT_ASC),
|
176
|
+
# compounds
|
177
|
+
"sort_cells_compound": "left",
|
178
|
+
"sort_cells_x_compound": "left",
|
179
|
+
"sort_row_compound": "left",
|
180
|
+
"sort_column_compound": "left",
|
181
|
+
"sort_rows_compound": "left",
|
182
|
+
"sort_columns_compound": "left",
|
183
|
+
# reverse images
|
184
|
+
"sort_cells_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
|
185
|
+
"sort_cells_x_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
|
186
|
+
"sort_row_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
|
187
|
+
"sort_column_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
|
188
|
+
"sort_rows_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
|
189
|
+
"sort_columns_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
|
190
|
+
# reverse compounds
|
191
|
+
"sort_cells_reverse_compound": "left",
|
192
|
+
"sort_cells_x_reverse_compound": "left",
|
193
|
+
"sort_row_reverse_compound": "left",
|
194
|
+
"sort_column_reverse_compound": "left",
|
195
|
+
"sort_rows_reverse_compound": "left",
|
196
|
+
"sort_columns_reverse_compound": "left",
|
103
197
|
# select all
|
104
198
|
"select_all_label": "Select all",
|
105
199
|
"select_all_accelerator": "Ctrl+A",
|
200
|
+
"select_all_image": tk.PhotoImage(data=ICON_SELECT_ALL),
|
201
|
+
"select_all_compound": "left",
|
106
202
|
# undo
|
107
203
|
"undo_label": "Undo",
|
108
204
|
"undo_accelerator": "Ctrl+Z",
|
205
|
+
"undo_image": tk.PhotoImage(data=ICON_UNDO),
|
206
|
+
"undo_compound": "left",
|
207
|
+
# redo
|
208
|
+
"redo_label": "Redo",
|
209
|
+
"redo_accelerator": "Ctrl+Shift+Z",
|
210
|
+
"redo_image": tk.PhotoImage(data=ICON_REDO),
|
211
|
+
"redo_compound": "left",
|
109
212
|
# bindings
|
110
213
|
"copy_bindings": [
|
111
214
|
f"<{ctrl_key}-c>",
|
tksheet/text_editor.py
CHANGED
@@ -65,39 +65,58 @@ class TextEditorTkText(tk.Text):
|
|
65
65
|
self.rc_popup_menu.add_command(
|
66
66
|
label=sheet_ops.select_all_label,
|
67
67
|
accelerator=sheet_ops.select_all_accelerator,
|
68
|
+
image=sheet_ops.select_all_image,
|
69
|
+
compound=sheet_ops.select_all_compound,
|
68
70
|
command=self.select_all,
|
69
71
|
**menu_kwargs,
|
70
72
|
)
|
71
73
|
self.rc_popup_menu.add_command(
|
72
74
|
label=sheet_ops.cut_label,
|
73
75
|
accelerator=sheet_ops.cut_accelerator,
|
76
|
+
image=sheet_ops.cut_image,
|
77
|
+
compound=sheet_ops.cut_compound,
|
74
78
|
command=self.cut,
|
75
79
|
**menu_kwargs,
|
76
80
|
)
|
77
81
|
self.rc_popup_menu.add_command(
|
78
82
|
label=sheet_ops.copy_label,
|
79
83
|
accelerator=sheet_ops.copy_accelerator,
|
84
|
+
image=sheet_ops.copy_image,
|
85
|
+
compound=sheet_ops.copy_compound,
|
80
86
|
command=self.copy,
|
81
87
|
**menu_kwargs,
|
82
88
|
)
|
83
89
|
self.rc_popup_menu.add_command(
|
84
90
|
label=sheet_ops.paste_label,
|
85
91
|
accelerator=sheet_ops.paste_accelerator,
|
92
|
+
image=sheet_ops.paste_image,
|
93
|
+
compound=sheet_ops.paste_compound,
|
86
94
|
command=self.paste,
|
87
95
|
**menu_kwargs,
|
88
96
|
)
|
89
97
|
self.rc_popup_menu.add_command(
|
90
98
|
label=sheet_ops.undo_label,
|
91
99
|
accelerator=sheet_ops.undo_accelerator,
|
100
|
+
image=sheet_ops.undo_image,
|
101
|
+
compound=sheet_ops.undo_compound,
|
92
102
|
command=self.undo,
|
93
103
|
**menu_kwargs,
|
94
104
|
)
|
105
|
+
self.rc_popup_menu.add_command(
|
106
|
+
label=sheet_ops.redo_label,
|
107
|
+
accelerator=sheet_ops.redo_accelerator,
|
108
|
+
image=sheet_ops.redo_image,
|
109
|
+
compound=sheet_ops.redo_compound,
|
110
|
+
command=self.redo,
|
111
|
+
**menu_kwargs,
|
112
|
+
)
|
95
113
|
self.align = align_helper[convert_align(align)]
|
96
114
|
self.delete(1.0, "end")
|
97
115
|
self.insert(1.0, text)
|
98
116
|
self.yview_moveto(1)
|
99
117
|
self.tag_configure("align", justify=self.align)
|
100
118
|
self.tag_add("align", 1.0, "end")
|
119
|
+
self.edit_reset()
|
101
120
|
|
102
121
|
def _proxy(self, command: Any, *args) -> Any:
|
103
122
|
try:
|
@@ -140,8 +159,8 @@ class TextEditorTkText(tk.Text):
|
|
140
159
|
return "break"
|
141
160
|
|
142
161
|
def select_all(self, event: Any = None) -> Literal["break"]:
|
143
|
-
self.tag_add(tk.SEL, "1.0",
|
144
|
-
self.mark_set(tk.INSERT,
|
162
|
+
self.tag_add(tk.SEL, "1.0", "end-1c")
|
163
|
+
self.mark_set(tk.INSERT, "end-1c")
|
145
164
|
# self.see(tk.INSERT)
|
146
165
|
return "break"
|
147
166
|
|
@@ -164,6 +183,11 @@ class TextEditorTkText(tk.Text):
|
|
164
183
|
self.event_generate("<KeyRelease>")
|
165
184
|
return "break"
|
166
185
|
|
186
|
+
def redo(self, event: Any = None) -> Literal["break"]:
|
187
|
+
self.event_generate(f"<{ctrl_key}-Shift-z>")
|
188
|
+
self.event_generate("<KeyRelease>")
|
189
|
+
return "break"
|
190
|
+
|
167
191
|
|
168
192
|
class TextEditor(tk.Frame):
|
169
193
|
def __init__(
|
tksheet/themes.py
CHANGED
@@ -183,8 +183,8 @@ theme_light_green: dict[str, str] = DotDict(
|
|
183
183
|
theme_dark: dict[str, str] = DotDict(
|
184
184
|
{
|
185
185
|
"popup_menu_fg": "white",
|
186
|
-
"popup_menu_bg": "
|
187
|
-
"popup_menu_highlight_bg": "
|
186
|
+
"popup_menu_bg": "gray5",
|
187
|
+
"popup_menu_highlight_bg": "gray20",
|
188
188
|
"popup_menu_highlight_fg": "white",
|
189
189
|
"index_hidden_rows_expander_bg": "gray30",
|
190
190
|
"header_hidden_columns_expander_bg": "gray30",
|
@@ -272,8 +272,8 @@ theme_dark: dict[str, str] = DotDict(
|
|
272
272
|
theme_black: dict[str, str] = DotDict(
|
273
273
|
{
|
274
274
|
"popup_menu_fg": "white",
|
275
|
-
"popup_menu_bg": "
|
276
|
-
"popup_menu_highlight_bg": "
|
275
|
+
"popup_menu_bg": "gray5",
|
276
|
+
"popup_menu_highlight_bg": "gray20",
|
277
277
|
"popup_menu_highlight_fg": "white",
|
278
278
|
"index_hidden_rows_expander_bg": "gray30",
|
279
279
|
"header_hidden_columns_expander_bg": "gray30",
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: tksheet
|
3
|
-
Version: 7.
|
3
|
+
Version: 7.5.0
|
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
|
@@ -23,6 +23,28 @@ License: Copyright (c) 2019 ragardner and open source contributors
|
|
23
23
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
24
24
|
SOFTWARE.
|
25
25
|
|
26
|
+
---
|
27
|
+
|
28
|
+
### Third-Party Assets: Icons from Lucide Icons
|
29
|
+
|
30
|
+
Icons used in tksheet are sourced from Lucide Icons (https://lucide.dev) and are licensed under the ISC License. This license applies only to the icon assets and not to the rest of the tksheet software, which remains under the MIT License above.
|
31
|
+
|
32
|
+
ISC License
|
33
|
+
|
34
|
+
Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
|
35
|
+
|
36
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
37
|
+
purpose with or without fee is hereby granted, provided that the above
|
38
|
+
copyright notice and this permission notice appear in all copies.
|
39
|
+
|
40
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
41
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
42
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
43
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
44
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
45
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
46
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
47
|
+
|
26
48
|
Project-URL: Homepage, https://github.com/ragardner/tksheet
|
27
49
|
Project-URL: Documentation, https://github.com/ragardner/tksheet/wiki/Version-7
|
28
50
|
Project-URL: Changelog, https://github.com/ragardner/tksheet/blob/master/docs/CHANGELOG.md
|
@@ -0,0 +1,22 @@
|
|
1
|
+
tksheet/__init__.py,sha256=4q4kfmD7owShwMa_eV6g1z7fFkQgthXuiKAsdGDd_i4,2532
|
2
|
+
tksheet/colors.py,sha256=dHhmdFuQDlwohDHsAfT9VdrKoSl_R33L72a3HCin5zo,51591
|
3
|
+
tksheet/column_headers.py,sha256=S-5AQ-kmywDMsL061iWyHTVKNmikNBfHxML3zFnUD-o,103609
|
4
|
+
tksheet/constants.py,sha256=tuOYfha46w17N1wOZxWqDGlq-C25gTr1a3JILWUHqCg,25490
|
5
|
+
tksheet/find_window.py,sha256=P27qQsj9BxjALgfVfWV5tyRTDlnws-rCjnmZmoGzq1c,20917
|
6
|
+
tksheet/formatters.py,sha256=DGcRiMsDJnySNpQcjfiX84oJ7TmOSMdU6u9injIhA4g,10095
|
7
|
+
tksheet/functions.py,sha256=8d5T8UgNrJ3XmDFLGWXw19yVZQclLgMkinnTi5aDaLo,53163
|
8
|
+
tksheet/main_table.py,sha256=7jUcy3h2CsKoGmnt-dtYjCyUppnkGipdl8eVa5JuM4U,377951
|
9
|
+
tksheet/other_classes.py,sha256=4VcAxiPH8SxuNbbLSve5ynqfnLwMUGSUs1ZQp0Yc1Gc,18177
|
10
|
+
tksheet/row_index.py,sha256=EHn6FJB6I5EawX0EPpz0lxqeBAPlT4EXCIh1XHB1R1g,141881
|
11
|
+
tksheet/sheet.py,sha256=OOvi7lSi-Zm6xSo9rTgdR2mItEM-p2bjFJXKZ9ECVwM,269918
|
12
|
+
tksheet/sheet_options.py,sha256=bB-XBs1sL2w9a47wSM6GD960ZKbvQuU2VvYIK2JRSjE,14567
|
13
|
+
tksheet/sorting.py,sha256=zcZPpRtP1h_xJGtGkG3E43H7deKQFnh9cMwZ1B2-aGc,17502
|
14
|
+
tksheet/text_editor.py,sha256=bkVRWYE3fCIo5xvwUBkmkBJ6nBGV2X1VsZ4LhQ5146I,8366
|
15
|
+
tksheet/themes.py,sha256=kUUCUmvgu8vUlzfVNk9a3BEbeBcU3asNwPB_u-OejCY,18471
|
16
|
+
tksheet/tksheet_types.py,sha256=1MjXR34EmvP1KfHlLTvKKVnf0VMz_LU_WOM2q4o5hfI,4598
|
17
|
+
tksheet/top_left_rectangle.py,sha256=A4wWL8PFl57Pn2Ek71rASCE1-bW844cTl7bgt4tLWzI,8499
|
18
|
+
tksheet-7.5.0.dist-info/licenses/LICENSE.txt,sha256=n1UvJHBr-AYNOf6ExICDsEggh9R7U4V4m_gH7FD-y-o,2305
|
19
|
+
tksheet-7.5.0.dist-info/METADATA,sha256=0v3K5izYFSvikrOGjzMPPuNyw4bGvtrsp4wk1-FgTYU,9474
|
20
|
+
tksheet-7.5.0.dist-info/WHEEL,sha256=GHB6lJx2juba1wDgXDNlMTyM13ckjBMKf-OnwgKOCtA,91
|
21
|
+
tksheet-7.5.0.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
22
|
+
tksheet-7.5.0.dist-info/RECORD,,
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Copyright (c) 2019 ragardner and open source contributors
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
SOFTWARE.
|
20
|
+
|
21
|
+
---
|
22
|
+
|
23
|
+
### Third-Party Assets: Icons from Lucide Icons
|
24
|
+
|
25
|
+
Icons used in tksheet are sourced from Lucide Icons (https://lucide.dev) and are licensed under the ISC License. This license applies only to the icon assets and not to the rest of the tksheet software, which remains under the MIT License above.
|
26
|
+
|
27
|
+
ISC License
|
28
|
+
|
29
|
+
Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
|
30
|
+
|
31
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
32
|
+
purpose with or without fee is hereby granted, provided that the above
|
33
|
+
copyright notice and this permission notice appear in all copies.
|
34
|
+
|
35
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
36
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
37
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
38
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
39
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
40
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
41
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
tksheet-7.4.23.dist-info/RECORD
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
tksheet/__init__.py,sha256=EnHhyTDrgSe8qTi28EYl56aynnSF8TxhBAq2xjoPcSI,2327
|
2
|
-
tksheet/colors.py,sha256=dHhmdFuQDlwohDHsAfT9VdrKoSl_R33L72a3HCin5zo,51591
|
3
|
-
tksheet/column_headers.py,sha256=cP0RImb-EgHdVLSfNmU42k5GwCol7akKgMH6xq1sZfY,103339
|
4
|
-
tksheet/constants.py,sha256=aiDvUSaPtl_TSNtRRJ_p87c9iTBz9ksMd5IsSXzz4Hk,13316
|
5
|
-
tksheet/find_window.py,sha256=w6S0FZFLRNHiM57Oq97avALT_PctIBPegSxnkNUwkwk,19982
|
6
|
-
tksheet/formatters.py,sha256=DGcRiMsDJnySNpQcjfiX84oJ7TmOSMdU6u9injIhA4g,10095
|
7
|
-
tksheet/functions.py,sha256=gwf9X9ENHmoikjbXtoj-00uUVQGRJVffkeJHoR7yB2E,52993
|
8
|
-
tksheet/main_table.py,sha256=YwgqTWithMHXoUpYsBGPrp3g5vtGqjSnwiLdq3qPKo4,367715
|
9
|
-
tksheet/other_classes.py,sha256=4VcAxiPH8SxuNbbLSve5ynqfnLwMUGSUs1ZQp0Yc1Gc,18177
|
10
|
-
tksheet/row_index.py,sha256=8zuNU00ATmz5oumEqSyB_nOUAIuCS23mUfTpq3R1WOM,141611
|
11
|
-
tksheet/sheet.py,sha256=xj2xIaoZQHPlG95hOduNT5NsVpZ0Mb87xJB935caOzA,269918
|
12
|
-
tksheet/sheet_options.py,sha256=ob-XYgGfBoi2TaFAvUUmlWUkw9xB-yXmJw17gu9__Lw,9948
|
13
|
-
tksheet/sorting.py,sha256=zcZPpRtP1h_xJGtGkG3E43H7deKQFnh9cMwZ1B2-aGc,17502
|
14
|
-
tksheet/text_editor.py,sha256=rU8Fz0-ltkM63W9io2DoZJPyzUGzCc9Z0qBtc4D1H40,7404
|
15
|
-
tksheet/themes.py,sha256=AoNAxibnQi04MN0Zpbn9-kyDnkiiV8TDNWP9FYjpuf0,18473
|
16
|
-
tksheet/tksheet_types.py,sha256=1MjXR34EmvP1KfHlLTvKKVnf0VMz_LU_WOM2q4o5hfI,4598
|
17
|
-
tksheet/top_left_rectangle.py,sha256=A4wWL8PFl57Pn2Ek71rASCE1-bW844cTl7bgt4tLWzI,8499
|
18
|
-
tksheet-7.4.23.dist-info/licenses/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
|
19
|
-
tksheet-7.4.23.dist-info/METADATA,sha256=4DhkRE9dHocL93gc5iWbfZOub24S2u0DdZkZwULoOO8,8117
|
20
|
-
tksheet-7.4.23.dist-info/WHEEL,sha256=ooBFpIzZCPdw3uqIQsOo4qqbA4ZRPxHnOH7peeONza0,91
|
21
|
-
tksheet-7.4.23.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
22
|
-
tksheet-7.4.23.dist-info/RECORD,,
|
@@ -1,19 +0,0 @@
|
|
1
|
-
Copyright (c) 2019 ragardner and open source contributors
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
-
of this software and associated documentation files (the "Software"), to deal
|
5
|
-
in the Software without restriction, including without limitation the rights
|
6
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
-
copies of the Software, and to permit persons to whom the Software is
|
8
|
-
furnished to do so, subject to the following conditions:
|
9
|
-
|
10
|
-
The above copyright notice and this permission notice shall be included in all
|
11
|
-
copies or substantial portions of the Software.
|
12
|
-
|
13
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
-
SOFTWARE.
|
File without changes
|