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/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
- pickled_event_dict,
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(pickled_event_dict(event_data))
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
- c_2: str,
1226
- c_3: str,
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
- if kwargs[0] is not None:
1234
- c_1 = kwargs[0] if kwargs[0].startswith("#") else color_map[kwargs[0]]
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 kwargs[0] is not None:
1241
+ if fill:
1242
1242
  fill = (
1243
- f"#{int((int(c_1[1:3], 16) + int(c_3[1:3], 16)) / 2):02X}"
1244
- + f"{int((int(c_1[3:5], 16) + int(c_3[3:5], 16)) / 2):02X}"
1245
- + f"{int((int(c_1[5:], 16) + int(c_3[5:], 16)) / 2):02X}"
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 kwargs[0] is not None:
1253
+ if fill:
1254
1254
  fill = (
1255
- f"#{int((int(c_1[1:3], 16) + int(c_2[1:3], 16)) / 2):02X}"
1256
- + f"{int((int(c_1[3:5], 16) + int(c_2[3:5], 16)) / 2):02X}"
1257
- + f"{int((int(c_1[5:], 16) + int(c_2[5:], 16)) / 2):02X}"
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
- if kwargs[0] is not None:
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
- c_2 = (
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
- c_3 = (
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
- c_2,
1621
- c_3,
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
- dd_window: object,
2152
- event: dict,
2153
- modified_func: Callable | None,
2149
+ event: tk.Misc,
2154
2150
  ) -> None:
2155
- if modified_func:
2156
- modified_func(event)
2157
- dd_window.search_and_see(event)
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"] == "normal":
2164
- if not self.open_text_editor(event=event, r=r, dropdown=True):
2165
- return
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
- "<<TextModified>>",
2210
- lambda _x: self.dropdown_text_editor_modified(
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(pickled_event_dict(event_data))
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
- pickled_event_dict,
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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(pickled_event_dict(event_data))
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: str = "normal",
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: str = "normal",
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) -> 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 is not None:
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.20
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
- [![PyPI version shields.io](https://img.shields.io/pypi/v/tksheet.svg)](https://pypi.python.org/pypi/tksheet/) ![python](https://img.shields.io/badge/python-3.8|3.9|3.10|3.11|3.12-blue) [![License: MIT](https://img.shields.io/badge/License-MIT%20-blue.svg)](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
49
+ [![PyPI version shields.io](https://img.shields.io/pypi/v/tksheet.svg)](https://pypi.python.org/pypi/tksheet/) ![python](https://img.shields.io/badge/python-3.8|3.9|3.10|3.11|3.12|3.13-blue) [![License: MIT](https://img.shields.io/badge/License-MIT%20-blue.svg)](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
50
50
 
51
51
  [![GitHub Release Date](https://img.shields.io/github/release-date-pre/ragardner/tksheet.svg)](https://github.com/ragardner/tksheet/releases) [![Downloads](https://img.shields.io/pypi/dm/tksheet.svg)](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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.5.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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,,