tksheet 7.1.2__py3-none-any.whl → 7.1.4__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.1.2"
7
+ __version__ = "7.1.4"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
tksheet/column_headers.py CHANGED
@@ -197,8 +197,7 @@ class ColumnHeaders(tk.Canvas):
197
197
  self.toggle_select_col(c, redraw=True)
198
198
  if self.MT.rc_popup_menus_enabled:
199
199
  popup_menu = self.ch_rc_popup_menu
200
- if self.extra_rc_func is not None:
201
- self.extra_rc_func(event)
200
+ try_binding(self.extra_rc_func, event)
202
201
  if popup_menu is not None:
203
202
  self.popup_menu_loc = c
204
203
  popup_menu.tk_popup(event.x_root, event.y_root)
@@ -218,10 +217,9 @@ class ColumnHeaders(tk.Canvas):
218
217
  self.being_drawn_item = True
219
218
  self.being_drawn_item = self.add_selection(c, set_as_current=True, run_binding_func=False)
220
219
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
221
- if self.ctrl_selection_binding_func is not None:
222
- self.ctrl_selection_binding_func(
223
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
224
- )
220
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
221
+ try_binding(self.ctrl_selection_binding_func, sel_event)
222
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
225
223
  elif c_selected:
226
224
  self.MT.deselect(c=c)
227
225
  elif not self.MT.ctrl_select_enabled:
@@ -252,10 +250,9 @@ class ColumnHeaders(tk.Canvas):
252
250
  set_as_current=True,
253
251
  )
254
252
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
255
- if self.ctrl_selection_binding_func is not None:
256
- self.ctrl_selection_binding_func(
257
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
258
- )
253
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
254
+ try_binding(self.ctrl_selection_binding_func, sel_event)
255
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
259
256
  elif c_selected:
260
257
  self.dragged_col = DraggedRowColumn(
261
258
  dragged=c,
@@ -275,15 +272,14 @@ class ColumnHeaders(tk.Canvas):
275
272
  if self.MT.selected and self.MT.selected.type_ == "columns":
276
273
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
277
274
  self.MT.deselect("all", redraw=False)
278
- self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(c, c_to_sel))
275
+ self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(c, c_to_sel), "columns")
279
276
  self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
280
277
  else:
281
278
  self.being_drawn_item = self.select_col(c, run_binding_func=False)
282
279
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
283
- if self.shift_selection_binding_func is not None:
284
- self.shift_selection_binding_func(
285
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
286
- )
280
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
281
+ try_binding(self.shift_selection_binding_func, sel_event)
282
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
287
283
  elif c_selected:
288
284
  self.dragged_col = DraggedRowColumn(
289
285
  dragged=c,
@@ -371,8 +367,7 @@ class ColumnHeaders(tk.Canvas):
371
367
  self.MT.current_cursor = "hand2"
372
368
  if not mouse_over_resize and not mouse_over_selected:
373
369
  self.MT.reset_mouse_motion_creations()
374
- if self.extra_motion_func is not None:
375
- self.extra_motion_func(event)
370
+ try_binding(self.extra_motion_func, event)
376
371
 
377
372
  def double_b1(self, event: object):
378
373
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
@@ -412,8 +407,7 @@ class ColumnHeaders(tk.Canvas):
412
407
  self.open_cell(event)
413
408
  self.rsz_w = None
414
409
  self.mouse_motion(event)
415
- if self.extra_double_b1_func is not None:
416
- self.extra_double_b1_func(event)
410
+ try_binding(self.extra_double_b1_func, event)
417
411
 
418
412
  def b1_press(self, event: object):
419
413
  self.MT.unbind("<MouseWheel>")
@@ -478,8 +472,7 @@ class ColumnHeaders(tk.Canvas):
478
472
  self.being_drawn_item = self.select_col(c, redraw=True)
479
473
  elif self.MT.toggle_selection_enabled:
480
474
  self.toggle_select_col(c, redraw=True)
481
- if self.extra_b1_press_func is not None:
482
- self.extra_b1_press_func(event)
475
+ try_binding(self.extra_b1_press_func, event)
483
476
 
484
477
  def b1_motion(self, event: object):
485
478
  x1, y1, x2, y2 = self.MT.get_canvas_visible_area()
@@ -570,16 +563,14 @@ class ColumnHeaders(tk.Canvas):
570
563
  else:
571
564
  self.being_drawn_item = self.select_col(self.MT.selected.column, run_binding_func=False)
572
565
  need_redraw = True
573
- if self.drag_selection_binding_func is not None:
574
- self.drag_selection_binding_func(
575
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
576
- )
566
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
567
+ try_binding(self.drag_selection_binding_func, sel_event)
568
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
577
569
  if self.scroll_if_event_offscreen(event):
578
570
  need_redraw = True
579
571
  if need_redraw:
580
572
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
581
- if self.extra_b1_motion_func is not None:
582
- self.extra_b1_motion_func(event)
573
+ try_binding(self.extra_b1_motion_func, event)
583
574
 
584
575
  def get_b1_motion_box(self, start_col, end_col):
585
576
  if end_col >= start_col:
@@ -631,10 +622,9 @@ class ColumnHeaders(tk.Canvas):
631
622
  self.MT.hide_selection_box(self.MT.selected.fill_iid)
632
623
  self.being_drawn_item = self.add_selection(box[1], run_binding_func=False)
633
624
  need_redraw = True
634
- if self.drag_selection_binding_func is not None:
635
- self.drag_selection_binding_func(
636
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
637
- )
625
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
626
+ try_binding(self.drag_selection_binding_func, sel_event)
627
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
638
628
  if self.scroll_if_event_offscreen(event):
639
629
  need_redraw = True
640
630
  if need_redraw:
@@ -770,10 +760,9 @@ class ColumnHeaders(tk.Canvas):
770
760
  c_to_sel,
771
761
  item=self.MT.create_selection_box(*to_sel, set_current=False),
772
762
  )
773
- if self.drag_selection_binding_func is not None:
774
- self.drag_selection_binding_func(
775
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
776
- )
763
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
764
+ try_binding(self.drag_selection_binding_func, sel_event)
765
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
777
766
  self.MT.bind("<MouseWheel>", self.MT.mousewheel)
778
767
  if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
779
768
  self.currently_resizing_width = False
@@ -879,8 +868,7 @@ class ColumnHeaders(tk.Canvas):
879
868
  self.rsz_w = None
880
869
  self.rsz_h = None
881
870
  self.mouse_motion(event)
882
- if self.extra_b1_release_func is not None:
883
- self.extra_b1_release_func(event)
871
+ try_binding(self.extra_b1_release_func, event)
884
872
 
885
873
  def toggle_select_col(
886
874
  self,
@@ -1646,7 +1634,7 @@ class ColumnHeaders(tk.Canvas):
1646
1634
  text = event.char
1647
1635
  else:
1648
1636
  return False
1649
- if self.extra_begin_edit_cell_func is not None:
1637
+ if self.extra_begin_edit_cell_func:
1650
1638
  try:
1651
1639
  text = self.extra_begin_edit_cell_func(
1652
1640
  event_dict(
tksheet/functions.py CHANGED
@@ -628,6 +628,7 @@ def span_dict(
628
628
  ndim: int | None = None,
629
629
  convert: Callable | None = None,
630
630
  undo: bool = False,
631
+ emit_event: bool = False,
631
632
  widget: object = None,
632
633
  ) -> Span:
633
634
  d: Span = Span(
@@ -648,6 +649,7 @@ def span_dict(
648
649
  ndim=ndim,
649
650
  convert=convert,
650
651
  undo=undo,
652
+ emit_event=emit_event,
651
653
  widget=widget,
652
654
  )
653
655
  return d
tksheet/main_table.py CHANGED
@@ -75,6 +75,7 @@ from .functions import (
75
75
  )
76
76
  from .other_classes import (
77
77
  Box_nt,
78
+ Box_st,
78
79
  Box_t,
79
80
  DotDict,
80
81
  DropdownStorage,
@@ -1908,11 +1909,11 @@ class MainTable(tk.Canvas):
1908
1909
  def page_UP(self, event=None):
1909
1910
  height = self.winfo_height()
1910
1911
  top = self.canvasy(0)
1911
- scrollto = top - height
1912
- if scrollto < 0:
1913
- scrollto = 0
1912
+ scrollto_y = top - height
1913
+ if scrollto_y < 0:
1914
+ scrollto_y = 0
1914
1915
  if self.PAR.ops.page_up_down_select_row:
1915
- r = bisect_left(self.row_positions, scrollto)
1916
+ r = bisect_left(self.row_positions, scrollto_y)
1916
1917
  if self.selected and self.selected.row == r:
1917
1918
  r -= 1
1918
1919
  if r < 0:
@@ -1925,11 +1926,11 @@ class MainTable(tk.Canvas):
1925
1926
  elif (self.single_selection_enabled or self.toggle_selection_enabled) and self.anything_selected(
1926
1927
  exclude_columns=True, exclude_rows=True
1927
1928
  ):
1928
- box = self.get_all_selection_boxes_with_types()[0][0]
1929
- self.see(r, box[1], keep_xscroll=True, check_cell_visibility=False)
1930
- self.select_cell(r, box[1])
1929
+ c = next(reversed(self.selection_boxes.values())).coords.from_c
1930
+ self.see(r, c, keep_xscroll=True, check_cell_visibility=False)
1931
+ self.select_cell(r, c)
1931
1932
  else:
1932
- args = ("moveto", scrollto / (self.row_positions[-1] + 100))
1933
+ args = ("moveto", scrollto_y / (self.row_positions[-1] + 100))
1933
1934
  self.yview(*args)
1934
1935
  self.RI.yview(*args)
1935
1936
  self.main_table_redraw_grid_and_text(redraw_row_index=True)
@@ -1952,9 +1953,9 @@ class MainTable(tk.Canvas):
1952
1953
  elif (self.single_selection_enabled or self.toggle_selection_enabled) and self.anything_selected(
1953
1954
  exclude_columns=True, exclude_rows=True
1954
1955
  ):
1955
- box = self.get_all_selection_boxes_with_types()[0][0]
1956
- self.see(r, box[1], keep_xscroll=True, check_cell_visibility=False)
1957
- self.select_cell(r, box[1])
1956
+ c = next(reversed(self.selection_boxes.values())).coords.from_c
1957
+ self.see(r, c, keep_xscroll=True, check_cell_visibility=False)
1958
+ self.select_cell(r, c)
1958
1959
  else:
1959
1960
  end = self.row_positions[-1]
1960
1961
  if scrollto > end + 100:
@@ -2699,42 +2700,22 @@ class MainTable(tk.Canvas):
2699
2700
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
2700
2701
  self.focus_set()
2701
2702
  popup_menu = None
2702
- if self.single_selection_enabled and self.not_currently_resizing():
2703
+ if (self.single_selection_enabled or self.toggle_selection_enabled) and self.not_currently_resizing():
2703
2704
  r = self.identify_row(y=event.y)
2704
2705
  c = self.identify_col(x=event.x)
2705
2706
  if r < len(self.row_positions) - 1 and c < len(self.col_positions) - 1:
2706
- if self.col_selected(c):
2707
- if self.rc_popup_menus_enabled:
2708
- popup_menu = self.CH.ch_rc_popup_menu
2709
- elif self.row_selected(r):
2710
- if self.rc_popup_menus_enabled:
2711
- popup_menu = self.RI.ri_rc_popup_menu
2712
- elif self.cell_selected(r, c):
2713
- if self.rc_popup_menus_enabled:
2714
- popup_menu = self.rc_popup_menu
2707
+ if self.col_selected(c) and self.rc_popup_menus_enabled:
2708
+ popup_menu = self.CH.ch_rc_popup_menu
2709
+ elif self.row_selected(r) and self.rc_popup_menus_enabled:
2710
+ popup_menu = self.RI.ri_rc_popup_menu
2711
+ elif self.cell_selected(r, c) and self.rc_popup_menus_enabled:
2712
+ popup_menu = self.rc_popup_menu
2715
2713
  else:
2716
2714
  if self.rc_select_enabled:
2717
- self.select_cell(r, c, redraw=True)
2718
- if self.rc_popup_menus_enabled:
2719
- popup_menu = self.rc_popup_menu
2720
- else:
2721
- popup_menu = self.empty_rc_popup_menu
2722
- elif self.toggle_selection_enabled and self.not_currently_resizing():
2723
- r = self.identify_row(y=event.y)
2724
- c = self.identify_col(x=event.x)
2725
- if r < len(self.row_positions) - 1 and c < len(self.col_positions) - 1:
2726
- if self.col_selected(c):
2727
- if self.rc_popup_menus_enabled:
2728
- popup_menu = self.CH.ch_rc_popup_menu
2729
- elif self.row_selected(r):
2730
- if self.rc_popup_menus_enabled:
2731
- popup_menu = self.RI.ri_rc_popup_menu
2732
- elif self.cell_selected(r, c):
2733
- if self.rc_popup_menus_enabled:
2734
- popup_menu = self.rc_popup_menu
2735
- else:
2736
- if self.rc_select_enabled:
2737
- self.toggle_select_cell(r, c, redraw=True)
2715
+ if self.single_selection_enabled:
2716
+ self.select_cell(r, c, redraw=True)
2717
+ elif self.toggle_selection_enabled:
2718
+ self.toggle_select_cell(r, c, redraw=True)
2738
2719
  if self.rc_popup_menus_enabled:
2739
2720
  popup_menu = self.rc_popup_menu
2740
2721
  else:
@@ -5603,6 +5584,9 @@ class MainTable(tk.Canvas):
5603
5584
  columns: bool = True,
5604
5585
  reverse: bool = False,
5605
5586
  ) -> Generator[int]:
5587
+ """
5588
+ Most recent selection box should be last
5589
+ """
5606
5590
  itr = reversed(self.selection_boxes.items()) if reverse else self.selection_boxes.items()
5607
5591
  return tuple(
5608
5592
  (iid, box)
@@ -5610,7 +5594,7 @@ class MainTable(tk.Canvas):
5610
5594
  if cells and box.type_ == "cells" or rows and box.type_ == "rows" or columns and box.type_ == "columns"
5611
5595
  )
5612
5596
 
5613
- def get_boxes(self) -> dict:
5597
+ def get_boxes(self) -> dict[Box_nt, Literal["cells", "rows", "columns"]]:
5614
5598
  return {box.coords: box.type_ for box in self.selection_boxes.values()}
5615
5599
 
5616
5600
  def reselect_from_get_boxes(
@@ -6236,7 +6220,7 @@ class MainTable(tk.Canvas):
6236
6220
  return tuple(box.coords for item, box in self.get_selection_items())
6237
6221
 
6238
6222
  def get_all_selection_boxes_with_types(self) -> list[tuple[tuple[int, int, int, int], str]]:
6239
- return [(box.coords, box.type) for item, box in self.get_selection_items()]
6223
+ return [Box_st(box.coords, box.type_) for item, box in self.get_selection_items()]
6240
6224
 
6241
6225
  def all_selected(self) -> bool:
6242
6226
  return any(
@@ -6263,20 +6247,20 @@ class MainTable(tk.Canvas):
6263
6247
  )
6264
6248
  )
6265
6249
 
6266
- def col_selected(self, c: int) -> bool:
6250
+ def col_selected(self, c: int, cells: bool = False) -> bool:
6267
6251
  return isinstance(c, int) and any(
6268
6252
  box.coords.from_c <= c and box.coords.upto_c > c
6269
6253
  for item, box in self.get_selection_items(
6270
- cells=False,
6254
+ cells=cells,
6271
6255
  rows=False,
6272
6256
  )
6273
6257
  )
6274
6258
 
6275
- def row_selected(self, r: int) -> bool:
6259
+ def row_selected(self, r: int, cells: bool = False) -> bool:
6276
6260
  return isinstance(r, int) and any(
6277
6261
  box.coords.from_r <= r and box.coords.upto_r > r
6278
6262
  for item, box in self.get_selection_items(
6279
- cells=False,
6263
+ cells=cells,
6280
6264
  columns=False,
6281
6265
  )
6282
6266
  )
tksheet/other_classes.py CHANGED
@@ -17,6 +17,10 @@ Box_t = namedtuple(
17
17
  "Box_t",
18
18
  "from_r from_c upto_r upto_c type_",
19
19
  )
20
+ Box_st = namedtuple(
21
+ "Box_st",
22
+ "coords type_"
23
+ )
20
24
 
21
25
  Highlight = namedtuple(
22
26
  "Highlight",
tksheet/row_index.py CHANGED
@@ -191,8 +191,7 @@ class RowIndex(tk.Canvas):
191
191
  self.toggle_select_row(r, redraw=True)
192
192
  if self.MT.rc_popup_menus_enabled:
193
193
  popup_menu = self.ri_rc_popup_menu
194
- if self.extra_rc_func is not None:
195
- self.extra_rc_func(event)
194
+ try_binding(self.extra_rc_func, event)
196
195
  if popup_menu is not None:
197
196
  self.popup_menu_loc = r
198
197
  popup_menu.tk_popup(event.x_root, event.y_root)
@@ -212,10 +211,9 @@ class RowIndex(tk.Canvas):
212
211
  self.being_drawn_item = True
213
212
  self.being_drawn_item = self.add_selection(r, set_as_current=True, run_binding_func=False)
214
213
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
215
- if self.ctrl_selection_binding_func is not None:
216
- self.ctrl_selection_binding_func(
217
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
218
- )
214
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
215
+ try_binding(self.ctrl_selection_binding_func, sel_event)
216
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
219
217
  elif r_selected:
220
218
  self.MT.deselect(r=r)
221
219
  elif not self.MT.ctrl_select_enabled:
@@ -246,10 +244,9 @@ class RowIndex(tk.Canvas):
246
244
  set_as_current=True,
247
245
  )
248
246
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
249
- if self.ctrl_selection_binding_func is not None:
250
- self.ctrl_selection_binding_func(
251
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
252
- )
247
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
248
+ try_binding(self.ctrl_selection_binding_func, sel_event)
249
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
253
250
  elif r_selected:
254
251
  self.dragged_row = DraggedRowColumn(
255
252
  dragged=r,
@@ -269,15 +266,14 @@ class RowIndex(tk.Canvas):
269
266
  if self.MT.selected and self.MT.selected.type_ == "rows":
270
267
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
271
268
  self.MT.deselect("all", redraw=False)
272
- self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(r, r_to_sel))
269
+ self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(r, r_to_sel), "rows")
273
270
  self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
274
271
  else:
275
272
  self.being_drawn_item = self.select_row(r, run_binding_func=False)
276
273
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
277
- if self.shift_selection_binding_func is not None:
278
- self.shift_selection_binding_func(
279
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
280
- )
274
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
275
+ try_binding(self.shift_selection_binding_func, sel_event)
276
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
281
277
  elif r_selected:
282
278
  self.dragged_row = DraggedRowColumn(
283
279
  dragged=r,
@@ -365,8 +361,7 @@ class RowIndex(tk.Canvas):
365
361
  self.MT.current_cursor = "hand2"
366
362
  if not mouse_over_resize and not mouse_over_selected:
367
363
  self.MT.reset_mouse_motion_creations()
368
- if self.extra_motion_func is not None:
369
- self.extra_motion_func(event)
364
+ try_binding(self.extra_motion_func, event)
370
365
 
371
366
  def double_b1(self, event: object):
372
367
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
@@ -410,8 +405,7 @@ class RowIndex(tk.Canvas):
410
405
  self.PAR.item(iid, open_=iid not in self.tree_open_ids)
411
406
  self.rsz_h = None
412
407
  self.mouse_motion(event)
413
- if self.extra_double_b1_func is not None:
414
- self.extra_double_b1_func(event)
408
+ try_binding(self.extra_double_b1_func, event)
415
409
 
416
410
  def b1_press(self, event: object):
417
411
  self.MT.unbind("<MouseWheel>")
@@ -484,8 +478,7 @@ class RowIndex(tk.Canvas):
484
478
  self.being_drawn_item = self.select_row(r, redraw=True)
485
479
  elif self.MT.toggle_selection_enabled:
486
480
  self.toggle_select_row(r, redraw=True)
487
- if self.extra_b1_press_func is not None:
488
- self.extra_b1_press_func(event)
481
+ try_binding(self.extra_b1_press_func, event)
489
482
 
490
483
  def b1_motion(self, event: object):
491
484
  x1, y1, x2, y2 = self.MT.get_canvas_visible_area()
@@ -576,16 +569,14 @@ class RowIndex(tk.Canvas):
576
569
  else:
577
570
  self.being_drawn_item = self.select_row(self.MT.selected.row, run_binding_func=False)
578
571
  need_redraw = True
579
- if self.drag_selection_binding_func is not None:
580
- self.drag_selection_binding_func(
581
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
582
- )
572
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
573
+ try_binding(self.drag_selection_binding_func, sel_event)
574
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
583
575
  if self.scroll_if_event_offscreen(event):
584
576
  need_redraw = True
585
577
  if need_redraw:
586
578
  self.MT.main_table_redraw_grid_and_text(redraw_header=False, redraw_row_index=True)
587
- if self.extra_b1_motion_func is not None:
588
- self.extra_b1_motion_func(event)
579
+ try_binding(self.extra_b1_motion_func, event)
589
580
 
590
581
  def get_b1_motion_box(self, start_row, end_row):
591
582
  if end_row >= start_row:
@@ -637,10 +628,9 @@ class RowIndex(tk.Canvas):
637
628
  self.MT.hide_selection_box(self.MT.selected.fill_iid)
638
629
  self.being_drawn_item = self.add_selection(box[0], run_binding_func=False)
639
630
  need_redraw = True
640
- if self.drag_selection_binding_func is not None:
641
- self.drag_selection_binding_func(
642
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
643
- )
631
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
632
+ try_binding(self.drag_selection_binding_func, sel_event)
633
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
644
634
  if self.scroll_if_event_offscreen(event):
645
635
  need_redraw = True
646
636
  if need_redraw:
@@ -775,10 +765,9 @@ class RowIndex(tk.Canvas):
775
765
  c_to_sel,
776
766
  item=self.MT.create_selection_box(*to_sel, set_current=False),
777
767
  )
778
- if self.drag_selection_binding_func is not None:
779
- self.drag_selection_binding_func(
780
- self.MT.get_select_event(being_drawn_item=self.being_drawn_item),
781
- )
768
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
769
+ try_binding(self.drag_selection_binding_func, sel_event)
770
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
782
771
  self.MT.bind("<MouseWheel>", self.MT.mousewheel)
783
772
  if self.height_resizing_enabled and self.rsz_h is not None and self.currently_resizing_height:
784
773
  self.currently_resizing_height = False
@@ -886,8 +875,7 @@ class RowIndex(tk.Canvas):
886
875
  self.rsz_w = None
887
876
  self.rsz_h = None
888
877
  self.mouse_motion(event)
889
- if self.extra_b1_release_func is not None:
890
- self.extra_b1_release_func(event)
878
+ try_binding(self.extra_b1_release_func, event)
891
879
 
892
880
  def event_over_tree_arrow(
893
881
  self,
@@ -1738,7 +1726,7 @@ class RowIndex(tk.Canvas):
1738
1726
  text = event.char
1739
1727
  else:
1740
1728
  return False
1741
- if self.extra_begin_edit_cell_func is not None:
1729
+ if self.extra_begin_edit_cell_func:
1742
1730
  try:
1743
1731
  text = self.extra_begin_edit_cell_func(
1744
1732
  event_dict(
tksheet/sheet.py CHANGED
@@ -2967,14 +2967,24 @@ class Sheet(tk.Frame):
2967
2967
  def get_all_selection_boxes_with_types(self) -> list[tuple[tuple[int, int, int, int], str]]:
2968
2968
  return self.MT.get_all_selection_boxes_with_types()
2969
2969
 
2970
- def cell_selected(self, r: int, c: int) -> bool:
2971
- return self.MT.cell_selected(r, c)
2970
+ @property
2971
+ def boxes(self) -> list[tuple[tuple[int, int, int, int], str]]:
2972
+ return self.MT.get_all_selection_boxes_with_types()
2973
+
2974
+ def cell_selected(
2975
+ self,
2976
+ r: int,
2977
+ c: int,
2978
+ rows: bool = False,
2979
+ columns: bool = False,
2980
+ ) -> bool:
2981
+ return self.MT.cell_selected(r, c, inc_cols=columns, inc_rows=rows)
2972
2982
 
2973
- def row_selected(self, r: int) -> bool:
2974
- return self.MT.row_selected(r)
2983
+ def row_selected(self, r: int, cells: bool = False) -> bool:
2984
+ return self.MT.row_selected(r, cells=cells)
2975
2985
 
2976
- def column_selected(self, c: int) -> bool:
2977
- return self.MT.col_selected(c)
2986
+ def column_selected(self, c: int, cells: bool = False) -> bool:
2987
+ return self.MT.col_selected(c, cells=cells)
2978
2988
 
2979
2989
  def anything_selected(
2980
2990
  self,
@@ -3603,6 +3613,7 @@ class Sheet(tk.Frame):
3603
3613
  return c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
3604
3614
 
3605
3615
  data_c = displayed_column_to_data
3616
+ dcol = displayed_column_to_data
3606
3617
 
3607
3618
  def display_columns(
3608
3619
  self,
@@ -3710,6 +3721,7 @@ class Sheet(tk.Frame):
3710
3721
  return r if self.MT.all_rows_displayed else self.MT.displayed_rows[r]
3711
3722
 
3712
3723
  data_r = displayed_row_to_data
3724
+ drow = displayed_row_to_data
3713
3725
 
3714
3726
  def display_rows(
3715
3727
  self,
@@ -4104,6 +4116,25 @@ class Sheet(tk.Frame):
4104
4116
  )
4105
4117
  return self
4106
4118
 
4119
+ def event_widget_is_sheet(
4120
+ self,
4121
+ event: object,
4122
+ table: bool = True,
4123
+ index: bool = True,
4124
+ header: bool = True,
4125
+ top_left: bool = True,
4126
+ ) -> bool:
4127
+ return (
4128
+ table
4129
+ and event.widget == self.MT
4130
+ or index
4131
+ and event.widget == self.RI
4132
+ or header
4133
+ and event.widget == self.CH
4134
+ or top_left
4135
+ and event.widget == self.TL
4136
+ )
4137
+
4107
4138
  def get_cell_options(
4108
4139
  self,
4109
4140
  key: None | str = None,
@@ -4420,7 +4451,8 @@ class Sheet(tk.Frame):
4420
4451
  redraw=False,
4421
4452
  deselect_all=True,
4422
4453
  )
4423
- self.tree_open(*open_ids)
4454
+ if open_ids:
4455
+ self.tree_open(*open_ids)
4424
4456
  return self
4425
4457
 
4426
4458
  def tree_open(self, *items) -> Sheet:
@@ -4428,7 +4460,7 @@ class Sheet(tk.Frame):
4428
4460
  If used without args all items are opened
4429
4461
  """
4430
4462
  if items:
4431
- for item in items:
4463
+ for item in unpack(items):
4432
4464
  self.item(item, open_=True)
4433
4465
  else:
4434
4466
  for item in self.get_children():
@@ -4440,7 +4472,7 @@ class Sheet(tk.Frame):
4440
4472
  If used without args all items are closed
4441
4473
  """
4442
4474
  if items:
4443
- for item in items:
4475
+ for item in unpack(items):
4444
4476
  self.item(item, open_=False)
4445
4477
  else:
4446
4478
  for item in self.get_children():
@@ -4525,8 +4557,6 @@ class Sheet(tk.Frame):
4525
4557
  if not (item := item.lower()) or item not in self.RI.tree:
4526
4558
  raise ValueError(f"Item '{item}' does not exist.")
4527
4559
  if isinstance(iid, str):
4528
- if not (iid := iid.lower()):
4529
- raise ValueError(f"iid '{iid}' does not exist.")
4530
4560
  if iid in self.RI.tree:
4531
4561
  raise ValueError(f"Cannot rename '{iid}', it already exists.")
4532
4562
  iid = iid.lower()
@@ -4538,7 +4568,7 @@ class Sheet(tk.Frame):
4538
4568
  if isinstance(text, str):
4539
4569
  self.RI.tree[item].text = text
4540
4570
  if isinstance(values, list):
4541
- self.set_data(self.RI.tree_rns[item], values)
4571
+ self.set_data(self.RI.tree_rns[item], data=values)
4542
4572
  if isinstance(open_, bool):
4543
4573
  if self.RI.tree[item].children:
4544
4574
  if open_:
@@ -4569,10 +4599,15 @@ class Sheet(tk.Frame):
4569
4599
  return self
4570
4600
 
4571
4601
  def itemrow(self, item: str) -> int:
4572
- return self.RI.tree_rns[item.lower()]
4602
+ try:
4603
+ return self.RI.tree_rns[item.lower()]
4604
+ except Exception:
4605
+ raise ValueError(f"item '{item.lower()}' does not exist.")
4573
4606
 
4574
- def rowitem(self, row: int) -> str | None:
4575
- if len(self.MT._row_index) > row:
4607
+ def rowitem(self, row: int, data_index: bool = False) -> str | None:
4608
+ if not data_index:
4609
+ row = self.data_r(row)
4610
+ if isinstance(row, int) and len(self.MT._row_index) > row:
4576
4611
  return self.MT._row_index[row].iid
4577
4612
  return None
4578
4613
 
@@ -4782,12 +4817,14 @@ class Sheet(tk.Frame):
4782
4817
  self.display_item(item)
4783
4818
  self.see(row=bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]), keep_xscroll=True)
4784
4819
 
4785
- def selection(self) -> list[str]:
4820
+ def selection(self, cells: bool = False) -> list[str]:
4786
4821
  """
4787
4822
  Get currently selected item ids
4788
- - Only includes selected rows
4789
4823
  """
4790
- return [self.MT._row_index[self.displayed_row_to_data(rn)].iid for rn in self.get_selected_rows()]
4824
+ return [
4825
+ self.MT._row_index[self.displayed_row_to_data(rn)].iid
4826
+ for rn in self.get_selected_rows(get_cells_as_rows=cells)
4827
+ ]
4791
4828
 
4792
4829
  def selection_set(self, *items) -> Sheet:
4793
4830
  self.deselect()
@@ -4797,7 +4834,7 @@ class Sheet(tk.Frame):
4797
4834
  def selection_add(self, *items) -> Sheet:
4798
4835
  for item in unpack(items):
4799
4836
  if (item := item.lower()) not in self.RI.tree:
4800
- raise ValueError(f"Item '{item}' does not exist.")
4837
+ continue
4801
4838
  if not self.item_displayed(item):
4802
4839
  self.display_item(item)
4803
4840
  self.add_row_selection(bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]))
@@ -4806,7 +4843,7 @@ class Sheet(tk.Frame):
4806
4843
  def selection_remove(self, *items) -> Sheet:
4807
4844
  for item in unpack(items):
4808
4845
  if (item := item.lower()) not in self.RI.tree:
4809
- raise ValueError(f"Item '{item}' does not exist.")
4846
+ continue
4810
4847
  try:
4811
4848
  self.deselect(bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]))
4812
4849
  except Exception:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.2
3
+ Version: 7.1.4
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
@@ -0,0 +1,20 @@
1
+ tksheet/__init__.py,sha256=RGoRjwh2ab3cYtclDJ-EoW9W_wdDZ2jJhWKAeeS7dyQ,1874
2
+ tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
+ tksheet/column_headers.py,sha256=CPP2a7LM4KA43ATm997rt3YL-EIhaeUycpVe-ev2fbA,99158
4
+ tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
+ tksheet/functions.py,sha256=7S4cQDIQ-1JqwQCgJSeVUA6bui_CK09zTHrtg2H7UeU,38714
6
+ tksheet/main_table.py,sha256=226s54StK5hBNpNigfO7R-DEuWdtdjCBRyqrJXecz3U,318142
7
+ tksheet/other_classes.py,sha256=Hjr7c0kD2_880xjtGuFn9gQ-7ED5kSiNahniBeXcf84,13604
8
+ tksheet/row_index.py,sha256=oov9iJmjONncmMnzV8dv23dgVKsBX0Fw4YWA28-Xl8o,104187
9
+ tksheet/sheet.py,sha256=z5kW5gdBVQMlwV8G-LI4nknINpGqSbyQ5M9FwX-SUI8,256939
10
+ tksheet/sheet_options.py,sha256=Vcy4RxTKvf2HM-Yc53ex0lpBe6ATXc_pdx4oLhfjDgU,11906
11
+ tksheet/text_editor.py,sha256=7xsEbgIyAWHDBWroh2wk1VeoVftFALlPZC9OANgD6LA,6662
12
+ tksheet/themes.py,sha256=OwUe31NRbosjw3ZoZsMyB8lNVyYin9YcKLhCturi5q8,13398
13
+ tksheet/top_left_rectangle.py,sha256=-2u9GfOvcqhkKwHEtbqdFvXCY3RbvL5k2Sh9l3r_k04,8275
14
+ tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
15
+ tksheet/vars.py,sha256=Iukk7-MMT9X7vv0m3nQPKzbp2Iw2Pg1wJEW7js919Mo,2092
16
+ tksheet-7.1.4.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
+ tksheet-7.1.4.dist-info/METADATA,sha256=1zV1Vq3e2BEnWQCfQ1I3tu45765I0R7NF88K4pd-2gQ,6013
18
+ tksheet-7.1.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
+ tksheet-7.1.4.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
+ tksheet-7.1.4.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- tksheet/__init__.py,sha256=XdNk6UqANLa3RfjSgcbjOXH8Rjtf-9LLCGU8EESkoMY,1874
2
- tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
- tksheet/column_headers.py,sha256=1I49CQS4unBcJ-y044R-DtYhJ4zUplrOfImOk8qHIj8,99396
4
- tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
- tksheet/functions.py,sha256=NnBFBvTqT6VhCK8pFlXqTwKekKpcsCYeuxaALcJeVzw,38651
6
- tksheet/main_table.py,sha256=Kh8ND0JnVHVeiwTt07FJkbP2GTlen3qCS5bt0xpbrdA,318848
7
- tksheet/other_classes.py,sha256=s559IxoFEeAgxTKrrHZnAeXUXWIEmiP4tBncIdQIXSQ,13544
8
- tksheet/row_index.py,sha256=GzK6Gfi4v6zwALn5IvBz22SdSFLUgxS1yLX4bm7z3sg,104428
9
- tksheet/sheet.py,sha256=ZoxxO1VZZzgshmp_3eJkkzXjx6S3M5T95sw3CTfUqHo,255904
10
- tksheet/sheet_options.py,sha256=Vcy4RxTKvf2HM-Yc53ex0lpBe6ATXc_pdx4oLhfjDgU,11906
11
- tksheet/text_editor.py,sha256=7xsEbgIyAWHDBWroh2wk1VeoVftFALlPZC9OANgD6LA,6662
12
- tksheet/themes.py,sha256=OwUe31NRbosjw3ZoZsMyB8lNVyYin9YcKLhCturi5q8,13398
13
- tksheet/top_left_rectangle.py,sha256=-2u9GfOvcqhkKwHEtbqdFvXCY3RbvL5k2Sh9l3r_k04,8275
14
- tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
15
- tksheet/vars.py,sha256=Iukk7-MMT9X7vv0m3nQPKzbp2Iw2Pg1wJEW7js919Mo,2092
16
- tksheet-7.1.2.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
- tksheet-7.1.2.dist-info/METADATA,sha256=plUvLhmwtF-WEveHRmf99r4YViVdRJDZTCCJ6noYtZU,6013
18
- tksheet-7.1.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
- tksheet-7.1.2.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
- tksheet-7.1.2.dist-info/RECORD,,