tksheet 7.1.3__py3-none-any.whl → 7.1.5__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.3"
7
+ __version__ = "7.1.5"
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,16 @@ 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(
276
+ *self.get_shift_select_box(c, c_to_sel), "columns"
277
+ )
279
278
  self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
280
279
  else:
281
280
  self.being_drawn_item = self.select_col(c, run_binding_func=False)
282
281
  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
- )
282
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
283
+ try_binding(self.shift_selection_binding_func, sel_event)
284
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
287
285
  elif c_selected:
288
286
  self.dragged_col = DraggedRowColumn(
289
287
  dragged=c,
@@ -371,8 +369,7 @@ class ColumnHeaders(tk.Canvas):
371
369
  self.MT.current_cursor = "hand2"
372
370
  if not mouse_over_resize and not mouse_over_selected:
373
371
  self.MT.reset_mouse_motion_creations()
374
- if self.extra_motion_func is not None:
375
- self.extra_motion_func(event)
372
+ try_binding(self.extra_motion_func, event)
376
373
 
377
374
  def double_b1(self, event: object):
378
375
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
@@ -412,8 +409,7 @@ class ColumnHeaders(tk.Canvas):
412
409
  self.open_cell(event)
413
410
  self.rsz_w = None
414
411
  self.mouse_motion(event)
415
- if self.extra_double_b1_func is not None:
416
- self.extra_double_b1_func(event)
412
+ try_binding(self.extra_double_b1_func, event)
417
413
 
418
414
  def b1_press(self, event: object):
419
415
  self.MT.unbind("<MouseWheel>")
@@ -478,8 +474,7 @@ class ColumnHeaders(tk.Canvas):
478
474
  self.being_drawn_item = self.select_col(c, redraw=True)
479
475
  elif self.MT.toggle_selection_enabled:
480
476
  self.toggle_select_col(c, redraw=True)
481
- if self.extra_b1_press_func is not None:
482
- self.extra_b1_press_func(event)
477
+ try_binding(self.extra_b1_press_func, event)
483
478
 
484
479
  def b1_motion(self, event: object):
485
480
  x1, y1, x2, y2 = self.MT.get_canvas_visible_area()
@@ -570,16 +565,14 @@ class ColumnHeaders(tk.Canvas):
570
565
  else:
571
566
  self.being_drawn_item = self.select_col(self.MT.selected.column, run_binding_func=False)
572
567
  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
- )
568
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
569
+ try_binding(self.drag_selection_binding_func, sel_event)
570
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
577
571
  if self.scroll_if_event_offscreen(event):
578
572
  need_redraw = True
579
573
  if need_redraw:
580
574
  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)
575
+ try_binding(self.extra_b1_motion_func, event)
583
576
 
584
577
  def get_b1_motion_box(self, start_col, end_col):
585
578
  if end_col >= start_col:
@@ -631,10 +624,9 @@ class ColumnHeaders(tk.Canvas):
631
624
  self.MT.hide_selection_box(self.MT.selected.fill_iid)
632
625
  self.being_drawn_item = self.add_selection(box[1], run_binding_func=False)
633
626
  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
- )
627
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
628
+ try_binding(self.drag_selection_binding_func, sel_event)
629
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
638
630
  if self.scroll_if_event_offscreen(event):
639
631
  need_redraw = True
640
632
  if need_redraw:
@@ -770,10 +762,9 @@ class ColumnHeaders(tk.Canvas):
770
762
  c_to_sel,
771
763
  item=self.MT.create_selection_box(*to_sel, set_current=False),
772
764
  )
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
- )
765
+ sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
766
+ try_binding(self.drag_selection_binding_func, sel_event)
767
+ self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
777
768
  self.MT.bind("<MouseWheel>", self.MT.mousewheel)
778
769
  if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
779
770
  self.currently_resizing_width = False
@@ -865,8 +856,16 @@ class ColumnHeaders(tk.Canvas):
865
856
  ):
866
857
  datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
867
858
  canvasx = self.canvasx(event.x)
868
- if self.event_over_dropdown(c, datacn, event, canvasx) or self.event_over_checkbox(
869
- c, datacn, event, canvasx
859
+ if self.event_over_dropdown(
860
+ c,
861
+ datacn,
862
+ event,
863
+ canvasx,
864
+ ) or self.event_over_checkbox(
865
+ c,
866
+ datacn,
867
+ event,
868
+ canvasx,
870
869
  ):
871
870
  self.open_cell(event)
872
871
  else:
@@ -879,8 +878,7 @@ class ColumnHeaders(tk.Canvas):
879
878
  self.rsz_w = None
880
879
  self.rsz_h = None
881
880
  self.mouse_motion(event)
882
- if self.extra_b1_release_func is not None:
883
- self.extra_b1_release_func(event)
881
+ try_binding(self.extra_b1_release_func, event)
884
882
 
885
883
  def toggle_select_col(
886
884
  self,
@@ -982,15 +980,15 @@ class ColumnHeaders(tk.Canvas):
982
980
  qconf = self.MT.txt_measure_canvas.itemconfig
983
981
  qbbox = self.MT.txt_measure_canvas.bbox
984
982
  qtxtm = self.MT.txt_measure_canvas_text
983
+ qfont = self.PAR.ops.header_font
985
984
  new_height = self.MT.min_header_height
986
985
  default_header_height = self.MT.get_default_header_height()
987
986
  self.fix_header()
988
987
  if text is not None:
989
988
  if text:
990
- qconf(qtxtm, text=text)
989
+ qconf(qtxtm, text=text, font=qfont)
991
990
  b = qbbox(qtxtm)
992
- h = b[3] - b[1] + 5
993
- if h > new_height:
991
+ if (h := b[3] - b[1] + 5) > new_height:
994
992
  new_height = h
995
993
  else:
996
994
  if self.MT.all_columns_displayed:
@@ -1014,7 +1012,7 @@ class ColumnHeaders(tk.Canvas):
1014
1012
  for datacn in iterable:
1015
1013
  txt = self.MT.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
1016
1014
  if txt:
1017
- qconf(qtxtm, text=txt)
1015
+ qconf(qtxtm, text=txt, font=qfont)
1018
1016
  b = qbbox(qtxtm)
1019
1017
  h = b[3] - b[1] + 5
1020
1018
  else:
@@ -1026,7 +1024,7 @@ class ColumnHeaders(tk.Canvas):
1026
1024
  if h > new_height:
1027
1025
  new_height = h
1028
1026
  space_bot = self.MT.get_space_bot(0)
1029
- if new_height > space_bot:
1027
+ if new_height > space_bot and space_bot > self.MT.min_header_height:
1030
1028
  new_height = space_bot
1031
1029
  if not only_increase or (only_increase and new_height > self.current_height):
1032
1030
  self.set_height(new_height, set_TL=True)
@@ -1646,7 +1644,7 @@ class ColumnHeaders(tk.Canvas):
1646
1644
  text = event.char
1647
1645
  else:
1648
1646
  return False
1649
- if self.extra_begin_edit_cell_func is not None:
1647
+ if self.extra_begin_edit_cell_func:
1650
1648
  try:
1651
1649
  text = self.extra_begin_edit_cell_func(
1652
1650
  event_dict(
@@ -1696,12 +1694,12 @@ class ColumnHeaders(tk.Canvas):
1696
1694
  }
1697
1695
  ),
1698
1696
  "sheet_ops": self.PAR.ops,
1699
- "border_color": self.PAR.ops.table_selected_cells_border_fg,
1697
+ "border_color": self.PAR.ops.header_selected_columns_bg,
1700
1698
  "text": text,
1701
1699
  "state": state,
1702
1700
  "width": w,
1703
1701
  "height": h,
1704
- "show_border": self.PAR.ops.show_selected_cells_border,
1702
+ "show_border": True,
1705
1703
  "bg": bg,
1706
1704
  "fg": fg,
1707
1705
  "align": self.get_cell_align(c),
@@ -1747,31 +1745,34 @@ class ColumnHeaders(tk.Canvas):
1747
1745
 
1748
1746
  # displayed indexes
1749
1747
  def text_editor_newline_binding(self, r=0, c=0, event: object = None, check_lines=True):
1750
- if self.height_resizing_enabled:
1751
- curr_height = self.text_editor.window.winfo_height()
1752
- if (
1753
- not check_lines
1754
- or self.MT.get_lines_cell_height(
1755
- self.text_editor.window.get_num_lines() + 1,
1756
- font=self.PAR.ops.header_font,
1757
- )
1758
- > curr_height
1759
- ):
1760
- new_height = curr_height + self.MT.header_xtra_lines_increment
1761
- space_bot = self.MT.get_space_bot(0)
1762
- if new_height > space_bot:
1763
- new_height = space_bot
1764
- if new_height != curr_height:
1765
- self.text_editor.window.config(height=new_height)
1766
- self.set_height(new_height, set_TL=True)
1767
- if self.dropdown.open and self.dropdown.get_coords() == c:
1768
- win_h, anchor = self.get_dropdown_height_anchor(c, new_height)
1769
- self.coords(
1770
- self.dropdown.canvas_id,
1771
- self.MT.col_positions[c],
1772
- new_height - 1,
1773
- )
1774
- self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1748
+ if not self.height_resizing_enabled:
1749
+ return
1750
+ curr_height = self.text_editor.window.winfo_height()
1751
+ if curr_height < self.MT.min_header_height:
1752
+ return
1753
+ if (
1754
+ not check_lines
1755
+ or self.MT.get_lines_cell_height(
1756
+ self.text_editor.window.get_num_lines() + 1,
1757
+ font=self.PAR.ops.header_font,
1758
+ )
1759
+ > curr_height
1760
+ ):
1761
+ new_height = curr_height + self.MT.header_xtra_lines_increment
1762
+ space_bot = self.MT.get_space_bot(0)
1763
+ if new_height > space_bot:
1764
+ new_height = space_bot
1765
+ if new_height != curr_height:
1766
+ self.text_editor.window.config(height=new_height)
1767
+ self.set_height(new_height, set_TL=True)
1768
+ if self.dropdown.open and self.dropdown.get_coords() == c:
1769
+ win_h, anchor = self.get_dropdown_height_anchor(c, new_height)
1770
+ self.coords(
1771
+ self.dropdown.canvas_id,
1772
+ self.MT.col_positions[c],
1773
+ new_height - 1,
1774
+ )
1775
+ self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1775
1776
 
1776
1777
  def refresh_open_window_positions(self):
1777
1778
  if self.text_editor.open:
@@ -1909,33 +1910,32 @@ class ColumnHeaders(tk.Canvas):
1909
1910
  if not self.open_text_editor(event=event, c=c, dropdown=True):
1910
1911
  return
1911
1912
  win_h, anchor = self.get_dropdown_height_anchor(c)
1913
+ win_w = self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1
1912
1914
  ypos = self.current_height - 1
1913
- if self.dropdown.window is not None:
1914
- self.dropdown.window.search_function = kwargs["search_function"]
1915
- self.dropdown.window.c = c
1916
- self.dropdown.window.row = -1
1917
- self.dropdown.window.set_options()
1918
- self.dropdown.window.values(kwargs["values"])
1919
- if not self.dropdown.open:
1920
- self.itemconfig(self.dropdown.canvas_id, state="normal")
1915
+ reset_kwargs = {
1916
+ "r": 0,
1917
+ "c": c,
1918
+ "width": win_w,
1919
+ "height": win_h,
1920
+ "font": self.PAR.ops.header_font,
1921
+ "ops": self.PAR.ops,
1922
+ "outline_color": self.PAR.ops.popup_menu_fg,
1923
+ "align": self.get_cell_align(c),
1924
+ "values": kwargs["values"],
1925
+ }
1926
+ if self.dropdown.window:
1927
+ self.dropdown.window.reset(**reset_kwargs)
1928
+ self.itemconfig(self.dropdown.canvas_id, state="normal")
1921
1929
  self.coords(self.dropdown.canvas_id, self.MT.col_positions[c], ypos)
1922
1930
  else:
1923
1931
  self.dropdown.window = self.PAR.dropdown_class(
1924
- self.MT.winfo_toplevel(),
1925
- 0,
1926
- c,
1927
- width=self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1,
1928
- height=win_h,
1929
- font=self.PAR.ops.header_font,
1930
- ops=self.PAR.ops,
1931
- outline_color=self.PAR.ops.popup_menu_fg,
1932
- values=kwargs["values"],
1932
+ self.winfo_toplevel(),
1933
+ **reset_kwargs,
1934
+ single_index="c",
1933
1935
  close_dropdown_window=self.close_dropdown_window,
1934
1936
  search_function=kwargs["search_function"],
1935
1937
  arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
1936
1938
  arrowkey_LEFT=self.MT.arrowkey_LEFT,
1937
- align="w",
1938
- single_index="c",
1939
1939
  )
1940
1940
  self.dropdown.canvas_id = self.create_window(
1941
1941
  (self.MT.col_positions[c], ypos),
tksheet/functions.py CHANGED
@@ -1146,6 +1146,22 @@ def set_readonly(
1146
1146
  return options
1147
1147
 
1148
1148
 
1149
+ def convert_align(align: str | None) -> str | None:
1150
+ if isinstance(align, str):
1151
+ a = align.lower()
1152
+ if a == "global":
1153
+ return None
1154
+ elif a in ("c", "center", "centre"):
1155
+ return "center"
1156
+ elif a in ("w", "west", "left"):
1157
+ return "w"
1158
+ elif a in ("e", "east", "right"):
1159
+ return "e"
1160
+ elif align is None:
1161
+ return None
1162
+ raise ValueError("Align must be one of the following values: c, center, w, west, left, e, east, right")
1163
+
1164
+
1149
1165
  def set_align(
1150
1166
  options: dict,
1151
1167
  key: int | tuple[int, int],