tksheet 7.2.20__py3-none-any.whl → 7.2.22__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 +1 -1
- tksheet/column_headers.py +71 -56
- tksheet/functions.py +17 -14
- tksheet/main_table.py +182 -138
- tksheet/other_classes.py +19 -0
- tksheet/row_index.py +64 -55
- tksheet/sheet.py +115 -17
- {tksheet-7.2.20.dist-info → tksheet-7.2.22.dist-info}/METADATA +2 -2
- tksheet-7.2.22.dist-info/RECORD +20 -0
- {tksheet-7.2.20.dist-info → tksheet-7.2.22.dist-info}/WHEEL +1 -1
- tksheet-7.2.20.dist-info/RECORD +0 -20
- {tksheet-7.2.20.dist-info → tksheet-7.2.22.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.2.20.dist-info → tksheet-7.2.22.dist-info}/top_level.txt +0 -0
tksheet/other_classes.py
CHANGED
@@ -489,6 +489,25 @@ class TextEditorStorage:
|
|
489
489
|
if self.window:
|
490
490
|
return self.window.get()
|
491
491
|
return ""
|
492
|
+
|
493
|
+
def set(self, value: str) -> None:
|
494
|
+
if not self.window:
|
495
|
+
return
|
496
|
+
self.window.set_text(value)
|
497
|
+
|
498
|
+
def highlight_from(self, r: int | str, c: int | str) -> None:
|
499
|
+
index = self.window.tktext.index(f"{r}.{c}")
|
500
|
+
self.window.tktext.tag_add('sel', index, 'end')
|
501
|
+
self.window.tktext.mark_set('insert', f"{r}.{c}")
|
502
|
+
|
503
|
+
def autocomplete(self, value: str | None) -> None:
|
504
|
+
current_val = self.get()
|
505
|
+
if not value or len(current_val) >= len(value) or current_val != value[:len(current_val)]:
|
506
|
+
return
|
507
|
+
cursor_pos = self.tktext.index('insert')
|
508
|
+
line, column = cursor_pos.split('.')
|
509
|
+
self.window.set_text(value)
|
510
|
+
self.highlight_from(line, column)
|
492
511
|
|
493
512
|
@property
|
494
513
|
def tktext(self) -> object:
|
tksheet/row_index.py
CHANGED
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|
3
3
|
import tkinter as tk
|
4
4
|
from collections import defaultdict
|
5
5
|
from collections.abc import (
|
6
|
-
Callable,
|
7
6
|
Generator,
|
8
7
|
Hashable,
|
9
8
|
Iterator,
|
@@ -41,7 +40,7 @@ from .functions import (
|
|
41
40
|
is_contiguous,
|
42
41
|
new_tk_event,
|
43
42
|
num2alpha,
|
44
|
-
|
43
|
+
stored_event_dict,
|
45
44
|
rounded_box_coords,
|
46
45
|
try_binding,
|
47
46
|
)
|
@@ -878,7 +877,7 @@ class RowIndex(tk.Canvas):
|
|
878
877
|
"displayed": disp_new_idxs,
|
879
878
|
}
|
880
879
|
if self.MT.undo_enabled:
|
881
|
-
self.MT.undo_stack.append(
|
880
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
882
881
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
883
882
|
try_binding(self.ri_extra_end_drag_drop_func, event_data, "end_move_rows")
|
884
883
|
self.MT.sheet_modified(event_data)
|
@@ -1222,27 +1221,28 @@ class RowIndex(tk.Canvas):
|
|
1222
1221
|
fr: float,
|
1223
1222
|
sr: float,
|
1224
1223
|
r: int,
|
1225
|
-
|
1226
|
-
|
1224
|
+
sel_cells_bg: str,
|
1225
|
+
sel_rows_bg: str,
|
1227
1226
|
selections: dict,
|
1228
1227
|
datarn: int,
|
1229
1228
|
) -> tuple[str, str, bool]:
|
1230
1229
|
redrawn = False
|
1231
1230
|
kwargs = self.get_cell_kwargs(datarn, key="highlight")
|
1232
1231
|
if kwargs:
|
1233
|
-
|
1234
|
-
|
1232
|
+
fill = kwargs[0]
|
1233
|
+
if fill and not fill.startswith("#"):
|
1234
|
+
fill = color_map[fill]
|
1235
1235
|
if "rows" in selections and r in selections["rows"]:
|
1236
1236
|
txtfg = (
|
1237
1237
|
self.PAR.ops.index_selected_rows_fg
|
1238
1238
|
if kwargs[1] is None or self.PAR.ops.display_selected_fg_over_highlights
|
1239
1239
|
else kwargs[1]
|
1240
1240
|
)
|
1241
|
-
if
|
1241
|
+
if fill:
|
1242
1242
|
fill = (
|
1243
|
-
f"#{int((int(
|
1244
|
-
+ f"{int((int(
|
1245
|
-
+ f"{int((int(
|
1243
|
+
f"#{int((int(fill[1:3], 16) + int(sel_rows_bg[1:3], 16)) / 2):02X}"
|
1244
|
+
+ f"{int((int(fill[3:5], 16) + int(sel_rows_bg[3:5], 16)) / 2):02X}"
|
1245
|
+
+ f"{int((int(fill[5:], 16) + int(sel_rows_bg[5:], 16)) / 2):02X}"
|
1246
1246
|
)
|
1247
1247
|
elif "cells" in selections and r in selections["cells"]:
|
1248
1248
|
txtfg = (
|
@@ -1250,17 +1250,15 @@ class RowIndex(tk.Canvas):
|
|
1250
1250
|
if kwargs[1] is None or self.PAR.ops.display_selected_fg_over_highlights
|
1251
1251
|
else kwargs[1]
|
1252
1252
|
)
|
1253
|
-
if
|
1253
|
+
if fill:
|
1254
1254
|
fill = (
|
1255
|
-
f"#{int((int(
|
1256
|
-
+ f"{int((int(
|
1257
|
-
+ f"{int((int(
|
1255
|
+
f"#{int((int(fill[1:3], 16) + int(sel_cells_bg[1:3], 16)) / 2):02X}"
|
1256
|
+
+ f"{int((int(fill[3:5], 16) + int(sel_cells_bg[3:5], 16)) / 2):02X}"
|
1257
|
+
+ f"{int((int(fill[5:], 16) + int(sel_cells_bg[5:], 16)) / 2):02X}"
|
1258
1258
|
)
|
1259
1259
|
else:
|
1260
1260
|
txtfg = self.PAR.ops.index_fg if kwargs[1] is None else kwargs[1]
|
1261
|
-
|
1262
|
-
fill = kwargs[0]
|
1263
|
-
if kwargs[0] is not None:
|
1261
|
+
if fill:
|
1264
1262
|
redrawn = self.redraw_highlight(
|
1265
1263
|
0,
|
1266
1264
|
fr + 1,
|
@@ -1592,12 +1590,12 @@ class RowIndex(tk.Canvas):
|
|
1592
1590
|
)
|
1593
1591
|
)
|
1594
1592
|
self.redraw_gridline(points=points, fill=self.PAR.ops.index_grid_fg, width=1, tag="h")
|
1595
|
-
|
1593
|
+
sel_cells_bg = (
|
1596
1594
|
self.PAR.ops.index_selected_cells_bg
|
1597
1595
|
if self.PAR.ops.index_selected_cells_bg.startswith("#")
|
1598
1596
|
else color_map[self.PAR.ops.index_selected_cells_bg]
|
1599
1597
|
)
|
1600
|
-
|
1598
|
+
sel_rows_bg = (
|
1601
1599
|
self.PAR.ops.index_selected_rows_bg
|
1602
1600
|
if self.PAR.ops.index_selected_rows_bg.startswith("#")
|
1603
1601
|
else color_map[self.PAR.ops.index_selected_rows_bg]
|
@@ -1614,13 +1612,13 @@ class RowIndex(tk.Canvas):
|
|
1614
1612
|
continue
|
1615
1613
|
datarn = r if self.MT.all_rows_displayed else self.MT.displayed_rows[r]
|
1616
1614
|
fill, tree_arrow_fg, dd_drawn = self.redraw_highlight_get_text_fg(
|
1617
|
-
rtopgridln,
|
1618
|
-
rbotgridln,
|
1619
|
-
r,
|
1620
|
-
|
1621
|
-
|
1622
|
-
selections,
|
1623
|
-
datarn,
|
1615
|
+
fr=rtopgridln,
|
1616
|
+
sr=rbotgridln,
|
1617
|
+
r=r,
|
1618
|
+
sel_cells_bg=sel_cells_bg,
|
1619
|
+
sel_rows_bg=sel_rows_bg,
|
1620
|
+
selections=selections,
|
1621
|
+
datarn=datarn,
|
1624
1622
|
)
|
1625
1623
|
|
1626
1624
|
if datarn in self.cell_options and "align" in self.cell_options[datarn]:
|
@@ -1637,7 +1635,7 @@ class RowIndex(tk.Canvas):
|
|
1637
1635
|
rtopgridln,
|
1638
1636
|
self.current_width - 1,
|
1639
1637
|
rbotgridln - 1,
|
1640
|
-
fill=fill,
|
1638
|
+
fill=fill if dropdown_kwargs["state"] != "disabled" else self.PAR.ops.index_grid_fg,
|
1641
1639
|
outline=fill,
|
1642
1640
|
tag="dd",
|
1643
1641
|
draw_outline=not dd_drawn,
|
@@ -1656,7 +1654,7 @@ class RowIndex(tk.Canvas):
|
|
1656
1654
|
rtopgridln,
|
1657
1655
|
self.current_width - 1,
|
1658
1656
|
rbotgridln - 1,
|
1659
|
-
fill=fill,
|
1657
|
+
fill=fill if dropdown_kwargs["state"] != "disabled" else self.PAR.ops.index_grid_fg,
|
1660
1658
|
outline=fill,
|
1661
1659
|
tag="dd",
|
1662
1660
|
draw_outline=not dd_drawn,
|
@@ -1676,7 +1674,7 @@ class RowIndex(tk.Canvas):
|
|
1676
1674
|
rtopgridln,
|
1677
1675
|
self.current_width - 1,
|
1678
1676
|
rbotgridln - 1,
|
1679
|
-
fill=fill,
|
1677
|
+
fill=fill if dropdown_kwargs["state"] != "disabled" else self.PAR.ops.index_grid_fg,
|
1680
1678
|
outline=fill,
|
1681
1679
|
tag="dd",
|
1682
1680
|
draw_outline=not dd_drawn,
|
@@ -2148,21 +2146,43 @@ class RowIndex(tk.Canvas):
|
|
2148
2146
|
|
2149
2147
|
def dropdown_text_editor_modified(
|
2150
2148
|
self,
|
2151
|
-
|
2152
|
-
event: dict,
|
2153
|
-
modified_func: Callable | None,
|
2149
|
+
event: tk.Misc,
|
2154
2150
|
) -> None:
|
2155
|
-
|
2156
|
-
|
2157
|
-
|
2151
|
+
r = self.dropdown.get_coords()
|
2152
|
+
event_data = event_dict(
|
2153
|
+
name="table_dropdown_modified",
|
2154
|
+
sheet=self.PAR.name,
|
2155
|
+
value=self.text_editor.get(),
|
2156
|
+
loc=r,
|
2157
|
+
row=r,
|
2158
|
+
column=0,
|
2159
|
+
boxes=self.MT.get_boxes(),
|
2160
|
+
selected=self.MT.selected,
|
2161
|
+
)
|
2162
|
+
try_binding(self.dropdown.window.modified_function, event_data)
|
2163
|
+
val = self.dropdown.window.search_and_see(event_data)
|
2164
|
+
# return to tk.Text action if control/command is held down
|
2165
|
+
# or keysym was not a character
|
2166
|
+
if (hasattr(event, "state") and event.state & (0x0004 | 0x00000010)) or (
|
2167
|
+
hasattr(event, "keysym") and len(event.keysym) > 2
|
2168
|
+
):
|
2169
|
+
return
|
2170
|
+
self.text_editor.tktext.unbind("<KeyRelease>")
|
2171
|
+
self.text_editor.autocomplete(val)
|
2172
|
+
self.text_editor.tktext.bind(
|
2173
|
+
"<KeyRelease>",
|
2174
|
+
self.dropdown_text_editor_modified,
|
2175
|
+
)
|
2176
|
+
return "break"
|
2158
2177
|
|
2159
2178
|
# r is displayed row
|
2160
2179
|
def open_dropdown_window(self, r: int, event: object = None) -> None:
|
2161
2180
|
self.hide_text_editor()
|
2162
2181
|
kwargs = self.get_cell_kwargs(self.MT.datarn(r), key="dropdown")
|
2163
|
-
if kwargs["state"] == "
|
2164
|
-
|
2165
|
-
|
2182
|
+
if kwargs["state"] == "disabled":
|
2183
|
+
return
|
2184
|
+
if kwargs["state"] == "normal" and not self.open_text_editor(event=event, r=r, dropdown=True):
|
2185
|
+
return
|
2166
2186
|
win_h, anchor = self.get_dropdown_height_anchor(r)
|
2167
2187
|
win_w = self.current_width + 1
|
2168
2188
|
if anchor == "nw":
|
@@ -2183,6 +2203,8 @@ class RowIndex(tk.Canvas):
|
|
2183
2203
|
"outline_color": self.PAR.ops.index_selected_rows_bg,
|
2184
2204
|
"align": self.get_cell_align(r),
|
2185
2205
|
"values": kwargs["values"],
|
2206
|
+
"search_function": kwargs["search_function"],
|
2207
|
+
"modified_function": kwargs["modified_function"],
|
2186
2208
|
}
|
2187
2209
|
if self.dropdown.window:
|
2188
2210
|
self.dropdown.window.reset(**reset_kwargs)
|
@@ -2195,7 +2217,6 @@ class RowIndex(tk.Canvas):
|
|
2195
2217
|
**reset_kwargs,
|
2196
2218
|
single_index="r",
|
2197
2219
|
close_dropdown_window=self.close_dropdown_window,
|
2198
|
-
search_function=kwargs["search_function"],
|
2199
2220
|
arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
|
2200
2221
|
arrowkey_LEFT=self.MT.arrowkey_LEFT,
|
2201
2222
|
)
|
@@ -2206,20 +2227,8 @@ class RowIndex(tk.Canvas):
|
|
2206
2227
|
)
|
2207
2228
|
if kwargs["state"] == "normal":
|
2208
2229
|
self.text_editor.tktext.bind(
|
2209
|
-
"
|
2210
|
-
|
2211
|
-
self.dropdown.window,
|
2212
|
-
event_dict(
|
2213
|
-
name="index_dropdown_modified",
|
2214
|
-
sheet=self.PAR.name,
|
2215
|
-
value=self.text_editor.get(),
|
2216
|
-
loc=r,
|
2217
|
-
row=r,
|
2218
|
-
boxes=self.MT.get_boxes(),
|
2219
|
-
selected=self.MT.selected,
|
2220
|
-
),
|
2221
|
-
kwargs["modified_function"],
|
2222
|
-
),
|
2230
|
+
"<KeyRelease>",
|
2231
|
+
self.dropdown_text_editor_modified,
|
2223
2232
|
)
|
2224
2233
|
self.update_idletasks()
|
2225
2234
|
try:
|
@@ -2344,7 +2353,7 @@ class RowIndex(tk.Canvas):
|
|
2344
2353
|
self.fix_index(datarn)
|
2345
2354
|
if not check_input_valid or self.input_valid_for_cell(datarn, value):
|
2346
2355
|
if self.MT.undo_enabled and undo:
|
2347
|
-
self.MT.undo_stack.append(
|
2356
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2348
2357
|
self.set_cell_data(datarn=datarn, value=value)
|
2349
2358
|
edited = True
|
2350
2359
|
if edited and cell_resize and self.PAR.ops.cell_auto_resize_enabled:
|
tksheet/sheet.py
CHANGED
@@ -48,7 +48,7 @@ from .functions import (
|
|
48
48
|
key_to_span,
|
49
49
|
new_tk_event,
|
50
50
|
num2alpha,
|
51
|
-
|
51
|
+
stored_event_dict,
|
52
52
|
pop_positions,
|
53
53
|
set_align,
|
54
54
|
set_readonly,
|
@@ -607,6 +607,46 @@ class Sheet(tk.Frame):
|
|
607
607
|
# Bindings and Functionality
|
608
608
|
|
609
609
|
def enable_bindings(self, *bindings: str) -> Sheet:
|
610
|
+
"""
|
611
|
+
List of available bindings:
|
612
|
+
- "all"
|
613
|
+
- "single_select"
|
614
|
+
- "toggle_select"
|
615
|
+
- "drag_select"
|
616
|
+
- "select_all"
|
617
|
+
- "column_drag_and_drop" / "move_columns"
|
618
|
+
- "row_drag_and_drop" / "move_rows"
|
619
|
+
- "column_select"
|
620
|
+
- "row_select"
|
621
|
+
- "column_width_resize"
|
622
|
+
- "double_click_column_resize"
|
623
|
+
- "row_width_resize"
|
624
|
+
- "column_height_resize"
|
625
|
+
- "arrowkeys" # all arrowkeys including page up and down
|
626
|
+
- "up"
|
627
|
+
- "down"
|
628
|
+
- "left"
|
629
|
+
- "right"
|
630
|
+
- "prior" # page up
|
631
|
+
- "next" # page down
|
632
|
+
- "row_height_resize"
|
633
|
+
- "double_click_row_resize"
|
634
|
+
- "right_click_popup_menu" / "rc_popup_menu" / "rc_menu"
|
635
|
+
- "rc_select"
|
636
|
+
- "rc_insert_column"
|
637
|
+
- "rc_delete_column"
|
638
|
+
- "rc_insert_row"
|
639
|
+
- "rc_delete_row"
|
640
|
+
- "ctrl_click_select" / "ctrl_select"
|
641
|
+
- "copy"
|
642
|
+
- "cut"
|
643
|
+
- "paste"
|
644
|
+
- "delete"
|
645
|
+
- "undo"
|
646
|
+
- "edit_cell"
|
647
|
+
- "edit_header"
|
648
|
+
- "edit_index"
|
649
|
+
"""
|
610
650
|
self.MT.enable_bindings(bindings)
|
611
651
|
return self
|
612
652
|
|
@@ -619,6 +659,57 @@ class Sheet(tk.Frame):
|
|
619
659
|
bindings: str | list | tuple | None = None,
|
620
660
|
func: Callable | None = None,
|
621
661
|
) -> Sheet:
|
662
|
+
"""
|
663
|
+
List of available bindings:
|
664
|
+
- "begin_copy", "begin_ctrl_c"
|
665
|
+
- "ctrl_c", "end_copy", "end_ctrl_c", "copy"
|
666
|
+
- "begin_cut", "begin_ctrl_x"
|
667
|
+
- "ctrl_x", "end_cut", "end_ctrl_x", "cut"
|
668
|
+
- "begin_paste", "begin_ctrl_v"
|
669
|
+
- "ctrl_v", "end_paste", "end_ctrl_v", "paste"
|
670
|
+
- "begin_undo", "begin_ctrl_z"
|
671
|
+
- "ctrl_z", "end_undo", "end_ctrl_z", "undo"
|
672
|
+
- "begin_delete_key", "begin_delete"
|
673
|
+
- "delete_key", "end_delete", "end_delete_key", "delete"
|
674
|
+
- "begin_edit_cell", "begin_edit_table"
|
675
|
+
- "end_edit_cell", "edit_cell", "edit_table"
|
676
|
+
- "begin_edit_header"
|
677
|
+
- "end_edit_header", "edit_header"
|
678
|
+
- "begin_edit_index"
|
679
|
+
- "end_edit_index", "edit_index"
|
680
|
+
- "begin_row_index_drag_drop", "begin_move_rows"
|
681
|
+
- "row_index_drag_drop", "move_rows", "end_move_rows", "end_row_index_drag_drop"
|
682
|
+
- "begin_column_header_drag_drop", "begin_move_columns"
|
683
|
+
- "column_header_drag_drop", "move_columns", "end_move_columns", "end_column_header_drag_drop"
|
684
|
+
- "begin_rc_delete_row", "begin_delete_rows"
|
685
|
+
- "rc_delete_row", "end_rc_delete_row", "end_delete_rows", "delete_rows"
|
686
|
+
- "begin_rc_delete_column", "begin_delete_columns"
|
687
|
+
- "rc_delete_column", "end_rc_delete_column","end_delete_columns", "delete_columns"
|
688
|
+
- "begin_rc_insert_column", "begin_insert_column", "begin_insert_columns", "begin_add_column","begin_rc_add_column", "begin_add_columns"
|
689
|
+
- "rc_insert_column", "end_rc_insert_column", "end_insert_column", "end_insert_columns", "rc_add_column", "end_rc_add_column", "end_add_column", "end_add_columns"
|
690
|
+
- "begin_rc_insert_row", "begin_insert_row", "begin_insert_rows", "begin_rc_add_row", "begin_add_row", "begin_add_rows"
|
691
|
+
- "rc_insert_row", "end_rc_insert_row", "end_insert_row", "end_insert_rows", "rc_add_row", "end_rc_add_row", "end_add_row", "end_add_rows"
|
692
|
+
- "row_height_resize"
|
693
|
+
- "column_width_resize"
|
694
|
+
- "cell_select"
|
695
|
+
- "select_all"
|
696
|
+
- "row_select"
|
697
|
+
- "column_select"
|
698
|
+
- "drag_select_cells"
|
699
|
+
- "drag_select_rows"
|
700
|
+
- "drag_select_columns"
|
701
|
+
- "shift_cell_select"
|
702
|
+
- "shift_row_select"
|
703
|
+
- "shift_column_select"
|
704
|
+
- "ctrl_cell_select"
|
705
|
+
- "ctrl_row_select"
|
706
|
+
- "ctrl_column_select"
|
707
|
+
- "deselect"
|
708
|
+
- "all_select_events", "select", "selectevents", "select_events"
|
709
|
+
- "all_modified_events", "sheetmodified", "sheet_modified" "modified_events", "modified"
|
710
|
+
- "bind_all"
|
711
|
+
- "unbind_all"
|
712
|
+
"""
|
622
713
|
# bindings is None, unbind all
|
623
714
|
if bindings is None:
|
624
715
|
bindings = "all"
|
@@ -1842,7 +1933,7 @@ class Sheet(tk.Frame):
|
|
1842
1933
|
or event_data["added"]["rows"]
|
1843
1934
|
):
|
1844
1935
|
if undo is True or (undo is None and span.undo):
|
1845
|
-
self.MT.undo_stack.append(
|
1936
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1846
1937
|
if emit_event is True or (emit_event is None and span.emit_event):
|
1847
1938
|
self.emit_event("<<SheetModified>>", event_data)
|
1848
1939
|
self.set_refresh_timer(redraw)
|
@@ -1882,7 +1973,7 @@ class Sheet(tk.Frame):
|
|
1882
1973
|
event_data = clear_t(r, c, quick_tval(r, c), event_data)
|
1883
1974
|
if event_data["cells"]["table"] or event_data["cells"]["header"] or event_data["cells"]["index"]:
|
1884
1975
|
if undo is True or (undo is None and span.undo):
|
1885
|
-
self.MT.undo_stack.append(
|
1976
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
1886
1977
|
if emit_event is True or (emit_event is None and span.emit_event):
|
1887
1978
|
self.emit_event("<<SheetModified>>", event_data)
|
1888
1979
|
self.set_refresh_timer(redraw)
|
@@ -2051,7 +2142,7 @@ class Sheet(tk.Frame):
|
|
2051
2142
|
push_ops=push_ops,
|
2052
2143
|
)
|
2053
2144
|
if undo:
|
2054
|
-
self.MT.undo_stack.append(
|
2145
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2055
2146
|
if emit_event:
|
2056
2147
|
self.emit_event("<<SheetModified>>", event_data)
|
2057
2148
|
self.set_refresh_timer(redraw)
|
@@ -2146,7 +2237,7 @@ class Sheet(tk.Frame):
|
|
2146
2237
|
push_ops=push_ops,
|
2147
2238
|
)
|
2148
2239
|
if undo:
|
2149
|
-
self.MT.undo_stack.append(
|
2240
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2150
2241
|
if emit_event:
|
2151
2242
|
self.emit_event("<<SheetModified>>", event_data)
|
2152
2243
|
self.set_refresh_timer(redraw)
|
@@ -2222,7 +2313,7 @@ class Sheet(tk.Frame):
|
|
2222
2313
|
event_data,
|
2223
2314
|
)
|
2224
2315
|
if undo:
|
2225
|
-
self.MT.undo_stack.append(
|
2316
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2226
2317
|
if emit_event:
|
2227
2318
|
self.emit_event("<<SheetModified>>", event_data)
|
2228
2319
|
self.set_refresh_timer(redraw)
|
@@ -2264,7 +2355,7 @@ class Sheet(tk.Frame):
|
|
2264
2355
|
event_data,
|
2265
2356
|
)
|
2266
2357
|
if undo:
|
2267
|
-
self.MT.undo_stack.append(
|
2358
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2268
2359
|
if emit_event:
|
2269
2360
|
self.emit_event("<<SheetModified>>", event_data)
|
2270
2361
|
self.set_refresh_timer(redraw)
|
@@ -2361,7 +2452,7 @@ class Sheet(tk.Frame):
|
|
2361
2452
|
data_indexes=data_indexes,
|
2362
2453
|
)
|
2363
2454
|
if undo:
|
2364
|
-
self.MT.undo_stack.append(
|
2455
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2365
2456
|
if emit_event:
|
2366
2457
|
self.emit_event("<<SheetModified>>", event_data)
|
2367
2458
|
self.set_refresh_timer(redraw)
|
@@ -2391,7 +2482,7 @@ class Sheet(tk.Frame):
|
|
2391
2482
|
data_indexes=data_indexes,
|
2392
2483
|
)
|
2393
2484
|
if undo:
|
2394
|
-
self.MT.undo_stack.append(
|
2485
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2395
2486
|
if emit_event:
|
2396
2487
|
self.emit_event("<<SheetModified>>", event_data)
|
2397
2488
|
self.set_refresh_timer(redraw)
|
@@ -2418,7 +2509,7 @@ class Sheet(tk.Frame):
|
|
2418
2509
|
data_indexes=data_indexes,
|
2419
2510
|
)
|
2420
2511
|
if undo:
|
2421
|
-
self.MT.undo_stack.append(
|
2512
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2422
2513
|
if emit_event:
|
2423
2514
|
self.emit_event("<<SheetModified>>", event_data)
|
2424
2515
|
self.set_refresh_timer(redraw)
|
@@ -2445,7 +2536,7 @@ class Sheet(tk.Frame):
|
|
2445
2536
|
data_indexes=data_indexes,
|
2446
2537
|
)
|
2447
2538
|
if undo:
|
2448
|
-
self.MT.undo_stack.append(
|
2539
|
+
self.MT.undo_stack.append(stored_event_dict(event_data))
|
2449
2540
|
if emit_event:
|
2450
2541
|
self.emit_event("<<SheetModified>>", event_data)
|
2451
2542
|
self.set_refresh_timer(redraw)
|
@@ -2564,7 +2655,7 @@ class Sheet(tk.Frame):
|
|
2564
2655
|
edit_data: bool = True,
|
2565
2656
|
set_values: dict[tuple[int, int], object] = {},
|
2566
2657
|
set_value: object = None,
|
2567
|
-
state:
|
2658
|
+
state: Literal["normal", "readonly", "disabled"] = "normal",
|
2568
2659
|
redraw: bool = True,
|
2569
2660
|
selection_function: Callable | None = None,
|
2570
2661
|
modified_function: Callable | None = None,
|
@@ -2675,7 +2766,7 @@ class Sheet(tk.Frame):
|
|
2675
2766
|
*key: CreateSpanTypes,
|
2676
2767
|
edit_data: bool = True,
|
2677
2768
|
checked: bool | None = None,
|
2678
|
-
state:
|
2769
|
+
state: Literal["normal", "disabled"] = "normal",
|
2679
2770
|
redraw: bool = True,
|
2680
2771
|
check_function: Callable | None = None,
|
2681
2772
|
text: str = "",
|
@@ -5477,7 +5568,7 @@ class Sheet(tk.Frame):
|
|
5477
5568
|
def selection_add(self, *items, run_binding: bool = True, redraw: bool = True) -> Sheet:
|
5478
5569
|
to_open = []
|
5479
5570
|
quick_displayed_check = set(self.MT.displayed_rows)
|
5480
|
-
for item in unpack(items):
|
5571
|
+
for item in filter(self.RI.tree.__contains__, unpack(items)):
|
5481
5572
|
if self.RI.tree_rns[item] not in quick_displayed_check and self.RI.tree[item].parent:
|
5482
5573
|
to_open.extend(list(self.RI.get_iid_ancestors(item)))
|
5483
5574
|
if to_open:
|
@@ -5492,7 +5583,7 @@ class Sheet(tk.Frame):
|
|
5492
5583
|
self.MT.displayed_rows,
|
5493
5584
|
self.RI.tree_rns[item],
|
5494
5585
|
)
|
5495
|
-
for item in unpack(items)
|
5586
|
+
for item in filter(self.RI.tree.__contains__, unpack(items))
|
5496
5587
|
)
|
5497
5588
|
):
|
5498
5589
|
self.MT.create_selection_box(
|
@@ -7067,6 +7158,7 @@ class Dropdown(Sheet):
|
|
7067
7158
|
values: list[object] = [],
|
7068
7159
|
close_dropdown_window: Callable | None = None,
|
7069
7160
|
search_function: Callable = dropdown_search_function,
|
7161
|
+
modified_function: None | Callable = None,
|
7070
7162
|
arrowkey_RIGHT: Callable | None = None,
|
7071
7163
|
arrowkey_LEFT: Callable | None = None,
|
7072
7164
|
align: str = "w",
|
@@ -7096,6 +7188,7 @@ class Dropdown(Sheet):
|
|
7096
7188
|
self.parent = parent
|
7097
7189
|
self.close_dropdown_window = close_dropdown_window
|
7098
7190
|
self.search_function = search_function
|
7191
|
+
self.modified_function = modified_function
|
7099
7192
|
self.arrowkey_RIGHT = arrowkey_RIGHT
|
7100
7193
|
self.arrowkey_LEFT = arrowkey_LEFT
|
7101
7194
|
self.single_index = single_index
|
@@ -7122,11 +7215,15 @@ class Dropdown(Sheet):
|
|
7122
7215
|
outline_color: str,
|
7123
7216
|
align: str,
|
7124
7217
|
values: list[object] | None = None,
|
7218
|
+
search_function: Callable = dropdown_search_function,
|
7219
|
+
modified_function: None | Callable = None,
|
7125
7220
|
) -> None:
|
7126
7221
|
self.deselect(redraw=False)
|
7127
7222
|
self.r = r
|
7128
7223
|
self.c = c
|
7129
7224
|
self.row = -1
|
7225
|
+
self.search_function = search_function
|
7226
|
+
self.modified_function = modified_function
|
7130
7227
|
self.height_and_width(height=height, width=width)
|
7131
7228
|
self.table_align(align)
|
7132
7229
|
self.set_options(
|
@@ -7160,13 +7257,14 @@ class Dropdown(Sheet):
|
|
7160
7257
|
self.see(self.row, 0, redraw=False)
|
7161
7258
|
self.select_row(self.row)
|
7162
7259
|
|
7163
|
-
def search_and_see(self, event: object = None) ->
|
7260
|
+
def search_and_see(self, event: object = None) -> str:
|
7164
7261
|
if self.search_function is not None:
|
7165
7262
|
rn = self.search_function(search_for=rf"{event['value']}".lower(), data=self.MT.data)
|
7166
|
-
if rn
|
7263
|
+
if isinstance(rn, int):
|
7167
7264
|
self.row = rn
|
7168
7265
|
self.see(self.row, 0, redraw=False)
|
7169
7266
|
self.select_row(self.row)
|
7267
|
+
return self.MT.data[rn][0]
|
7170
7268
|
|
7171
7269
|
def mouse_motion(self, event: object) -> None:
|
7172
7270
|
row = self.identify_row(event, exclude_index=True, allow_end=False)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: tksheet
|
3
|
-
Version: 7.2.
|
3
|
+
Version: 7.2.22
|
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
|
@@ -46,7 +46,7 @@ License-File: LICENSE.txt
|
|
46
46
|
|
47
47
|
# <div align="center">tksheet - python tkinter table widget</div>
|
48
48
|
|
49
|
-
[](https://pypi.python.org/pypi/tksheet/)  [](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
|
49
|
+
[](https://pypi.python.org/pypi/tksheet/)  [](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
|
50
50
|
|
51
51
|
[](https://github.com/ragardner/tksheet/releases) [](https://pypi.org/project/tksheet/)
|
52
52
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
tksheet/__init__.py,sha256=KfgSwnegxJiSsth7RbsdT2_7OOroneLct14yf_m1uc8,2237
|
2
|
+
tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
|
3
|
+
tksheet/column_headers.py,sha256=PybWCaMxHj0b-M3JOKu44yr9jGfHjxdKaKEGo9ZmwGg,102963
|
4
|
+
tksheet/formatters.py,sha256=_exO2KnjtcnE_MVWLG1ngOZ-wmrXZhuh7uEi2iPs1Tk,10546
|
5
|
+
tksheet/functions.py,sha256=REgBYkogJYxJ4TiNf9i_l_qExfizpWDwxdSxRB-6TbU,42770
|
6
|
+
tksheet/main_table.py,sha256=n6k1sU-lSb_xSHYUl4w13vBcqw1opFAZ9Gimn1jRq8s,334147
|
7
|
+
tksheet/other_classes.py,sha256=MRwF4YJMEZUDTk6xOTBFwR7jT3bMbbNlp4dZSpEdIfU,16406
|
8
|
+
tksheet/row_index.py,sha256=0nIlQY6q8iiWROp3mjBCNrZwoY1NUtG30tjBO_zJMcI,111854
|
9
|
+
tksheet/sheet.py,sha256=jD2fdRHRgWF49f5Pm674BmAaiSZDeEW7tK_xjD-41WA,287546
|
10
|
+
tksheet/sheet_options.py,sha256=XM3XSWWVnAOctP2z2_WkkXonoIT8_brXwJaSO0sFZbE,12788
|
11
|
+
tksheet/text_editor.py,sha256=pf9o3JuRI6cbr7ZoVfaookCBJsmRBgGDubdtShLZXBA,7064
|
12
|
+
tksheet/themes.py,sha256=OhUzZL4JH0YPhb2f1F62CcJFzhVsEvNxF-ObC9zVb44,14474
|
13
|
+
tksheet/top_left_rectangle.py,sha256=ri7hb9CC5l37ynmxceprq11UuWWRpWEI_0AI42wzv0A,8444
|
14
|
+
tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
|
15
|
+
tksheet/vars.py,sha256=86ubZZElsnQuC6Lv6bW2lt2NhD9wAp6PxtkK7ufKqq0,3452
|
16
|
+
tksheet-7.2.22.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
|
17
|
+
tksheet-7.2.22.dist-info/METADATA,sha256=FZI4xYr6n5uq1HbYuac8PR1vq2u_zEm95gPoY9VE4og,6481
|
18
|
+
tksheet-7.2.22.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
19
|
+
tksheet-7.2.22.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
20
|
+
tksheet-7.2.22.dist-info/RECORD,,
|
tksheet-7.2.20.dist-info/RECORD
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
tksheet/__init__.py,sha256=LFB6RLXByzaiFRyaeQYjbIcN5EE9e-vzpjzqMGJi6FA,2237
|
2
|
-
tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
|
3
|
-
tksheet/column_headers.py,sha256=LtWvogLqd76JpkG_Vp2XQKoyxqkDjfcx2w-hzVVWPi8,102187
|
4
|
-
tksheet/formatters.py,sha256=_exO2KnjtcnE_MVWLG1ngOZ-wmrXZhuh7uEi2iPs1Tk,10546
|
5
|
-
tksheet/functions.py,sha256=P7nyiL5Q4nGmWo6CgPz0g2Vn56QclmOkniPDRFUNfTI,42768
|
6
|
-
tksheet/main_table.py,sha256=x-3gKhAB-aZXSSmlu5cy2_FiUkNAQcWB40s3-41xRiU,332289
|
7
|
-
tksheet/other_classes.py,sha256=eB-kDTJjYOe5QcSA25Bg9JS2JimZau2fAvyz8rcBT0Q,15631
|
8
|
-
tksheet/row_index.py,sha256=5biQK0Rv3tq5nI98htOeiyEXYpuhiz_gQIWTYfrAJkM,111174
|
9
|
-
tksheet/sheet.py,sha256=Wd2PjnMh-NQl-8hkEbwLLrmHhLdz1lSJAznyyXRECiM,283226
|
10
|
-
tksheet/sheet_options.py,sha256=XM3XSWWVnAOctP2z2_WkkXonoIT8_brXwJaSO0sFZbE,12788
|
11
|
-
tksheet/text_editor.py,sha256=pf9o3JuRI6cbr7ZoVfaookCBJsmRBgGDubdtShLZXBA,7064
|
12
|
-
tksheet/themes.py,sha256=OhUzZL4JH0YPhb2f1F62CcJFzhVsEvNxF-ObC9zVb44,14474
|
13
|
-
tksheet/top_left_rectangle.py,sha256=ri7hb9CC5l37ynmxceprq11UuWWRpWEI_0AI42wzv0A,8444
|
14
|
-
tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
|
15
|
-
tksheet/vars.py,sha256=86ubZZElsnQuC6Lv6bW2lt2NhD9wAp6PxtkK7ufKqq0,3452
|
16
|
-
tksheet-7.2.20.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
|
17
|
-
tksheet-7.2.20.dist-info/METADATA,sha256=YGaZ0fM_GcLhPCZ_KWkL8JNGdEwYWcGx74ar1MUbJZI,6476
|
18
|
-
tksheet-7.2.20.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
19
|
-
tksheet-7.2.20.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
20
|
-
tksheet-7.2.20.dist-info/RECORD,,
|
File without changes
|
File without changes
|