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 CHANGED
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.2.22"
7
+ __version__ = "7.2.23"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
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.MT.hide_selection_box(self.being_drawn_item)
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
- sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
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": bg,
1794
- "fg": 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.tktext.unbind("<KeyRelease>")
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 | int,
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
- event_data.loc = Loc(*loc)
1422
- event_data.row = loc[0]
1423
- event_data.column = loc[1]
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._row_index[datarn].text = v
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._row_index[datarn] = v
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._headers[datacn] = v
1525
- for (datarn, datacn), v in modification["cells"]["table"].items():
1526
- self.set_cell_data(datarn, datacn, v)
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, v in modification["cells"]["index"].items():
1552
+ for datarn in modification["cells"]["index"]:
1531
1553
  event_data["cells"]["index"][datarn] = self.RI.get_cell_data(datarn)
1532
- for datacn, v in modification["cells"]["header"].items():
1554
+
1555
+ for datacn in modification["cells"]["header"]:
1533
1556
  event_data["cells"]["header"][datacn] = self.CH.get_cell_data(datacn)
1534
- for (datarn, datacn), v in modification["cells"]["table"].items():
1535
- event_data["cells"]["table"][(datarn, datacn)] = self.get_cell_data(datarn, datacn)
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.hide_selection_box(self.being_drawn_item)
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
- sel_event = self.get_select_event(being_drawn_item=self.being_drawn_item)
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": bg,
6732
- "fg": 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.tktext.unbind("<KeyRelease>")
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
- 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
-
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('insert')
508
- line, column = cursor_pos.split('.')
509
- self.window.set_text(value)
510
- self.highlight_from(line, column)
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.MT.hide_selection_box(self.being_drawn_item)
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
- sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
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": bg,
1948
- "fg": 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.tktext.unbind("<KeyRelease>")
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(r, c, width, height, font, ops, outline_color, align, values)
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=ops.popup_menu_fg,
7232
- table_selected_cells_border_fg=ops.popup_menu_fg,
7233
- table_selected_cells_bg=ops.popup_menu_highlight_bg,
7234
- table_selected_rows_border_fg=ops.popup_menu_fg,
7235
- table_selected_rows_bg=ops.popup_menu_highlight_bg,
7236
- table_selected_rows_fg=ops.popup_menu_highlight_fg,
7237
- table_selected_box_cells_fg=ops.popup_menu_highlight_bg,
7238
- table_selected_box_rows_fg=ops.popup_menu_highlight_bg,
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=ops.popup_menu_fg,
7241
- table_bg=ops.popup_menu_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)