tksheet 7.1.12__tar.gz → 7.1.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.1.12/tksheet.egg-info → tksheet-7.1.20}/PKG-INFO +2 -2
- {tksheet-7.1.12 → tksheet-7.1.20}/README.md +1 -1
- {tksheet-7.1.12 → tksheet-7.1.20}/pyproject.toml +1 -1
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/__init__.py +2 -1
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/column_headers.py +9 -3
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/functions.py +28 -8
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/main_table.py +122 -90
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/row_index.py +3 -3
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/sheet.py +38 -34
- {tksheet-7.1.12 → tksheet-7.1.20/tksheet.egg-info}/PKG-INFO +2 -2
- {tksheet-7.1.12 → tksheet-7.1.20}/LICENSE.txt +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/setup.cfg +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/colors.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/formatters.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/other_classes.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/sheet_options.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/text_editor.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/themes.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/top_left_rectangle.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/types.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet/vars.py +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet.egg-info/dependency_links.txt +0 -0
- {tksheet-7.1.12 → tksheet-7.1.20}/tksheet.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: tksheet
|
3
|
-
Version: 7.1.
|
3
|
+
Version: 7.1.20
|
4
4
|
Summary: Tkinter table / sheet widget
|
5
5
|
Author-email: ragardner <github@ragardner.simplelogin.com>
|
6
6
|
License: Copyright (c) 2019 ragardner and open source contributors
|
@@ -42,7 +42,7 @@ License-File: LICENSE.txt
|
|
42
42
|
|
43
43
|
# tksheet
|
44
44
|
|
45
|
-
[](https://pypi.python.org/pypi/tksheet/) ](https://pypi.python.org/pypi/tksheet/)  [](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
|
46
46
|
|
47
47
|
[](https://github.com/ragardner/tksheet/releases) [](https://pypi.org/project/tksheet/)
|
48
48
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# tksheet
|
2
2
|
|
3
|
-
[](https://pypi.python.org/pypi/tksheet/) ](https://pypi.python.org/pypi/tksheet/)  [](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
|
4
4
|
|
5
5
|
[](https://github.com/ragardner/tksheet/releases) [](https://pypi.org/project/tksheet/)
|
6
6
|
|
@@ -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.1.
|
9
|
+
version = "7.1.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.1.
|
7
|
+
__version__ = "7.1.20"
|
8
8
|
|
9
9
|
from .colors import (
|
10
10
|
color_map,
|
@@ -42,6 +42,7 @@ from .functions import (
|
|
42
42
|
event_dict,
|
43
43
|
get_checkbox_dict,
|
44
44
|
get_checkbox_kwargs,
|
45
|
+
get_data_from_clipboard,
|
45
46
|
get_dropdown_dict,
|
46
47
|
get_dropdown_kwargs,
|
47
48
|
get_index_of_gap_in_sorted_integer_seq_forward,
|
@@ -22,10 +22,10 @@ from .colors import (
|
|
22
22
|
from .formatters import is_bool_like, try_to_bool
|
23
23
|
from .functions import (
|
24
24
|
consecutive_ranges,
|
25
|
-
ev_stack_dict,
|
26
25
|
event_dict,
|
27
26
|
get_n2a,
|
28
27
|
is_contiguous,
|
28
|
+
pickled_event_dict,
|
29
29
|
rounded_box_coords,
|
30
30
|
try_binding,
|
31
31
|
)
|
@@ -133,6 +133,9 @@ class ColumnHeaders(tk.Canvas):
|
|
133
133
|
self.bind("<Double-Button-1>", self.double_b1)
|
134
134
|
self.bind(rc_binding, self.rc)
|
135
135
|
self.bind("<MouseWheel>", self.mousewheel)
|
136
|
+
if USER_OS == "linux":
|
137
|
+
self.bind("<Button-4>", self.mousewheel)
|
138
|
+
self.bind("<Button-5>", self.mousewheel)
|
136
139
|
else:
|
137
140
|
self.unbind("<Motion>")
|
138
141
|
self.unbind("<ButtonPress-1>")
|
@@ -141,6 +144,9 @@ class ColumnHeaders(tk.Canvas):
|
|
141
144
|
self.unbind("<Double-Button-1>")
|
142
145
|
self.unbind(rc_binding)
|
143
146
|
self.unbind("<MouseWheel>")
|
147
|
+
if USER_OS == "linux":
|
148
|
+
self.unbind("<Button-4>")
|
149
|
+
self.unbind("<Button-5>")
|
144
150
|
|
145
151
|
def mousewheel(self, event: object):
|
146
152
|
maxlines = 0
|
@@ -845,7 +851,7 @@ class ColumnHeaders(tk.Canvas):
|
|
845
851
|
"displayed": disp_new_idxs,
|
846
852
|
}
|
847
853
|
if self.MT.undo_enabled:
|
848
|
-
self.MT.undo_stack.append(
|
854
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
849
855
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
850
856
|
try_binding(self.ch_extra_end_drag_drop_func, event_data, "end_move_columns")
|
851
857
|
self.MT.sheet_modified(event_data)
|
@@ -2091,7 +2097,7 @@ class ColumnHeaders(tk.Canvas):
|
|
2091
2097
|
self.fix_header(datacn)
|
2092
2098
|
if not check_input_valid or self.input_valid_for_cell(datacn, value):
|
2093
2099
|
if self.MT.undo_enabled and undo:
|
2094
|
-
self.MT.undo_stack.append(
|
2100
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2095
2101
|
self.set_cell_data(datacn=datacn, value=value)
|
2096
2102
|
edited = True
|
2097
2103
|
if edited and cell_resize and self.PAR.ops.cell_auto_resize_enabled:
|
@@ -1,8 +1,11 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
3
|
import bisect
|
4
|
+
import csv
|
5
|
+
import io
|
4
6
|
import pickle
|
5
7
|
import re
|
8
|
+
import tkinter as tk
|
6
9
|
import zlib
|
7
10
|
from collections import deque
|
8
11
|
from collections.abc import (
|
@@ -19,6 +22,7 @@ from .other_classes import (
|
|
19
22
|
DotDict,
|
20
23
|
EventDataDict,
|
21
24
|
Highlight,
|
25
|
+
Loc,
|
22
26
|
Span,
|
23
27
|
)
|
24
28
|
|
@@ -27,6 +31,21 @@ pickle_obj = partial(pickle.dumps, protocol=pickle.HIGHEST_PROTOCOL)
|
|
27
31
|
unpickle_obj = pickle.loads
|
28
32
|
|
29
33
|
|
34
|
+
def get_data_from_clipboard(
|
35
|
+
widget: tk.Misc,
|
36
|
+
delimiters: str,
|
37
|
+
lineterminator: str = "\n",
|
38
|
+
) -> list[list[str]]:
|
39
|
+
data = widget.clipboard_get()
|
40
|
+
try:
|
41
|
+
dialect = csv.Sniffer().sniff(data, delimiters=delimiters)
|
42
|
+
except Exception:
|
43
|
+
dialect = csv.excel_tab
|
44
|
+
if dialect.delimiter in data or lineterminator in data:
|
45
|
+
return list(csv.reader(io.StringIO(data), dialect=dialect, skipinitialspace=True))
|
46
|
+
return [[data]]
|
47
|
+
|
48
|
+
|
30
49
|
def pickle_compress(obj: object) -> bytes:
|
31
50
|
return compress(pickle_obj(obj))
|
32
51
|
|
@@ -164,11 +183,8 @@ def change_eventname(event_dict: EventDataDict, newname: str) -> EventDataDict:
|
|
164
183
|
return EventDataDict({**event_dict, **{"eventname": newname}})
|
165
184
|
|
166
185
|
|
167
|
-
def
|
168
|
-
return DotDict(
|
169
|
-
name=d["eventname"],
|
170
|
-
data=pickle_compress(d),
|
171
|
-
)
|
186
|
+
def pickled_event_dict(d: DotDict) -> DotDict:
|
187
|
+
return DotDict(name=d["eventname"], data=pickle_compress(d))
|
172
188
|
|
173
189
|
|
174
190
|
def len_to_idx(n: int) -> int:
|
@@ -406,11 +422,13 @@ def index_exists(seq: Sequence[object], index: int) -> bool:
|
|
406
422
|
def move_elements_by_mapping(
|
407
423
|
seq: list[object],
|
408
424
|
new_idxs: dict[int, int],
|
409
|
-
old_idxs: dict[int, int],
|
425
|
+
old_idxs: dict[int, int] | None = None,
|
410
426
|
) -> list[object]:
|
411
427
|
# move elements of a list around, displacing
|
412
428
|
# other elements based on mapping
|
413
429
|
# of {old index: new index, ...}
|
430
|
+
if old_idxs is None:
|
431
|
+
old_idxs = dict(zip(new_idxs.values(), new_idxs))
|
414
432
|
|
415
433
|
# create dummy list
|
416
434
|
res = [0] * len(seq)
|
@@ -1293,10 +1311,12 @@ def mod_span_widget(span: Span, widget: object) -> Span:
|
|
1293
1311
|
def mod_event_val(
|
1294
1312
|
event_data: EventDataDict,
|
1295
1313
|
val: object,
|
1296
|
-
loc:
|
1314
|
+
loc: Loc | int,
|
1297
1315
|
) -> EventDataDict:
|
1298
1316
|
event_data.value = val
|
1299
|
-
event_data.loc = loc
|
1317
|
+
event_data.loc = Loc(*loc)
|
1318
|
+
event_data.row = loc[0]
|
1319
|
+
event_data.column = loc[1]
|
1300
1320
|
return event_data
|
1301
1321
|
|
1302
1322
|
|
@@ -52,9 +52,9 @@ from .functions import (
|
|
52
52
|
decompress_load,
|
53
53
|
diff_gen,
|
54
54
|
diff_list,
|
55
|
-
ev_stack_dict,
|
56
55
|
event_dict,
|
57
56
|
gen_formatted,
|
57
|
+
get_data_from_clipboard,
|
58
58
|
get_new_indexes,
|
59
59
|
get_seq_without_gaps_at_index,
|
60
60
|
index_exists,
|
@@ -68,6 +68,7 @@ from .functions import (
|
|
68
68
|
mod_span_widget,
|
69
69
|
move_elements_by_mapping,
|
70
70
|
pickle_obj,
|
71
|
+
pickled_event_dict,
|
71
72
|
rounded_box_coords,
|
72
73
|
span_idxs_post_move,
|
73
74
|
try_binding,
|
@@ -363,10 +364,10 @@ class MainTable(tk.Canvas):
|
|
363
364
|
("<ButtonRelease-1>", self, self.b1_release),
|
364
365
|
("<Double-Button-1>", self, self.double_b1),
|
365
366
|
("<MouseWheel>", self, self.mousewheel),
|
367
|
+
("<MouseWheel>", self.RI, self.mousewheel),
|
366
368
|
("<Shift-ButtonPress-1>", self, self.shift_b1_press),
|
367
369
|
("<Shift-ButtonPress-1>", self.CH, self.CH.shift_b1_press),
|
368
370
|
("<Shift-ButtonPress-1>", self.RI, self.RI.shift_b1_press),
|
369
|
-
("<MouseWheel>", self.RI, self.mousewheel),
|
370
371
|
(rc_binding, self, self.rc),
|
371
372
|
(f"<{ctrl_key}-ButtonPress-1>", self, self.ctrl_b1_press),
|
372
373
|
(f"<{ctrl_key}-ButtonPress-1>", self.CH, self.CH.ctrl_b1_press),
|
@@ -385,9 +386,11 @@ class MainTable(tk.Canvas):
|
|
385
386
|
("<Control-equal>", self.zoom_in),
|
386
387
|
("<Control-minus>", self.zoom_out),
|
387
388
|
)
|
388
|
-
|
389
|
+
mt_ri_canvas_linux_bindings = {
|
389
390
|
("<Button-4>", self.mousewheel),
|
390
391
|
("<Button-5>", self.mousewheel),
|
392
|
+
}
|
393
|
+
all_canvas_linux_bindings = {
|
391
394
|
("<Shift-Button-4>", self.shift_mousewheel),
|
392
395
|
("<Shift-Button-5>", self.shift_mousewheel),
|
393
396
|
("<Control-Button-4>", self.ctrl_mousewheel),
|
@@ -400,6 +403,9 @@ class MainTable(tk.Canvas):
|
|
400
403
|
for canvas in (self, self.RI, self.CH):
|
401
404
|
canvas.bind(b[0], b[1])
|
402
405
|
if USER_OS == "linux":
|
406
|
+
for b in mt_ri_canvas_linux_bindings:
|
407
|
+
for canvas in (self, self.RI):
|
408
|
+
canvas.bind(b[0], b[1])
|
403
409
|
for b in all_canvas_linux_bindings:
|
404
410
|
for canvas in (self, self.RI, self.CH):
|
405
411
|
canvas.bind(b[0], b[1])
|
@@ -410,6 +416,9 @@ class MainTable(tk.Canvas):
|
|
410
416
|
for canvas in (self, self.RI, self.CH):
|
411
417
|
canvas.unbind(b[0])
|
412
418
|
if USER_OS == "linux":
|
419
|
+
for b in mt_ri_canvas_linux_bindings:
|
420
|
+
for canvas in (self, self.RI):
|
421
|
+
canvas.unbind(b[0])
|
413
422
|
for b in all_canvas_linux_bindings:
|
414
423
|
for canvas in (self, self.RI, self.CH):
|
415
424
|
canvas.unbind(b[0])
|
@@ -495,6 +504,8 @@ class MainTable(tk.Canvas):
|
|
495
504
|
def get_ctrl_x_c_boxes(self) -> tuple[dict[tuple[int, int, int, int], str], int]:
|
496
505
|
boxes = {}
|
497
506
|
maxrows = 0
|
507
|
+
if not self.selected:
|
508
|
+
return boxes, maxrows
|
498
509
|
if self.selected.type_ in ("cells", "columns"):
|
499
510
|
curr_box = self.selection_boxes[self.selected.fill_iid].coords
|
500
511
|
maxrows = curr_box[2] - curr_box[0]
|
@@ -517,7 +528,7 @@ class MainTable(tk.Canvas):
|
|
517
528
|
)
|
518
529
|
return s, writer
|
519
530
|
|
520
|
-
def ctrl_c(self, event=None) -> None:
|
531
|
+
def ctrl_c(self, event=None) -> None | EventDataDict:
|
521
532
|
if not self.selected:
|
522
533
|
return
|
523
534
|
event_data = event_dict(
|
@@ -555,14 +566,17 @@ class MainTable(tk.Canvas):
|
|
555
566
|
for r1, c1, r2, c2 in boxes:
|
556
567
|
self.show_ctrl_outline(canvas="table", start_cell=(c1, r1), end_cell=(c2, r2))
|
557
568
|
self.clipboard_clear()
|
558
|
-
if len(event_data["cells"]["table"]) == 1
|
569
|
+
if len(event_data["cells"]["table"]) == 1 and self.PAR.ops.to_clipboard_lineterminator not in next(
|
570
|
+
iter(event_data["cells"]["table"].values())
|
571
|
+
):
|
559
572
|
self.clipboard_append(next(iter(event_data["cells"]["table"].values())))
|
560
573
|
else:
|
561
574
|
self.clipboard_append(s.getvalue())
|
562
575
|
self.update_idletasks()
|
563
576
|
try_binding(self.extra_end_ctrl_c_func, event_data, "end_ctrl_c")
|
577
|
+
return event_data
|
564
578
|
|
565
|
-
def ctrl_x(self, event=None) -> None:
|
579
|
+
def ctrl_x(self, event=None, validation: bool = True) -> None | EventDataDict:
|
566
580
|
if not self.selected:
|
567
581
|
return
|
568
582
|
event_data = event_dict(
|
@@ -586,10 +600,14 @@ class MainTable(tk.Canvas):
|
|
586
600
|
datacn = self.datacn(c)
|
587
601
|
row.append(self.get_cell_clipboard(datarn, datacn))
|
588
602
|
val = self.get_value_for_empty_cell(datarn, datacn)
|
589
|
-
if
|
590
|
-
self.edit_validation_func
|
591
|
-
|
592
|
-
|
603
|
+
if (
|
604
|
+
not self.edit_validation_func
|
605
|
+
or not validation
|
606
|
+
or (
|
607
|
+
self.edit_validation_func
|
608
|
+
and (val := self.edit_validation_func(mod_event_val(event_data, val, (r1 + rn, c))))
|
609
|
+
is not None
|
610
|
+
)
|
593
611
|
):
|
594
612
|
event_data = self.event_data_set_cell(
|
595
613
|
datarn,
|
@@ -607,10 +625,14 @@ class MainTable(tk.Canvas):
|
|
607
625
|
datacn = self.datacn(c)
|
608
626
|
row.append(self.get_cell_clipboard(datarn, datacn))
|
609
627
|
val = self.get_value_for_empty_cell(datarn, datacn)
|
610
|
-
if
|
611
|
-
self.edit_validation_func
|
612
|
-
|
613
|
-
|
628
|
+
if (
|
629
|
+
not self.edit_validation_func
|
630
|
+
or not validation
|
631
|
+
or (
|
632
|
+
self.edit_validation_func
|
633
|
+
and (val := self.edit_validation_func(mod_event_val(event_data, val, (r1 + rn, c))))
|
634
|
+
is not None
|
635
|
+
)
|
614
636
|
):
|
615
637
|
event_data = self.event_data_set_cell(
|
616
638
|
datarn,
|
@@ -620,9 +642,11 @@ class MainTable(tk.Canvas):
|
|
620
642
|
)
|
621
643
|
writer.writerow(row)
|
622
644
|
if event_data["cells"]["table"]:
|
623
|
-
self.undo_stack.append(
|
645
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
624
646
|
self.clipboard_clear()
|
625
|
-
if len(event_data["cells"]["table"]) == 1
|
647
|
+
if len(event_data["cells"]["table"]) == 1 and self.PAR.ops.to_clipboard_lineterminator not in next(
|
648
|
+
iter(event_data["cells"]["table"].values())
|
649
|
+
):
|
626
650
|
self.clipboard_append(next(iter(event_data["cells"]["table"].values())))
|
627
651
|
else:
|
628
652
|
self.clipboard_append(s.getvalue())
|
@@ -633,8 +657,9 @@ class MainTable(tk.Canvas):
|
|
633
657
|
if event_data["cells"]["table"]:
|
634
658
|
try_binding(self.extra_end_ctrl_x_func, event_data, "end_ctrl_x")
|
635
659
|
self.sheet_modified(event_data)
|
660
|
+
return event_data
|
636
661
|
|
637
|
-
def ctrl_v(self, event: object = None) -> None:
|
662
|
+
def ctrl_v(self, event: object = None, validation: bool = True) -> None | EventDataDict:
|
638
663
|
if not self.PAR.ops.expand_sheet_if_paste_too_big and (
|
639
664
|
len(self.col_positions) == 1 or len(self.row_positions) == 1
|
640
665
|
):
|
@@ -660,18 +685,13 @@ class MainTable(tk.Canvas):
|
|
660
685
|
elif len(self.row_positions) > 1 and len(self.col_positions) > 1:
|
661
686
|
selected_c, selected_r = 0, len(self.row_positions) - 1
|
662
687
|
try:
|
663
|
-
data =
|
688
|
+
data = get_data_from_clipboard(
|
689
|
+
widget=self,
|
690
|
+
delimiters=self.PAR.ops.from_clipboard_delimiters,
|
691
|
+
lineterminator=self.PAR.ops.to_clipboard_lineterminator,
|
692
|
+
)
|
664
693
|
except Exception:
|
665
694
|
return
|
666
|
-
try:
|
667
|
-
dialect = csv.Sniffer().sniff(data, delimiters=self.PAR.ops.from_clipboard_delimiters)
|
668
|
-
except Exception:
|
669
|
-
dialect = csv.excel_tab
|
670
|
-
if dialect.delimiter in data:
|
671
|
-
if not (data := list(csv.reader(io.StringIO(data), dialect=dialect, skipinitialspace=True))):
|
672
|
-
return
|
673
|
-
else:
|
674
|
-
data = [[data]]
|
675
695
|
new_data_numcols = max(map(len, data))
|
676
696
|
new_data_numrows = len(data)
|
677
697
|
for rn, r in enumerate(data):
|
@@ -749,9 +769,13 @@ class MainTable(tk.Canvas):
|
|
749
769
|
for ndr, r in enumerate(range(selected_r, selected_r_adjusted_new_data_numrows)):
|
750
770
|
for ndc, c in enumerate(range(selected_c, selected_c_adjusted_new_data_numcols)):
|
751
771
|
val = data[ndr][ndc]
|
752
|
-
if
|
753
|
-
self.edit_validation_func
|
754
|
-
|
772
|
+
if (
|
773
|
+
not self.edit_validation_func
|
774
|
+
or not validation
|
775
|
+
or (
|
776
|
+
self.edit_validation_func
|
777
|
+
and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
|
778
|
+
)
|
755
779
|
):
|
756
780
|
event_data = self.event_data_set_cell(
|
757
781
|
datarn=self.datarn(r),
|
@@ -785,10 +809,14 @@ class MainTable(tk.Canvas):
|
|
785
809
|
):
|
786
810
|
val = data[ndr][ndc]
|
787
811
|
datacn = self.datacn(c)
|
788
|
-
if
|
789
|
-
self.edit_validation_func
|
790
|
-
|
791
|
-
|
812
|
+
if (
|
813
|
+
not self.edit_validation_func
|
814
|
+
or not validation
|
815
|
+
or (
|
816
|
+
self.edit_validation_func
|
817
|
+
and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
|
818
|
+
and self.input_valid_for_cell(r, datacn, val, ignore_empty=True)
|
819
|
+
)
|
792
820
|
):
|
793
821
|
rows[r][datacn] = val
|
794
822
|
ctr += 1
|
@@ -823,10 +851,14 @@ class MainTable(tk.Canvas):
|
|
823
851
|
):
|
824
852
|
val = data[ndr][ndc]
|
825
853
|
datarn = self.datarn(r)
|
826
|
-
if
|
827
|
-
self.edit_validation_func
|
828
|
-
|
829
|
-
|
854
|
+
if (
|
855
|
+
not self.edit_validation_func
|
856
|
+
or not validation
|
857
|
+
or (
|
858
|
+
self.edit_validation_func
|
859
|
+
and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
|
860
|
+
and self.input_valid_for_cell(datarn, c, val, ignore_empty=True)
|
861
|
+
)
|
830
862
|
):
|
831
863
|
columns[c][datarn] = val
|
832
864
|
ctr += 1
|
@@ -839,7 +871,7 @@ class MainTable(tk.Canvas):
|
|
839
871
|
)
|
840
872
|
self.deselect("all", redraw=False)
|
841
873
|
if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
|
842
|
-
self.undo_stack.append(
|
874
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
843
875
|
self.create_selection_box(
|
844
876
|
selected_r,
|
845
877
|
selected_c,
|
@@ -861,8 +893,9 @@ class MainTable(tk.Canvas):
|
|
861
893
|
if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
|
862
894
|
try_binding(self.extra_end_ctrl_v_func, event_data, "end_ctrl_v")
|
863
895
|
self.sheet_modified(event_data)
|
896
|
+
return event_data
|
864
897
|
|
865
|
-
def delete_key(self, event: object = None) -> None:
|
898
|
+
def delete_key(self, event: object = None, validation: bool = True) -> None | EventDataDict:
|
866
899
|
if not self.selected:
|
867
900
|
return
|
868
901
|
event_data = event_dict(
|
@@ -879,9 +912,13 @@ class MainTable(tk.Canvas):
|
|
879
912
|
for c in range(c1, c2):
|
880
913
|
datarn, datacn = self.datarn(r), self.datacn(c)
|
881
914
|
val = self.get_value_for_empty_cell(datarn, datacn)
|
882
|
-
if
|
883
|
-
self.edit_validation_func
|
884
|
-
|
915
|
+
if (
|
916
|
+
not self.edit_validation_func
|
917
|
+
or not validation
|
918
|
+
or (
|
919
|
+
self.edit_validation_func
|
920
|
+
and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
|
921
|
+
)
|
885
922
|
):
|
886
923
|
event_data = self.event_data_set_cell(
|
887
924
|
datarn,
|
@@ -890,10 +927,11 @@ class MainTable(tk.Canvas):
|
|
890
927
|
event_data,
|
891
928
|
)
|
892
929
|
if event_data["cells"]["table"]:
|
893
|
-
self.undo_stack.append(
|
930
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
894
931
|
try_binding(self.extra_end_delete_key_func, event_data, "end_delete")
|
895
932
|
self.refresh()
|
896
933
|
self.sheet_modified(event_data)
|
934
|
+
return event_data
|
897
935
|
|
898
936
|
def event_data_set_cell(self, datarn: int, datacn: int, value: object, event_data: dict) -> EventDataDict:
|
899
937
|
if self.input_valid_for_cell(datarn, datacn, value):
|
@@ -1370,39 +1408,36 @@ class MainTable(tk.Canvas):
|
|
1370
1408
|
# all the way from 0 to max_idx
|
1371
1409
|
if old_idxs is None:
|
1372
1410
|
old_idxs = dict(zip(new_idxs.values(), new_idxs))
|
1373
|
-
seq = tuple(range(max_idx + 1))
|
1374
1411
|
return dict(
|
1375
1412
|
zip(
|
1376
|
-
move_elements_by_mapping(
|
1377
|
-
|
1413
|
+
move_elements_by_mapping(tuple(range(max_idx + 1)), new_idxs, old_idxs),
|
1414
|
+
range(max_idx + 1),
|
1378
1415
|
)
|
1379
1416
|
)
|
1380
1417
|
|
1381
|
-
def undo(self, event: object = None) -> None:
|
1418
|
+
def undo(self, event: object = None) -> None | EventDataDict:
|
1382
1419
|
if not self.undo_stack:
|
1383
1420
|
return
|
1384
|
-
|
1385
|
-
modification = self.undo_stack[-1]["data"]
|
1386
|
-
else:
|
1387
|
-
modification = decompress_load(self.undo_stack[-1]["data"])
|
1421
|
+
modification = decompress_load(self.undo_stack[-1]["data"])
|
1388
1422
|
if not try_binding(self.extra_begin_ctrl_z_func, modification, "begin_undo"):
|
1389
1423
|
return
|
1390
|
-
self.
|
1424
|
+
event_data = self.undo_modification_invert_event(modification)
|
1425
|
+
self.redo_stack.append(pickled_event_dict(event_data))
|
1391
1426
|
self.undo_stack.pop()
|
1392
|
-
try_binding(self.extra_end_ctrl_z_func,
|
1427
|
+
try_binding(self.extra_end_ctrl_z_func, event_data, "end_undo")
|
1428
|
+
return event_data
|
1393
1429
|
|
1394
|
-
def redo(self, event: object = None) -> None:
|
1430
|
+
def redo(self, event: object = None) -> None | EventDataDict:
|
1395
1431
|
if not self.redo_stack:
|
1396
1432
|
return
|
1397
|
-
|
1398
|
-
modification = self.redo_stack[-1]["data"]
|
1399
|
-
else:
|
1400
|
-
modification = decompress_load(self.redo_stack[-1]["data"])
|
1433
|
+
modification = decompress_load(self.redo_stack[-1]["data"])
|
1401
1434
|
if not try_binding(self.extra_begin_ctrl_z_func, modification, "begin_redo"):
|
1402
1435
|
return
|
1403
|
-
self.
|
1436
|
+
event_data = self.undo_modification_invert_event(modification, name="redo")
|
1437
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
1404
1438
|
self.redo_stack.pop()
|
1405
|
-
try_binding(self.extra_end_ctrl_z_func,
|
1439
|
+
try_binding(self.extra_end_ctrl_z_func, event_data, "end_redo")
|
1440
|
+
return event_data
|
1406
1441
|
|
1407
1442
|
def sheet_modified(self, event_data: EventDataDict, purge_redo: bool = True) -> None:
|
1408
1443
|
self.PAR.emit_event("<<SheetModified>>", event_data)
|
@@ -1450,7 +1485,7 @@ class MainTable(tk.Canvas):
|
|
1450
1485
|
k: mod_span_widget(unpickle_obj(v), self.PAR) for k, v in modification["named_spans"].items()
|
1451
1486
|
}
|
1452
1487
|
|
1453
|
-
def undo_modification_invert_event(self, modification: EventDataDict, name: str = "undo") ->
|
1488
|
+
def undo_modification_invert_event(self, modification: EventDataDict, name: str = "undo") -> EventDataDict:
|
1454
1489
|
self.deselect("all", redraw=False)
|
1455
1490
|
event_data = event_dict(
|
1456
1491
|
name=modification["eventname"],
|
@@ -1615,7 +1650,7 @@ class MainTable(tk.Canvas):
|
|
1615
1650
|
|
1616
1651
|
self.sheet_modified(event_data, purge_redo=False)
|
1617
1652
|
self.refresh()
|
1618
|
-
return
|
1653
|
+
return event_data
|
1619
1654
|
|
1620
1655
|
def see(
|
1621
1656
|
self,
|
@@ -2733,9 +2768,10 @@ class MainTable(tk.Canvas):
|
|
2733
2768
|
popup_menu = self.rc_popup_menu
|
2734
2769
|
else:
|
2735
2770
|
self.deselect("all")
|
2736
|
-
|
2771
|
+
if self.rc_popup_menus_enabled:
|
2772
|
+
popup_menu = self.empty_rc_popup_menu
|
2737
2773
|
try_binding(self.extra_rc_func, event)
|
2738
|
-
if popup_menu
|
2774
|
+
if popup_menu:
|
2739
2775
|
popup_menu.tk_popup(event.x_root, event.y_root)
|
2740
2776
|
|
2741
2777
|
def b1_press(self, event=None):
|
@@ -3715,6 +3751,22 @@ class MainTable(tk.Canvas):
|
|
3715
3751
|
del self.row_positions[idx]
|
3716
3752
|
self.row_positions[idx:] = [e - w for e in islice(self.row_positions, idx, len(self.row_positions))]
|
3717
3753
|
|
3754
|
+
def del_col_positions(self, idxs: Iterator[int] | None = None):
|
3755
|
+
if idxs is None:
|
3756
|
+
del self.col_positions[-1]
|
3757
|
+
else:
|
3758
|
+
if not isinstance(idxs, set):
|
3759
|
+
idxs = set(idxs)
|
3760
|
+
self.set_col_positions(itr=(w for i, w in enumerate(self.gen_column_widths()) if i not in idxs))
|
3761
|
+
|
3762
|
+
def del_row_positions(self, idxs: Iterator[int] | None = None):
|
3763
|
+
if idxs is None:
|
3764
|
+
del self.row_positions[-1]
|
3765
|
+
else:
|
3766
|
+
if not isinstance(idxs, set):
|
3767
|
+
idxs = set(idxs)
|
3768
|
+
self.set_row_positions(itr=(h for i, h in enumerate(self.gen_row_heights()) if i not in idxs))
|
3769
|
+
|
3718
3770
|
def get_column_widths(self) -> list[int]:
|
3719
3771
|
return diff_list(self.col_positions)
|
3720
3772
|
|
@@ -3727,26 +3779,6 @@ class MainTable(tk.Canvas):
|
|
3727
3779
|
def gen_row_heights(self) -> Generator[int]:
|
3728
3780
|
return diff_gen(self.row_positions)
|
3729
3781
|
|
3730
|
-
def del_col_positions(self, idx: int, num: int = 1, deselect_all: bool = False):
|
3731
|
-
if deselect_all:
|
3732
|
-
self.deselect("all", redraw=False)
|
3733
|
-
if idx == "end" or len(self.col_positions) <= idx + 1:
|
3734
|
-
del self.col_positions[-1]
|
3735
|
-
else:
|
3736
|
-
cws = self.get_column_widths()
|
3737
|
-
cws[idx : idx + num] = []
|
3738
|
-
self.set_col_positions(itr=cws)
|
3739
|
-
|
3740
|
-
def del_row_positions(self, idx: int, numrows: int = 1, deselect_all: bool = False):
|
3741
|
-
if deselect_all:
|
3742
|
-
self.deselect("all", redraw=False)
|
3743
|
-
if idx == "end" or len(self.row_positions) <= idx + 1:
|
3744
|
-
del self.row_positions[-1]
|
3745
|
-
else:
|
3746
|
-
rhs = self.get_row_heights()
|
3747
|
-
rhs[idx : idx + numrows] = []
|
3748
|
-
self.set_row_positions(itr=rhs)
|
3749
|
-
|
3750
3782
|
def insert_col_position(
|
3751
3783
|
self,
|
3752
3784
|
idx: Literal["end"] | int = "end",
|
@@ -4301,7 +4333,7 @@ class MainTable(tk.Canvas):
|
|
4301
4333
|
event_data=event_data,
|
4302
4334
|
)
|
4303
4335
|
if self.undo_enabled:
|
4304
|
-
self.undo_stack.append(
|
4336
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
4305
4337
|
self.refresh()
|
4306
4338
|
try_binding(self.extra_end_insert_cols_rc_func, event_data, "end_add_columns")
|
4307
4339
|
self.sheet_modified(event_data)
|
@@ -4432,7 +4464,7 @@ class MainTable(tk.Canvas):
|
|
4432
4464
|
event_data=event_data,
|
4433
4465
|
)
|
4434
4466
|
if self.undo_enabled:
|
4435
|
-
self.undo_stack.append(
|
4467
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
4436
4468
|
self.refresh()
|
4437
4469
|
try_binding(self.extra_end_insert_rows_rc_func, event_data, "end_add_rows")
|
4438
4470
|
self.sheet_modified(event_data)
|
@@ -4604,7 +4636,7 @@ class MainTable(tk.Canvas):
|
|
4604
4636
|
data_cols = selected if self.all_columns_displayed else [self.displayed_columns[c] for c in selected]
|
4605
4637
|
event_data = self.delete_columns_data(data_cols, event_data)
|
4606
4638
|
if self.undo_enabled:
|
4607
|
-
self.undo_stack.append(
|
4639
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
4608
4640
|
self.deselect("all")
|
4609
4641
|
try_binding(self.extra_end_del_cols_rc_func, event_data, "end_delete_columns")
|
4610
4642
|
self.sheet_modified(event_data)
|
@@ -4658,7 +4690,7 @@ class MainTable(tk.Canvas):
|
|
4658
4690
|
data_rows = selected if self.all_rows_displayed else [self.displayed_rows[r] for r in selected]
|
4659
4691
|
event_data = self.delete_rows_data(data_rows, event_data)
|
4660
4692
|
if self.undo_enabled:
|
4661
|
-
self.undo_stack.append(
|
4693
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
4662
4694
|
self.deselect("all")
|
4663
4695
|
try_binding(self.extra_end_del_rows_rc_func, event_data, "end_delete_rows")
|
4664
4696
|
self.sheet_modified(event_data)
|
@@ -6970,7 +7002,7 @@ class MainTable(tk.Canvas):
|
|
6970
7002
|
)
|
6971
7003
|
if not check_input_valid or self.input_valid_for_cell(datarn, datacn, value):
|
6972
7004
|
if self.undo_enabled and undo:
|
6973
|
-
self.undo_stack.append(
|
7005
|
+
self.undo_stack.append(pickled_event_dict(event_data))
|
6974
7006
|
self.set_cell_data(datarn, datacn, value)
|
6975
7007
|
if cell_resize and self.PAR.ops.cell_auto_resize_enabled:
|
6976
7008
|
self.set_cell_size_to_text(r, c, only_set_if_too_small=True, redraw=redraw, run_binding=True)
|
@@ -29,11 +29,11 @@ from .formatters import (
|
|
29
29
|
)
|
30
30
|
from .functions import (
|
31
31
|
consecutive_chunks,
|
32
|
-
ev_stack_dict,
|
33
32
|
event_dict,
|
34
33
|
get_n2a,
|
35
34
|
is_contiguous,
|
36
35
|
num2alpha,
|
36
|
+
pickled_event_dict,
|
37
37
|
rounded_box_coords,
|
38
38
|
try_binding,
|
39
39
|
)
|
@@ -851,7 +851,7 @@ class RowIndex(tk.Canvas):
|
|
851
851
|
"displayed": disp_new_idxs,
|
852
852
|
}
|
853
853
|
if self.MT.undo_enabled:
|
854
|
-
self.MT.undo_stack.append(
|
854
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
855
855
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
856
856
|
try_binding(self.ri_extra_end_drag_drop_func, event_data, "end_move_rows")
|
857
857
|
self.MT.sheet_modified(event_data)
|
@@ -2189,7 +2189,7 @@ class RowIndex(tk.Canvas):
|
|
2189
2189
|
self.fix_index(datarn)
|
2190
2190
|
if not check_input_valid or self.input_valid_for_cell(datarn, value):
|
2191
2191
|
if self.MT.undo_enabled and undo:
|
2192
|
-
self.MT.undo_stack.append(
|
2192
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2193
2193
|
self.set_cell_data(datarn=datarn, value=value)
|
2194
2194
|
edited = True
|
2195
2195
|
if edited and cell_resize and self.PAR.ops.cell_auto_resize_enabled:
|
@@ -19,7 +19,6 @@ from .functions import (
|
|
19
19
|
del_named_span_options,
|
20
20
|
del_named_span_options_nested,
|
21
21
|
dropdown_search_function,
|
22
|
-
ev_stack_dict,
|
23
22
|
event_dict,
|
24
23
|
fix_format_kwargs,
|
25
24
|
get_checkbox_dict,
|
@@ -30,6 +29,7 @@ from .functions import (
|
|
30
29
|
is_iterable,
|
31
30
|
key_to_span,
|
32
31
|
num2alpha,
|
32
|
+
pickled_event_dict,
|
33
33
|
pop_positions,
|
34
34
|
set_align,
|
35
35
|
set_readonly,
|
@@ -1050,29 +1050,23 @@ class Sheet(tk.Frame):
|
|
1050
1050
|
canvas.basic_bindings(enable)
|
1051
1051
|
return self
|
1052
1052
|
|
1053
|
-
def cut(self, event: object = None) ->
|
1054
|
-
self.MT.ctrl_x(event)
|
1055
|
-
return self
|
1053
|
+
def cut(self, event: object = None, validation: bool = True) -> None | EventDataDict:
|
1054
|
+
return self.MT.ctrl_x(event, validation)
|
1056
1055
|
|
1057
|
-
def copy(self, event: object = None) ->
|
1058
|
-
self.MT.ctrl_c(event)
|
1059
|
-
return self
|
1056
|
+
def copy(self, event: object = None) -> None | EventDataDict:
|
1057
|
+
return self.MT.ctrl_c(event)
|
1060
1058
|
|
1061
|
-
def paste(self, event: object = None) ->
|
1062
|
-
self.MT.ctrl_v(event)
|
1063
|
-
return self
|
1059
|
+
def paste(self, event: object = None, validation: bool = True) -> None | EventDataDict:
|
1060
|
+
return self.MT.ctrl_v(event, validation)
|
1064
1061
|
|
1065
|
-
def delete(self, event: object = None) ->
|
1066
|
-
self.MT.delete_key(event)
|
1067
|
-
return self
|
1062
|
+
def delete(self, event: object = None, validation: bool = True) -> None | EventDataDict:
|
1063
|
+
return self.MT.delete_key(event, validation)
|
1068
1064
|
|
1069
|
-
def undo(self, event: object = None) ->
|
1070
|
-
self.MT.undo(event)
|
1071
|
-
return self
|
1065
|
+
def undo(self, event: object = None) -> None | EventDataDict:
|
1066
|
+
return self.MT.undo(event)
|
1072
1067
|
|
1073
|
-
def redo(self, event: object = None) ->
|
1074
|
-
self.MT.redo(event)
|
1075
|
-
return self
|
1068
|
+
def redo(self, event: object = None) -> None | EventDataDict:
|
1069
|
+
return self.MT.redo(event)
|
1076
1070
|
|
1077
1071
|
def has_focus(
|
1078
1072
|
self,
|
@@ -1801,7 +1795,7 @@ class Sheet(tk.Frame):
|
|
1801
1795
|
or event_data["added"]["rows"]
|
1802
1796
|
):
|
1803
1797
|
if undo is True or (undo is None and span.undo):
|
1804
|
-
self.MT.undo_stack.append(
|
1798
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
1805
1799
|
if emit_event is True or (emit_event is None and span.emit_event):
|
1806
1800
|
self.emit_event("<<SheetModified>>", event_data)
|
1807
1801
|
self.set_refresh_timer(redraw)
|
@@ -1840,7 +1834,7 @@ class Sheet(tk.Frame):
|
|
1840
1834
|
event_data = clear_t(r, c, quick_tval(r, c), event_data)
|
1841
1835
|
if event_data["cells"]["table"] or event_data["cells"]["header"] or event_data["cells"]["index"]:
|
1842
1836
|
if undo is True or (undo is None and span.undo):
|
1843
|
-
self.MT.undo_stack.append(
|
1837
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
1844
1838
|
if emit_event is True or (emit_event is None and span.emit_event):
|
1845
1839
|
self.emit_event("<<SheetModified>>", event_data)
|
1846
1840
|
self.set_refresh_timer(redraw)
|
@@ -2009,7 +2003,7 @@ class Sheet(tk.Frame):
|
|
2009
2003
|
push_ops=push_ops,
|
2010
2004
|
)
|
2011
2005
|
if undo:
|
2012
|
-
self.MT.undo_stack.append(
|
2006
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2013
2007
|
if emit_event:
|
2014
2008
|
self.emit_event("<<SheetModified>>", event_data)
|
2015
2009
|
self.set_refresh_timer(redraw)
|
@@ -2104,7 +2098,7 @@ class Sheet(tk.Frame):
|
|
2104
2098
|
push_ops=push_ops,
|
2105
2099
|
)
|
2106
2100
|
if undo:
|
2107
|
-
self.MT.undo_stack.append(
|
2101
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2108
2102
|
if emit_event:
|
2109
2103
|
self.emit_event("<<SheetModified>>", event_data)
|
2110
2104
|
self.set_refresh_timer(redraw)
|
@@ -2178,7 +2172,7 @@ class Sheet(tk.Frame):
|
|
2178
2172
|
event_data,
|
2179
2173
|
)
|
2180
2174
|
if undo:
|
2181
|
-
self.MT.undo_stack.append(
|
2175
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2182
2176
|
if emit_event:
|
2183
2177
|
self.emit_event("<<SheetModified>>", event_data)
|
2184
2178
|
self.MT.deselect("all", redraw=False)
|
@@ -2219,7 +2213,7 @@ class Sheet(tk.Frame):
|
|
2219
2213
|
event_data,
|
2220
2214
|
)
|
2221
2215
|
if undo:
|
2222
|
-
self.MT.undo_stack.append(
|
2216
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2223
2217
|
if emit_event:
|
2224
2218
|
self.emit_event("<<SheetModified>>", event_data)
|
2225
2219
|
self.MT.deselect("all", redraw=False)
|
@@ -2320,7 +2314,7 @@ class Sheet(tk.Frame):
|
|
2320
2314
|
data_indexes=data_indexes,
|
2321
2315
|
)
|
2322
2316
|
if undo:
|
2323
|
-
self.MT.undo_stack.append(
|
2317
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2324
2318
|
if emit_event:
|
2325
2319
|
self.emit_event("<<SheetModified>>", event_data)
|
2326
2320
|
self.set_refresh_timer(redraw)
|
@@ -2348,7 +2342,7 @@ class Sheet(tk.Frame):
|
|
2348
2342
|
data_indexes=data_indexes,
|
2349
2343
|
)
|
2350
2344
|
if undo:
|
2351
|
-
self.MT.undo_stack.append(
|
2345
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2352
2346
|
if emit_event:
|
2353
2347
|
self.emit_event("<<SheetModified>>", event_data)
|
2354
2348
|
self.set_refresh_timer(redraw)
|
@@ -2375,7 +2369,7 @@ class Sheet(tk.Frame):
|
|
2375
2369
|
data_indexes=data_indexes,
|
2376
2370
|
)
|
2377
2371
|
if undo:
|
2378
|
-
self.MT.undo_stack.append(
|
2372
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2379
2373
|
if emit_event:
|
2380
2374
|
self.emit_event("<<SheetModified>>", event_data)
|
2381
2375
|
self.set_refresh_timer(redraw)
|
@@ -2402,7 +2396,7 @@ class Sheet(tk.Frame):
|
|
2402
2396
|
data_indexes=data_indexes,
|
2403
2397
|
)
|
2404
2398
|
if undo:
|
2405
|
-
self.MT.undo_stack.append(
|
2399
|
+
self.MT.undo_stack.append(pickled_event_dict(event_data))
|
2406
2400
|
if emit_event:
|
2407
2401
|
self.emit_event("<<SheetModified>>", event_data)
|
2408
2402
|
self.set_refresh_timer(redraw)
|
@@ -3446,12 +3440,22 @@ class Sheet(tk.Frame):
|
|
3446
3440
|
|
3447
3441
|
delete_row_position = del_row_position
|
3448
3442
|
|
3443
|
+
def del_row_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
|
3444
|
+
self.MT.del_row_positions(idxs=idxs)
|
3445
|
+
self.set_refresh_timer()
|
3446
|
+
return self
|
3447
|
+
|
3449
3448
|
def del_column_position(self, idx: int, deselect_all: bool = False) -> Sheet:
|
3450
3449
|
self.MT.del_col_position(idx, deselect_all=deselect_all)
|
3451
3450
|
return self
|
3452
3451
|
|
3453
3452
|
delete_column_position = del_column_position
|
3454
3453
|
|
3454
|
+
def del_column_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
|
3455
|
+
self.MT.del_col_positions(idxs=idxs)
|
3456
|
+
self.set_refresh_timer()
|
3457
|
+
return self
|
3458
|
+
|
3455
3459
|
def insert_column_position(
|
3456
3460
|
self,
|
3457
3461
|
idx: Literal["end"] | int = "end",
|
@@ -4253,27 +4257,27 @@ class Sheet(tk.Frame):
|
|
4253
4257
|
target = self.CH.cell_options
|
4254
4258
|
if key is None:
|
4255
4259
|
return target
|
4256
|
-
return {k: v for k, v in target.items() if key in v}
|
4260
|
+
return {k: v[key] for k, v in target.items() if key in v}
|
4257
4261
|
|
4258
4262
|
def get_row_options(self, key: None | str = None) -> dict:
|
4259
4263
|
if key is None:
|
4260
4264
|
return self.MT.row_options
|
4261
|
-
return {k: v for k, v in self.MT.row_options.items() if key in v}
|
4265
|
+
return {k: v[key] for k, v in self.MT.row_options.items() if key in v}
|
4262
4266
|
|
4263
4267
|
def get_column_options(self, key: None | str = None) -> dict:
|
4264
4268
|
if key is None:
|
4265
4269
|
return self.MT.col_options
|
4266
|
-
return {k: v for k, v in self.MT.col_options.items() if key in v}
|
4270
|
+
return {k: v[key] for k, v in self.MT.col_options.items() if key in v}
|
4267
4271
|
|
4268
4272
|
def get_index_options(self, key: None | str = None) -> dict:
|
4269
4273
|
if key is None:
|
4270
4274
|
return self.RI.cell_options
|
4271
|
-
return {k: v for k, v in self.RI.cell_options.items() if key in v}
|
4275
|
+
return {k: v[key] for k, v in self.RI.cell_options.items() if key in v}
|
4272
4276
|
|
4273
4277
|
def get_header_options(self, key: None | str = None) -> dict:
|
4274
4278
|
if key is None:
|
4275
4279
|
return self.CH.cell_options
|
4276
|
-
return {k: v for k, v in self.CH.cell_options.items() if key in v}
|
4280
|
+
return {k: v[key] for k, v in self.CH.cell_options.items() if key in v}
|
4277
4281
|
|
4278
4282
|
def del_out_of_bounds_options(self) -> Sheet:
|
4279
4283
|
maxc = self.total_columns()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: tksheet
|
3
|
-
Version: 7.1.
|
3
|
+
Version: 7.1.20
|
4
4
|
Summary: Tkinter table / sheet widget
|
5
5
|
Author-email: ragardner <github@ragardner.simplelogin.com>
|
6
6
|
License: Copyright (c) 2019 ragardner and open source contributors
|
@@ -42,7 +42,7 @@ License-File: LICENSE.txt
|
|
42
42
|
|
43
43
|
# tksheet
|
44
44
|
|
45
|
-
[](https://pypi.python.org/pypi/tksheet/) ](https://pypi.python.org/pypi/tksheet/)  [](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
|
46
46
|
|
47
47
|
[](https://github.com/ragardner/tksheet/releases) [](https://pypi.org/project/tksheet/)
|
48
48
|
|
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
|