tksheet 7.2.22__py3-none-any.whl → 7.2.23__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 +15 -19
- tksheet/functions.py +16 -4
- tksheet/main_table.py +50 -31
- tksheet/other_classes.py +14 -13
- tksheet/row_index.py +15 -20
- tksheet/sheet.py +67 -18
- tksheet/sheet_options.py +1 -72
- tksheet/text_editor.py +11 -0
- tksheet/themes.py +366 -296
- tksheet/vars.py +4 -1
- {tksheet-7.2.22.dist-info → tksheet-7.2.23.dist-info}/METADATA +1 -1
- tksheet-7.2.23.dist-info/RECORD +20 -0
- {tksheet-7.2.22.dist-info → tksheet-7.2.23.dist-info}/WHEEL +1 -1
- tksheet-7.2.22.dist-info/RECORD +0 -20
- {tksheet-7.2.22.dist-info → tksheet-7.2.23.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.2.22.dist-info → tksheet-7.2.23.dist-info}/top_level.txt +0 -0
tksheet/__init__.py
CHANGED
tksheet/column_headers.py
CHANGED
@@ -804,19 +804,17 @@ class ColumnHeaders(tk.Canvas):
|
|
804
804
|
)
|
805
805
|
|
806
806
|
def b1_release(self, event: object) -> None:
|
807
|
+
to_hide = self.being_drawn_item
|
807
808
|
if self.being_drawn_item is not None and (to_sel := self.MT.coords_and_type(self.being_drawn_item)):
|
808
809
|
r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
|
809
|
-
self.
|
810
|
+
self.being_drawn_item = None
|
810
811
|
self.MT.set_currently_selected(
|
811
812
|
r_to_sel,
|
812
813
|
c_to_sel,
|
813
814
|
item=self.MT.create_selection_box(*to_sel, set_current=False),
|
815
|
+
run_binding=False,
|
814
816
|
)
|
815
|
-
|
816
|
-
try_binding(self.drag_selection_binding_func, sel_event)
|
817
|
-
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
818
|
-
else:
|
819
|
-
self.being_drawn_item = None
|
817
|
+
self.MT.hide_selection_box(to_hide)
|
820
818
|
self.MT.bind("<MouseWheel>", self.MT.mousewheel)
|
821
819
|
if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
|
822
820
|
self.drag_width_resize()
|
@@ -1772,7 +1770,6 @@ class ColumnHeaders(tk.Canvas):
|
|
1772
1770
|
h = self.current_height + 1
|
1773
1771
|
if text is None:
|
1774
1772
|
text = self.get_cell_data(self.MT.datacn(c), none_to_empty_str=True, redirect_int=True)
|
1775
|
-
bg, fg = self.PAR.ops.header_bg, self.PAR.ops.header_fg
|
1776
1773
|
kwargs = {
|
1777
1774
|
"menu_kwargs": DotDict(
|
1778
1775
|
{
|
@@ -1790,8 +1787,10 @@ class ColumnHeaders(tk.Canvas):
|
|
1790
1787
|
"width": w,
|
1791
1788
|
"height": h,
|
1792
1789
|
"show_border": True,
|
1793
|
-
"bg":
|
1794
|
-
"fg":
|
1790
|
+
"bg": self.PAR.ops.header_editor_bg,
|
1791
|
+
"fg": self.PAR.ops.header_editor_fg,
|
1792
|
+
"select_bg": self.PAR.ops.header_editor_select_bg,
|
1793
|
+
"select_fg": self.PAR.ops.header_editor_select_fg,
|
1795
1794
|
"align": self.get_cell_align(c),
|
1796
1795
|
"c": c,
|
1797
1796
|
}
|
@@ -2017,19 +2016,13 @@ class ColumnHeaders(tk.Canvas):
|
|
2017
2016
|
selected=self.MT.selected,
|
2018
2017
|
)
|
2019
2018
|
try_binding(self.dropdown.window.modified_function, event_data)
|
2020
|
-
val = self.dropdown.window.search_and_see(event_data)
|
2021
2019
|
# return to tk.Text action if control/command is held down
|
2022
2020
|
# or keysym was not a character
|
2023
2021
|
if (hasattr(event, "state") and event.state & (0x0004 | 0x00000010)) or (
|
2024
|
-
hasattr(event, "keysym") and len(event.keysym) > 2
|
2022
|
+
hasattr(event, "keysym") and len(event.keysym) > 2 and event.keysym != "space"
|
2025
2023
|
):
|
2026
2024
|
return
|
2027
|
-
self.text_editor.
|
2028
|
-
self.text_editor.autocomplete(val)
|
2029
|
-
self.text_editor.tktext.bind(
|
2030
|
-
"<KeyRelease>",
|
2031
|
-
self.dropdown_text_editor_modified,
|
2032
|
-
)
|
2025
|
+
self.text_editor.autocomplete(self.dropdown.window.search_and_see(event_data))
|
2033
2026
|
return "break"
|
2034
2027
|
|
2035
2028
|
def open_dropdown_window(self, c: int, event: object = None) -> None:
|
@@ -2045,6 +2038,10 @@ class ColumnHeaders(tk.Canvas):
|
|
2045
2038
|
reset_kwargs = {
|
2046
2039
|
"r": 0,
|
2047
2040
|
"c": c,
|
2041
|
+
"bg": self.PAR.ops.header_editor_bg,
|
2042
|
+
"fg": self.PAR.ops.header_editor_fg,
|
2043
|
+
"select_bg": self.PAR.ops.header_editor_select_bg,
|
2044
|
+
"select_fg": self.PAR.ops.header_editor_select_fg,
|
2048
2045
|
"width": win_w,
|
2049
2046
|
"height": win_h,
|
2050
2047
|
"font": self.PAR.ops.header_font,
|
@@ -2074,12 +2071,12 @@ class ColumnHeaders(tk.Canvas):
|
|
2074
2071
|
window=self.dropdown.window,
|
2075
2072
|
anchor=anchor,
|
2076
2073
|
)
|
2074
|
+
self.update_idletasks()
|
2077
2075
|
if kwargs["state"] == "normal":
|
2078
2076
|
self.text_editor.tktext.bind(
|
2079
2077
|
"<KeyRelease>",
|
2080
2078
|
self.dropdown_text_editor_modified,
|
2081
2079
|
)
|
2082
|
-
self.update_idletasks()
|
2083
2080
|
try:
|
2084
2081
|
self.after(1, lambda: self.text_editor.tktext.focus())
|
2085
2082
|
self.after(2, self.text_editor.window.scroll_to_bottom())
|
@@ -2087,7 +2084,6 @@ class ColumnHeaders(tk.Canvas):
|
|
2087
2084
|
return
|
2088
2085
|
redraw = False
|
2089
2086
|
else:
|
2090
|
-
self.update_idletasks()
|
2091
2087
|
self.dropdown.window.bind("<FocusOut>", lambda _x: self.close_dropdown_window(c))
|
2092
2088
|
self.dropdown.window.bind("<Escape>", self.close_dropdown_window)
|
2093
2089
|
self.dropdown.window.focus_set()
|
tksheet/functions.py
CHANGED
@@ -1415,12 +1415,24 @@ def mod_span_widget(span: Span, widget: object) -> Span:
|
|
1415
1415
|
def mod_event_val(
|
1416
1416
|
event_data: EventDataDict,
|
1417
1417
|
val: object,
|
1418
|
-
loc: Loc |
|
1418
|
+
loc: Loc | None = None,
|
1419
|
+
row: int | None = None,
|
1420
|
+
column: int | None = None,
|
1419
1421
|
) -> EventDataDict:
|
1420
1422
|
event_data.value = val
|
1421
|
-
|
1422
|
-
|
1423
|
-
|
1423
|
+
if isinstance(loc, tuple):
|
1424
|
+
event_data.loc = Loc(*loc)
|
1425
|
+
event_data.row = loc[0]
|
1426
|
+
event_data.column = loc[1]
|
1427
|
+
|
1428
|
+
elif isinstance(row, int):
|
1429
|
+
event_data.loc = Loc(row=row)
|
1430
|
+
event_data.row = row
|
1431
|
+
|
1432
|
+
elif isinstance(column, int):
|
1433
|
+
event_data.loc = Loc(column=column)
|
1434
|
+
event_data.column = column
|
1435
|
+
|
1424
1436
|
return event_data
|
1425
1437
|
|
1426
1438
|
|
tksheet/main_table.py
CHANGED
@@ -1514,25 +1514,49 @@ class MainTable(tk.Canvas):
|
|
1514
1514
|
self.purge_redo_stack()
|
1515
1515
|
|
1516
1516
|
def edit_cells_using_modification(self, modification: dict, event_data: dict) -> EventDataDict:
|
1517
|
+
# row index
|
1517
1518
|
if self.PAR.ops.treeview:
|
1518
1519
|
for datarn, v in modification["cells"]["index"].items():
|
1519
|
-
self.
|
1520
|
+
if not self.edit_validation_func or (
|
1521
|
+
self.edit_validation_func
|
1522
|
+
and (v := self.edit_validation_func(mod_event_val(event_data, v, row=datarn))) is not None
|
1523
|
+
):
|
1524
|
+
self._row_index[datarn].text = v
|
1520
1525
|
else:
|
1521
1526
|
for datarn, v in modification["cells"]["index"].items():
|
1522
|
-
self.
|
1527
|
+
if not self.edit_validation_func or (
|
1528
|
+
self.edit_validation_func
|
1529
|
+
and (v := self.edit_validation_func(mod_event_val(event_data, v, row=datarn))) is not None
|
1530
|
+
):
|
1531
|
+
self._row_index[datarn] = v
|
1532
|
+
|
1533
|
+
# header
|
1523
1534
|
for datacn, v in modification["cells"]["header"].items():
|
1524
|
-
self.
|
1525
|
-
|
1526
|
-
|
1535
|
+
if not self.edit_validation_func or (
|
1536
|
+
self.edit_validation_func
|
1537
|
+
and (v := self.edit_validation_func(mod_event_val(event_data, v, column=datacn))) is not None
|
1538
|
+
):
|
1539
|
+
self._headers[datacn] = v
|
1540
|
+
|
1541
|
+
# table
|
1542
|
+
for k, v in modification["cells"]["table"].items():
|
1543
|
+
if not self.edit_validation_func or (
|
1544
|
+
self.edit_validation_func
|
1545
|
+
and (v := self.edit_validation_func(mod_event_val(event_data, v, loc=k))) is not None
|
1546
|
+
):
|
1547
|
+
self.set_cell_data(k[0], k[1], v)
|
1548
|
+
|
1527
1549
|
return event_data
|
1528
1550
|
|
1529
1551
|
def save_cells_using_modification(self, modification: EventDataDict, event_data: EventDataDict) -> EventDataDict:
|
1530
|
-
for datarn
|
1552
|
+
for datarn in modification["cells"]["index"]:
|
1531
1553
|
event_data["cells"]["index"][datarn] = self.RI.get_cell_data(datarn)
|
1532
|
-
|
1554
|
+
|
1555
|
+
for datacn in modification["cells"]["header"]:
|
1533
1556
|
event_data["cells"]["header"][datacn] = self.CH.get_cell_data(datacn)
|
1534
|
-
|
1535
|
-
|
1557
|
+
|
1558
|
+
for k in modification["cells"]["table"]:
|
1559
|
+
event_data["cells"]["table"][k] = self.get_cell_data(k[0], k[1])
|
1536
1560
|
return event_data
|
1537
1561
|
|
1538
1562
|
def restore_options_named_spans(self, modification: EventDataDict) -> None:
|
@@ -3167,9 +3191,10 @@ class MainTable(tk.Canvas):
|
|
3167
3191
|
self.b1_motion(event)
|
3168
3192
|
|
3169
3193
|
def b1_release(self, event=None):
|
3194
|
+
to_hide = self.being_drawn_item
|
3170
3195
|
if self.being_drawn_item is not None and (to_sel := self.coords_and_type(self.being_drawn_item)):
|
3171
3196
|
r_to_sel, c_to_sel = self.selected.row, self.selected.column
|
3172
|
-
self.
|
3197
|
+
self.being_drawn_item = None
|
3173
3198
|
self.set_currently_selected(
|
3174
3199
|
r_to_sel,
|
3175
3200
|
c_to_sel,
|
@@ -3182,12 +3207,9 @@ class MainTable(tk.Canvas):
|
|
3182
3207
|
),
|
3183
3208
|
set_current=False,
|
3184
3209
|
),
|
3210
|
+
run_binding=False,
|
3185
3211
|
)
|
3186
|
-
|
3187
|
-
try_binding(self.drag_selection_binding_func, sel_event)
|
3188
|
-
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
3189
|
-
else:
|
3190
|
-
self.being_drawn_item = None
|
3212
|
+
self.hide_selection_box(to_hide)
|
3191
3213
|
if self.RI.width_resizing_enabled and self.RI.rsz_w is not None and self.RI.currently_resizing_width:
|
3192
3214
|
self.delete_resize_lines()
|
3193
3215
|
self.RI.delete_resize_lines()
|
@@ -5679,7 +5701,7 @@ class MainTable(tk.Canvas):
|
|
5679
5701
|
color_tup(self.PAR.ops.table_selected_cells_fg),
|
5680
5702
|
color_tup(self.PAR.ops.table_selected_columns_fg),
|
5681
5703
|
color_tup(self.PAR.ops.table_selected_rows_fg),
|
5682
|
-
|
5704
|
+
)
|
5683
5705
|
else:
|
5684
5706
|
override = tuple()
|
5685
5707
|
|
@@ -6136,7 +6158,7 @@ class MainTable(tk.Canvas):
|
|
6136
6158
|
self.itemconfig(item, state="hidden")
|
6137
6159
|
|
6138
6160
|
def hide_selection_box(self, item: int | None) -> bool:
|
6139
|
-
if item is None or item is True:
|
6161
|
+
if item is None or item is True or item not in self.selection_boxes:
|
6140
6162
|
return
|
6141
6163
|
box = self.selection_boxes.pop(item)
|
6142
6164
|
self.hide_box(box.fill_iid)
|
@@ -6710,7 +6732,6 @@ class MainTable(tk.Canvas):
|
|
6710
6732
|
h = self.row_positions[r + 1] - y + 1
|
6711
6733
|
if text is None:
|
6712
6734
|
text = f"{self.get_cell_data(self.datarn(r), self.datacn(c), none_to_empty_str = True)}"
|
6713
|
-
bg, fg = self.PAR.ops.table_bg, self.PAR.ops.table_fg
|
6714
6735
|
kwargs = {
|
6715
6736
|
"menu_kwargs": DotDict(
|
6716
6737
|
{
|
@@ -6728,8 +6749,10 @@ class MainTable(tk.Canvas):
|
|
6728
6749
|
"width": w,
|
6729
6750
|
"height": h,
|
6730
6751
|
"show_border": True,
|
6731
|
-
"bg":
|
6732
|
-
"fg":
|
6752
|
+
"bg": self.PAR.ops.table_editor_bg,
|
6753
|
+
"fg": self.PAR.ops.table_editor_fg,
|
6754
|
+
"select_bg": self.PAR.ops.table_editor_select_bg,
|
6755
|
+
"select_fg": self.PAR.ops.table_editor_select_fg,
|
6733
6756
|
"align": self.get_cell_align(r, c),
|
6734
6757
|
"r": r,
|
6735
6758
|
"c": c,
|
@@ -7062,22 +7085,15 @@ class MainTable(tk.Canvas):
|
|
7062
7085
|
selected=self.selected,
|
7063
7086
|
)
|
7064
7087
|
try_binding(self.dropdown.window.modified_function, event_data)
|
7065
|
-
val = self.dropdown.window.search_and_see(event_data)
|
7066
7088
|
# return to tk.Text action if control/command is held down
|
7067
7089
|
# or keysym was not a character
|
7068
7090
|
if (hasattr(event, "state") and event.state & (0x0004 | 0x00000010)) or (
|
7069
|
-
hasattr(event, "keysym") and len(event.keysym) > 2
|
7091
|
+
hasattr(event, "keysym") and len(event.keysym) > 2 and event.keysym != "space"
|
7070
7092
|
):
|
7071
7093
|
return
|
7072
|
-
self.text_editor.
|
7073
|
-
self.text_editor.autocomplete(val)
|
7074
|
-
self.text_editor.tktext.bind(
|
7075
|
-
"<KeyRelease>",
|
7076
|
-
self.dropdown_text_editor_modified,
|
7077
|
-
)
|
7094
|
+
self.text_editor.autocomplete(self.dropdown.window.search_and_see(event_data))
|
7078
7095
|
return "break"
|
7079
7096
|
|
7080
|
-
# c is displayed col
|
7081
7097
|
def open_dropdown_window(
|
7082
7098
|
self,
|
7083
7099
|
r: int,
|
@@ -7105,6 +7121,10 @@ class MainTable(tk.Canvas):
|
|
7105
7121
|
reset_kwargs = {
|
7106
7122
|
"r": r,
|
7107
7123
|
"c": c,
|
7124
|
+
"bg": self.PAR.ops.table_editor_bg,
|
7125
|
+
"fg": self.PAR.ops.table_editor_fg,
|
7126
|
+
"select_bg": self.PAR.ops.table_editor_select_bg,
|
7127
|
+
"select_fg": self.PAR.ops.table_editor_select_fg,
|
7108
7128
|
"width": win_w,
|
7109
7129
|
"height": win_h,
|
7110
7130
|
"font": self.PAR.ops.table_font,
|
@@ -7133,12 +7153,12 @@ class MainTable(tk.Canvas):
|
|
7133
7153
|
window=self.dropdown.window,
|
7134
7154
|
anchor=anchor,
|
7135
7155
|
)
|
7156
|
+
self.update_idletasks()
|
7136
7157
|
if kwargs["state"] == "normal":
|
7137
7158
|
self.text_editor.tktext.bind(
|
7138
7159
|
"<KeyRelease>",
|
7139
7160
|
self.dropdown_text_editor_modified,
|
7140
7161
|
)
|
7141
|
-
self.update_idletasks()
|
7142
7162
|
try:
|
7143
7163
|
self.after(1, lambda: self.text_editor.tktext.focus())
|
7144
7164
|
self.after(2, self.text_editor.window.scroll_to_bottom())
|
@@ -7146,7 +7166,6 @@ class MainTable(tk.Canvas):
|
|
7146
7166
|
return
|
7147
7167
|
redraw = False
|
7148
7168
|
else:
|
7149
|
-
self.update_idletasks()
|
7150
7169
|
self.dropdown.window.bind("<FocusOut>", lambda _: self.close_dropdown_window(r, c))
|
7151
7170
|
self.dropdown.window.bind("<Escape>", self.close_dropdown_window)
|
7152
7171
|
self.dropdown.window.focus_set()
|
tksheet/other_classes.py
CHANGED
@@ -5,6 +5,7 @@ from collections import namedtuple
|
|
5
5
|
from collections.abc import Callable, Generator, Hashable, Iterator
|
6
6
|
from functools import partial
|
7
7
|
from typing import Literal
|
8
|
+
import tkinter as tk
|
8
9
|
|
9
10
|
pickle_obj = partial(pickle.dumps, protocol=pickle.HIGHEST_PROTOCOL)
|
10
11
|
|
@@ -18,7 +19,7 @@ Box_t = namedtuple(
|
|
18
19
|
"from_r from_c upto_r upto_c type_",
|
19
20
|
)
|
20
21
|
Box_st = namedtuple("Box_st", "coords type_")
|
21
|
-
Loc = namedtuple("Loc", "row column")
|
22
|
+
Loc = namedtuple("Loc", "row column", defaults=(None, None))
|
22
23
|
|
23
24
|
Highlight = namedtuple(
|
24
25
|
"Highlight",
|
@@ -489,25 +490,25 @@ class TextEditorStorage:
|
|
489
490
|
if self.window:
|
490
491
|
return self.window.get()
|
491
492
|
return ""
|
492
|
-
|
493
|
+
|
493
494
|
def set(self, value: str) -> None:
|
494
495
|
if not self.window:
|
495
496
|
return
|
496
497
|
self.window.set_text(value)
|
497
|
-
|
498
|
-
def highlight_from(self, r: int | str, c: int | str) -> None:
|
499
|
-
|
500
|
-
self.window.tktext.
|
501
|
-
|
502
|
-
|
498
|
+
|
499
|
+
def highlight_from(self, index: tk.Misc, r: int | str, c: int | str) -> None:
|
500
|
+
self.window.tktext.tag_add("sel", index, "end")
|
501
|
+
self.window.tktext.mark_set("insert", f"{r}.{c}")
|
502
|
+
|
503
503
|
def autocomplete(self, value: str | None) -> None:
|
504
504
|
current_val = self.get()
|
505
|
-
if not value or len(current_val) >= len(value) or current_val != value[:len(current_val)]:
|
505
|
+
if not value or len(current_val) >= len(value) or current_val != value[: len(current_val)]:
|
506
506
|
return
|
507
|
-
cursor_pos = self.tktext.index(
|
508
|
-
line, column = cursor_pos.split(
|
509
|
-
self.window.
|
510
|
-
self.
|
507
|
+
cursor_pos = self.tktext.index("insert")
|
508
|
+
line, column = cursor_pos.split(".")
|
509
|
+
index = self.window.tktext.index(f"{line}.{column}")
|
510
|
+
self.tktext.insert(index, value[len(current_val) :])
|
511
|
+
self.highlight_from(index, line, column)
|
511
512
|
|
512
513
|
@property
|
513
514
|
def tktext(self) -> object:
|
tksheet/row_index.py
CHANGED
@@ -808,19 +808,17 @@ class RowIndex(tk.Canvas):
|
|
808
808
|
)
|
809
809
|
|
810
810
|
def b1_release(self, event: object) -> None:
|
811
|
+
to_hide = self.being_drawn_item
|
811
812
|
if self.being_drawn_item is not None and (to_sel := self.MT.coords_and_type(self.being_drawn_item)):
|
812
813
|
r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
|
813
|
-
self.
|
814
|
+
self.being_drawn_item = None
|
814
815
|
self.MT.set_currently_selected(
|
815
816
|
r_to_sel,
|
816
817
|
c_to_sel,
|
817
818
|
item=self.MT.create_selection_box(*to_sel, set_current=False),
|
819
|
+
run_binding=False,
|
818
820
|
)
|
819
|
-
|
820
|
-
try_binding(self.drag_selection_binding_func, sel_event)
|
821
|
-
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
822
|
-
else:
|
823
|
-
self.being_drawn_item = None
|
821
|
+
self.MT.hide_selection_box(to_hide)
|
824
822
|
self.MT.bind("<MouseWheel>", self.MT.mousewheel)
|
825
823
|
if self.height_resizing_enabled and self.rsz_h is not None and self.currently_resizing_height:
|
826
824
|
self.drag_height_resize()
|
@@ -1926,7 +1924,6 @@ class RowIndex(tk.Canvas):
|
|
1926
1924
|
h = self.MT.row_positions[r + 1] - y + 1
|
1927
1925
|
if text is None:
|
1928
1926
|
text = self.get_cell_data(self.MT.datarn(r), none_to_empty_str=True, redirect_int=True)
|
1929
|
-
bg, fg = self.PAR.ops.index_bg, self.PAR.ops.index_fg
|
1930
1927
|
kwargs = {
|
1931
1928
|
"menu_kwargs": DotDict(
|
1932
1929
|
{
|
@@ -1944,8 +1941,10 @@ class RowIndex(tk.Canvas):
|
|
1944
1941
|
"width": w,
|
1945
1942
|
"height": h,
|
1946
1943
|
"show_border": True,
|
1947
|
-
"bg":
|
1948
|
-
"fg":
|
1944
|
+
"bg": self.PAR.ops.index_editor_bg,
|
1945
|
+
"fg": self.PAR.ops.index_editor_fg,
|
1946
|
+
"select_bg": self.PAR.ops.index_editor_select_bg,
|
1947
|
+
"select_fg": self.PAR.ops.index_editor_select_fg,
|
1949
1948
|
"align": self.get_cell_align(r),
|
1950
1949
|
"r": r,
|
1951
1950
|
}
|
@@ -2160,22 +2159,15 @@ class RowIndex(tk.Canvas):
|
|
2160
2159
|
selected=self.MT.selected,
|
2161
2160
|
)
|
2162
2161
|
try_binding(self.dropdown.window.modified_function, event_data)
|
2163
|
-
val = self.dropdown.window.search_and_see(event_data)
|
2164
2162
|
# return to tk.Text action if control/command is held down
|
2165
2163
|
# or keysym was not a character
|
2166
2164
|
if (hasattr(event, "state") and event.state & (0x0004 | 0x00000010)) or (
|
2167
|
-
hasattr(event, "keysym") and len(event.keysym) > 2
|
2165
|
+
hasattr(event, "keysym") and len(event.keysym) > 2 and event.keysym != "space"
|
2168
2166
|
):
|
2169
2167
|
return
|
2170
|
-
self.text_editor.
|
2171
|
-
self.text_editor.autocomplete(val)
|
2172
|
-
self.text_editor.tktext.bind(
|
2173
|
-
"<KeyRelease>",
|
2174
|
-
self.dropdown_text_editor_modified,
|
2175
|
-
)
|
2168
|
+
self.text_editor.autocomplete(self.dropdown.window.search_and_see(event_data))
|
2176
2169
|
return "break"
|
2177
2170
|
|
2178
|
-
# r is displayed row
|
2179
2171
|
def open_dropdown_window(self, r: int, event: object = None) -> None:
|
2180
2172
|
self.hide_text_editor()
|
2181
2173
|
kwargs = self.get_cell_kwargs(self.MT.datarn(r), key="dropdown")
|
@@ -2196,6 +2188,10 @@ class RowIndex(tk.Canvas):
|
|
2196
2188
|
reset_kwargs = {
|
2197
2189
|
"r": r,
|
2198
2190
|
"c": 0,
|
2191
|
+
"bg": self.PAR.ops.index_editor_bg,
|
2192
|
+
"fg": self.PAR.ops.index_editor_fg,
|
2193
|
+
"select_bg": self.PAR.ops.index_editor_select_bg,
|
2194
|
+
"select_fg": self.PAR.ops.index_editor_select_fg,
|
2199
2195
|
"width": win_w,
|
2200
2196
|
"height": win_h,
|
2201
2197
|
"font": self.PAR.ops.index_font,
|
@@ -2225,12 +2221,12 @@ class RowIndex(tk.Canvas):
|
|
2225
2221
|
window=self.dropdown.window,
|
2226
2222
|
anchor=anchor,
|
2227
2223
|
)
|
2224
|
+
self.update_idletasks()
|
2228
2225
|
if kwargs["state"] == "normal":
|
2229
2226
|
self.text_editor.tktext.bind(
|
2230
2227
|
"<KeyRelease>",
|
2231
2228
|
self.dropdown_text_editor_modified,
|
2232
2229
|
)
|
2233
|
-
self.update_idletasks()
|
2234
2230
|
try:
|
2235
2231
|
self.after(1, lambda: self.text_editor.tktext.focus())
|
2236
2232
|
self.after(2, self.text_editor.window.scroll_to_bottom())
|
@@ -2238,7 +2234,6 @@ class RowIndex(tk.Canvas):
|
|
2238
2234
|
return
|
2239
2235
|
redraw = False
|
2240
2236
|
else:
|
2241
|
-
self.update_idletasks()
|
2242
2237
|
self.dropdown.window.bind("<FocusOut>", lambda _x: self.close_dropdown_window(r))
|
2243
2238
|
self.dropdown.window.bind("<Escape>", self.close_dropdown_window)
|
2244
2239
|
self.dropdown.window.focus_set()
|
tksheet/sheet.py
CHANGED
@@ -200,8 +200,8 @@ class Sheet(tk.Frame):
|
|
200
200
|
alternate_color: str = "",
|
201
201
|
# colors
|
202
202
|
outline_thickness: int = 0,
|
203
|
-
outline_color: str = theme_light_blue["outline_color"],
|
204
203
|
theme: str = "light blue",
|
204
|
+
outline_color: str = theme_light_blue["outline_color"],
|
205
205
|
frame_bg: str = theme_light_blue["table_bg"],
|
206
206
|
popup_menu_fg: str = theme_light_blue["popup_menu_fg"],
|
207
207
|
popup_menu_bg: str = theme_light_blue["popup_menu_bg"],
|
@@ -210,6 +210,10 @@ class Sheet(tk.Frame):
|
|
210
210
|
table_grid_fg: str = theme_light_blue["table_grid_fg"],
|
211
211
|
table_bg: str = theme_light_blue["table_bg"],
|
212
212
|
table_fg: str = theme_light_blue["table_fg"],
|
213
|
+
table_editor_bg: str = theme_light_blue["table_editor_bg"],
|
214
|
+
table_editor_fg: str = theme_light_blue["table_editor_fg"],
|
215
|
+
table_editor_select_bg: str = theme_light_blue["table_editor_select_bg"],
|
216
|
+
table_editor_select_fg: str = theme_light_blue["table_editor_select_fg"],
|
213
217
|
table_selected_box_cells_fg: str = theme_light_blue["table_selected_box_cells_fg"],
|
214
218
|
table_selected_box_rows_fg: str = theme_light_blue["table_selected_box_rows_fg"],
|
215
219
|
table_selected_box_columns_fg: str = theme_light_blue["table_selected_box_columns_fg"],
|
@@ -228,6 +232,10 @@ class Sheet(tk.Frame):
|
|
228
232
|
index_border_fg: str = theme_light_blue["index_border_fg"],
|
229
233
|
index_grid_fg: str = theme_light_blue["index_grid_fg"],
|
230
234
|
index_fg: str = theme_light_blue["index_fg"],
|
235
|
+
index_editor_bg: str = theme_light_blue["index_editor_bg"],
|
236
|
+
index_editor_fg: str = theme_light_blue["index_editor_fg"],
|
237
|
+
index_editor_select_bg: str = theme_light_blue["index_editor_select_bg"],
|
238
|
+
index_editor_select_fg: str = theme_light_blue["index_editor_select_fg"],
|
231
239
|
index_selected_cells_bg: str = theme_light_blue["index_selected_cells_bg"],
|
232
240
|
index_selected_cells_fg: str = theme_light_blue["index_selected_cells_fg"],
|
233
241
|
index_selected_rows_bg: str = theme_light_blue["index_selected_rows_bg"],
|
@@ -237,6 +245,10 @@ class Sheet(tk.Frame):
|
|
237
245
|
header_border_fg: str = theme_light_blue["header_border_fg"],
|
238
246
|
header_grid_fg: str = theme_light_blue["header_grid_fg"],
|
239
247
|
header_fg: str = theme_light_blue["header_fg"],
|
248
|
+
header_editor_bg: str = theme_light_blue["header_editor_bg"],
|
249
|
+
header_editor_fg: str = theme_light_blue["header_editor_fg"],
|
250
|
+
header_editor_select_bg: str = theme_light_blue["header_editor_select_bg"],
|
251
|
+
header_editor_select_fg: str = theme_light_blue["header_editor_select_fg"],
|
240
252
|
header_selected_cells_bg: str = theme_light_blue["header_selected_cells_bg"],
|
241
253
|
header_selected_cells_fg: str = theme_light_blue["header_selected_cells_fg"],
|
242
254
|
header_selected_columns_bg: str = theme_light_blue["header_selected_columns_bg"],
|
@@ -259,10 +271,6 @@ class Sheet(tk.Frame):
|
|
259
271
|
horizontal_scroll_troughrelief: str = theme_light_blue["horizontal_scroll_troughrelief"],
|
260
272
|
vertical_scroll_bordercolor: str = theme_light_blue["vertical_scroll_bordercolor"],
|
261
273
|
horizontal_scroll_bordercolor: str = theme_light_blue["horizontal_scroll_bordercolor"],
|
262
|
-
vertical_scroll_borderwidth: int = 1,
|
263
|
-
horizontal_scroll_borderwidth: int = 1,
|
264
|
-
vertical_scroll_gripcount: int = 0,
|
265
|
-
horizontal_scroll_gripcount: int = 0,
|
266
274
|
vertical_scroll_active_bg: str = theme_light_blue["vertical_scroll_active_bg"],
|
267
275
|
horizontal_scroll_active_bg: str = theme_light_blue["horizontal_scroll_active_bg"],
|
268
276
|
vertical_scroll_not_active_bg: str = theme_light_blue["vertical_scroll_not_active_bg"],
|
@@ -275,6 +283,10 @@ class Sheet(tk.Frame):
|
|
275
283
|
horizontal_scroll_not_active_fg: str = theme_light_blue["horizontal_scroll_not_active_fg"],
|
276
284
|
vertical_scroll_pressed_fg: str = theme_light_blue["vertical_scroll_pressed_fg"],
|
277
285
|
horizontal_scroll_pressed_fg: str = theme_light_blue["horizontal_scroll_pressed_fg"],
|
286
|
+
vertical_scroll_borderwidth: int = 1,
|
287
|
+
horizontal_scroll_borderwidth: int = 1,
|
288
|
+
vertical_scroll_gripcount: int = 0,
|
289
|
+
horizontal_scroll_gripcount: int = 0,
|
278
290
|
scrollbar_theme_inheritance: str = "default",
|
279
291
|
scrollbar_show_arrows: bool = True,
|
280
292
|
# changing the arrowsize (width) of the scrollbars
|
@@ -1035,6 +1047,21 @@ class Sheet(tk.Frame):
|
|
1035
1047
|
func: Callable,
|
1036
1048
|
add: str | None = None,
|
1037
1049
|
) -> Sheet:
|
1050
|
+
"""
|
1051
|
+
In addition to normal use, the following special tksheet bindings can be used:
|
1052
|
+
- "<<SheetModified>>"
|
1053
|
+
- "<<SheetRedrawn>>"
|
1054
|
+
- "<<SheetSelect>>"
|
1055
|
+
- "<<Copy>>"
|
1056
|
+
- "<<Cut>>"
|
1057
|
+
- "<<Paste>>"
|
1058
|
+
- "<<Delete>>"
|
1059
|
+
- "<<Undo>>"
|
1060
|
+
- "<<Redo>>"
|
1061
|
+
- "<<SelectAll>>"
|
1062
|
+
|
1063
|
+
Use `add` parameter to bind to multiple functions
|
1064
|
+
"""
|
1038
1065
|
if binding == "<ButtonPress-1>":
|
1039
1066
|
self.MT.extra_b1_press_func = func
|
1040
1067
|
self.CH.extra_b1_press_func = func
|
@@ -7149,6 +7176,10 @@ class Dropdown(Sheet):
|
|
7149
7176
|
parent: tk.Misc,
|
7150
7177
|
r: int,
|
7151
7178
|
c: int,
|
7179
|
+
bg: str,
|
7180
|
+
fg: str,
|
7181
|
+
select_bg: str,
|
7182
|
+
select_fg: str,
|
7152
7183
|
ops: dict,
|
7153
7184
|
outline_color: str,
|
7154
7185
|
width: int | None = None,
|
@@ -7187,8 +7218,6 @@ class Dropdown(Sheet):
|
|
7187
7218
|
)
|
7188
7219
|
self.parent = parent
|
7189
7220
|
self.close_dropdown_window = close_dropdown_window
|
7190
|
-
self.search_function = search_function
|
7191
|
-
self.modified_function = modified_function
|
7192
7221
|
self.arrowkey_RIGHT = arrowkey_RIGHT
|
7193
7222
|
self.arrowkey_LEFT = arrowkey_LEFT
|
7194
7223
|
self.single_index = single_index
|
@@ -7202,12 +7231,32 @@ class Dropdown(Sheet):
|
|
7202
7231
|
self.bind("<Prior>", self.arrowkey_UP)
|
7203
7232
|
self.bind("<Next>", self.arrowkey_DOWN)
|
7204
7233
|
self.bind("<Return>", self.b1)
|
7205
|
-
self.reset(
|
7234
|
+
self.reset(
|
7235
|
+
r=r,
|
7236
|
+
c=c,
|
7237
|
+
bg=bg,
|
7238
|
+
fg=fg,
|
7239
|
+
select_bg=select_bg,
|
7240
|
+
select_fg=select_fg,
|
7241
|
+
width=width,
|
7242
|
+
height=height,
|
7243
|
+
font=font,
|
7244
|
+
ops=ops,
|
7245
|
+
outline_color=outline_color,
|
7246
|
+
align=align,
|
7247
|
+
values=values,
|
7248
|
+
search_function=search_function,
|
7249
|
+
modified_function=modified_function,
|
7250
|
+
)
|
7206
7251
|
|
7207
7252
|
def reset(
|
7208
7253
|
self,
|
7209
7254
|
r: int,
|
7210
7255
|
c: int,
|
7256
|
+
bg: str,
|
7257
|
+
fg: str,
|
7258
|
+
select_bg: str,
|
7259
|
+
select_fg: str,
|
7211
7260
|
width: int,
|
7212
7261
|
height: int,
|
7213
7262
|
font: tuple[str, int, str],
|
@@ -7228,17 +7277,17 @@ class Dropdown(Sheet):
|
|
7228
7277
|
self.table_align(align)
|
7229
7278
|
self.set_options(
|
7230
7279
|
outline_color=outline_color,
|
7231
|
-
table_grid_fg=
|
7232
|
-
table_selected_cells_border_fg=
|
7233
|
-
table_selected_cells_bg=
|
7234
|
-
table_selected_rows_border_fg=
|
7235
|
-
table_selected_rows_bg=
|
7236
|
-
table_selected_rows_fg=
|
7237
|
-
table_selected_box_cells_fg=
|
7238
|
-
table_selected_box_rows_fg=
|
7280
|
+
table_grid_fg=fg,
|
7281
|
+
table_selected_cells_border_fg=fg,
|
7282
|
+
table_selected_cells_bg=select_bg,
|
7283
|
+
table_selected_rows_border_fg=fg,
|
7284
|
+
table_selected_rows_bg=select_bg,
|
7285
|
+
table_selected_rows_fg=select_fg,
|
7286
|
+
table_selected_box_cells_fg=select_bg,
|
7287
|
+
table_selected_box_rows_fg=select_bg,
|
7239
7288
|
font=font,
|
7240
|
-
table_fg=
|
7241
|
-
table_bg=
|
7289
|
+
table_fg=fg,
|
7290
|
+
table_bg=bg,
|
7242
7291
|
**{k: ops[k] for k in scrollbar_options_keys},
|
7243
7292
|
)
|
7244
7293
|
self.values(values, width=width - self.yscroll.winfo_width() - 4)
|