tksheet 7.1.4__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.4"
7
+ __version__ = "7.1.5"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
tksheet/column_headers.py CHANGED
@@ -272,7 +272,9 @@ class ColumnHeaders(tk.Canvas):
272
272
  if self.MT.selected and self.MT.selected.type_ == "columns":
273
273
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
274
274
  self.MT.deselect("all", redraw=False)
275
- self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(c, c_to_sel), "columns")
275
+ self.being_drawn_item = self.MT.create_selection_box(
276
+ *self.get_shift_select_box(c, c_to_sel), "columns"
277
+ )
276
278
  self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
277
279
  else:
278
280
  self.being_drawn_item = self.select_col(c, run_binding_func=False)
@@ -854,8 +856,16 @@ class ColumnHeaders(tk.Canvas):
854
856
  ):
855
857
  datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
856
858
  canvasx = self.canvasx(event.x)
857
- if self.event_over_dropdown(c, datacn, event, canvasx) or self.event_over_checkbox(
858
- 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,
859
869
  ):
860
870
  self.open_cell(event)
861
871
  else:
@@ -970,15 +980,15 @@ class ColumnHeaders(tk.Canvas):
970
980
  qconf = self.MT.txt_measure_canvas.itemconfig
971
981
  qbbox = self.MT.txt_measure_canvas.bbox
972
982
  qtxtm = self.MT.txt_measure_canvas_text
983
+ qfont = self.PAR.ops.header_font
973
984
  new_height = self.MT.min_header_height
974
985
  default_header_height = self.MT.get_default_header_height()
975
986
  self.fix_header()
976
987
  if text is not None:
977
988
  if text:
978
- qconf(qtxtm, text=text)
989
+ qconf(qtxtm, text=text, font=qfont)
979
990
  b = qbbox(qtxtm)
980
- h = b[3] - b[1] + 5
981
- if h > new_height:
991
+ if (h := b[3] - b[1] + 5) > new_height:
982
992
  new_height = h
983
993
  else:
984
994
  if self.MT.all_columns_displayed:
@@ -1002,7 +1012,7 @@ class ColumnHeaders(tk.Canvas):
1002
1012
  for datacn in iterable:
1003
1013
  txt = self.MT.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
1004
1014
  if txt:
1005
- qconf(qtxtm, text=txt)
1015
+ qconf(qtxtm, text=txt, font=qfont)
1006
1016
  b = qbbox(qtxtm)
1007
1017
  h = b[3] - b[1] + 5
1008
1018
  else:
@@ -1014,7 +1024,7 @@ class ColumnHeaders(tk.Canvas):
1014
1024
  if h > new_height:
1015
1025
  new_height = h
1016
1026
  space_bot = self.MT.get_space_bot(0)
1017
- if new_height > space_bot:
1027
+ if new_height > space_bot and space_bot > self.MT.min_header_height:
1018
1028
  new_height = space_bot
1019
1029
  if not only_increase or (only_increase and new_height > self.current_height):
1020
1030
  self.set_height(new_height, set_TL=True)
@@ -1684,12 +1694,12 @@ class ColumnHeaders(tk.Canvas):
1684
1694
  }
1685
1695
  ),
1686
1696
  "sheet_ops": self.PAR.ops,
1687
- "border_color": self.PAR.ops.table_selected_cells_border_fg,
1697
+ "border_color": self.PAR.ops.header_selected_columns_bg,
1688
1698
  "text": text,
1689
1699
  "state": state,
1690
1700
  "width": w,
1691
1701
  "height": h,
1692
- "show_border": self.PAR.ops.show_selected_cells_border,
1702
+ "show_border": True,
1693
1703
  "bg": bg,
1694
1704
  "fg": fg,
1695
1705
  "align": self.get_cell_align(c),
@@ -1735,31 +1745,34 @@ class ColumnHeaders(tk.Canvas):
1735
1745
 
1736
1746
  # displayed indexes
1737
1747
  def text_editor_newline_binding(self, r=0, c=0, event: object = None, check_lines=True):
1738
- if self.height_resizing_enabled:
1739
- curr_height = self.text_editor.window.winfo_height()
1740
- if (
1741
- not check_lines
1742
- or self.MT.get_lines_cell_height(
1743
- self.text_editor.window.get_num_lines() + 1,
1744
- font=self.PAR.ops.header_font,
1745
- )
1746
- > curr_height
1747
- ):
1748
- new_height = curr_height + self.MT.header_xtra_lines_increment
1749
- space_bot = self.MT.get_space_bot(0)
1750
- if new_height > space_bot:
1751
- new_height = space_bot
1752
- if new_height != curr_height:
1753
- self.text_editor.window.config(height=new_height)
1754
- self.set_height(new_height, set_TL=True)
1755
- if self.dropdown.open and self.dropdown.get_coords() == c:
1756
- win_h, anchor = self.get_dropdown_height_anchor(c, new_height)
1757
- self.coords(
1758
- self.dropdown.canvas_id,
1759
- self.MT.col_positions[c],
1760
- new_height - 1,
1761
- )
1762
- 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)
1763
1776
 
1764
1777
  def refresh_open_window_positions(self):
1765
1778
  if self.text_editor.open:
@@ -1897,33 +1910,32 @@ class ColumnHeaders(tk.Canvas):
1897
1910
  if not self.open_text_editor(event=event, c=c, dropdown=True):
1898
1911
  return
1899
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
1900
1914
  ypos = self.current_height - 1
1901
- if self.dropdown.window is not None:
1902
- self.dropdown.window.search_function = kwargs["search_function"]
1903
- self.dropdown.window.c = c
1904
- self.dropdown.window.row = -1
1905
- self.dropdown.window.set_options()
1906
- self.dropdown.window.values(kwargs["values"])
1907
- if not self.dropdown.open:
1908
- 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")
1909
1929
  self.coords(self.dropdown.canvas_id, self.MT.col_positions[c], ypos)
1910
1930
  else:
1911
1931
  self.dropdown.window = self.PAR.dropdown_class(
1912
- self.MT.winfo_toplevel(),
1913
- 0,
1914
- c,
1915
- width=self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1,
1916
- height=win_h,
1917
- font=self.PAR.ops.header_font,
1918
- ops=self.PAR.ops,
1919
- outline_color=self.PAR.ops.popup_menu_fg,
1920
- values=kwargs["values"],
1932
+ self.winfo_toplevel(),
1933
+ **reset_kwargs,
1934
+ single_index="c",
1921
1935
  close_dropdown_window=self.close_dropdown_window,
1922
1936
  search_function=kwargs["search_function"],
1923
1937
  arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
1924
1938
  arrowkey_LEFT=self.MT.arrowkey_LEFT,
1925
- align="w",
1926
- single_index="c",
1927
1939
  )
1928
1940
  self.dropdown.canvas_id = self.create_window(
1929
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],
tksheet/main_table.py CHANGED
@@ -1803,7 +1803,7 @@ class MainTable(tk.Canvas):
1803
1803
  cells=False,
1804
1804
  ):
1805
1805
  self.hide_selection_box(item)
1806
- elif r is not None and c is None and cell is None:
1806
+ elif isinstance(r, int) and c is None and cell is None:
1807
1807
  for item, box in self.get_selection_items(columns=False, cells=False):
1808
1808
  r1, c1, r2, c2 = box.coords
1809
1809
  if r >= r1 and r < r2:
@@ -1847,7 +1847,7 @@ class MainTable(tk.Canvas):
1847
1847
  set_current=resel and to_sel >= r + 1 and to_sel < r2,
1848
1848
  )
1849
1849
  break
1850
- elif c is not None and r is None and cell is None:
1850
+ elif isinstance(c, int) and r is None and cell is None:
1851
1851
  for item, box in self.get_selection_items(rows=False, cells=False):
1852
1852
  r1, c1, r2, c2 = box.coords
1853
1853
  if c >= c1 and c < c2:
@@ -1891,7 +1891,7 @@ class MainTable(tk.Canvas):
1891
1891
  set_current=resel and to_sel >= c + 1 and to_sel < c2,
1892
1892
  )
1893
1893
  break
1894
- elif (r is not None and c is not None and cell is None) or cell is not None:
1894
+ elif (isinstance(r, int) and isinstance(c, int) and cell is None) or cell is not None:
1895
1895
  if cell is not None:
1896
1896
  r, c = cell[0], cell[1]
1897
1897
  for item, box in self.get_selection_items(reverse=True):
@@ -1970,7 +1970,7 @@ class MainTable(tk.Canvas):
1970
1970
  return
1971
1971
  if self.selected.type_ == "rows":
1972
1972
  r = self.selected.row
1973
- if r != 0 and self.RI.row_selection_enabled:
1973
+ if r and self.RI.row_selection_enabled:
1974
1974
  if self.cell_completely_visible(r=r - 1, c=0):
1975
1975
  self.RI.select_row(r - 1, redraw=True)
1976
1976
  else:
@@ -1979,63 +1979,16 @@ class MainTable(tk.Canvas):
1979
1979
  elif self.selected.type_ in ("cells", "columns"):
1980
1980
  r = self.selected.row
1981
1981
  c = self.selected.column
1982
- if r == 0 and self.CH.col_selection_enabled:
1982
+ if not r and self.CH.col_selection_enabled:
1983
1983
  if not self.cell_completely_visible(r=r, c=0):
1984
- self.see(r, c, keep_xscroll=True, check_cell_visibility=False)
1985
- elif r != 0 and (self.single_selection_enabled or self.toggle_selection_enabled):
1984
+ self.see(r, c, check_cell_visibility=False)
1985
+ elif r and (self.single_selection_enabled or self.toggle_selection_enabled):
1986
1986
  if self.cell_completely_visible(r=r - 1, c=c):
1987
1987
  self.select_cell(r - 1, c, redraw=True)
1988
1988
  else:
1989
1989
  self.select_cell(r - 1, c)
1990
1990
  self.see(r - 1, c, keep_xscroll=True, check_cell_visibility=False)
1991
1991
 
1992
- def arrowkey_RIGHT(self, event=None):
1993
- if not self.selected:
1994
- return
1995
- if self.selected.type_ == "rows":
1996
- r = self.selected.row
1997
- if self.single_selection_enabled or self.toggle_selection_enabled:
1998
- if self.cell_completely_visible(r=r, c=0):
1999
- self.select_cell(r, 0, redraw=True)
2000
- else:
2001
- self.select_cell(r, 0)
2002
- self.see(
2003
- r,
2004
- 0,
2005
- keep_yscroll=True,
2006
- bottom_right_corner=True,
2007
- check_cell_visibility=False,
2008
- )
2009
- elif self.selected.type_ == "columns":
2010
- c = self.selected.column
2011
- if c < len(self.col_positions) - 2 and self.CH.col_selection_enabled:
2012
- if self.cell_completely_visible(r=0, c=c + 1):
2013
- self.CH.select_col(c + 1, redraw=True)
2014
- else:
2015
- self.CH.select_col(c + 1)
2016
- self.see(
2017
- 0,
2018
- c + 1,
2019
- keep_yscroll=True,
2020
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2021
- check_cell_visibility=False,
2022
- )
2023
- else:
2024
- r = self.selected.row
2025
- c = self.selected.column
2026
- if c < len(self.col_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2027
- if self.cell_completely_visible(r=r, c=c + 1):
2028
- self.select_cell(r, c + 1, redraw=True)
2029
- else:
2030
- self.select_cell(r, c + 1)
2031
- self.see(
2032
- r,
2033
- c + 1,
2034
- keep_yscroll=True,
2035
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2036
- check_cell_visibility=False,
2037
- )
2038
-
2039
1992
  def arrowkey_DOWN(self, event=None):
2040
1993
  if not self.selected:
2041
1994
  return
@@ -2071,15 +2024,17 @@ class MainTable(tk.Canvas):
2071
2024
  elif self.selected.type_ == "columns":
2072
2025
  c = self.selected.column
2073
2026
  if self.single_selection_enabled or self.toggle_selection_enabled:
2074
- if self.cell_completely_visible(r=0, c=c):
2075
- self.select_cell(0, c, redraw=True)
2027
+ if self.selected.row == len(self.row_positions) - 2:
2028
+ r = self.selected.row
2076
2029
  else:
2077
- self.select_cell(0, c)
2030
+ r = self.selected.row + 1
2031
+ if self.cell_completely_visible(r=r, c=c):
2032
+ self.select_cell(r, c, redraw=True)
2033
+ else:
2034
+ self.select_cell(r, c)
2078
2035
  self.see(
2079
- 0,
2036
+ r,
2080
2037
  c,
2081
- keep_xscroll=True,
2082
- bottom_right_corner=True,
2083
2038
  check_cell_visibility=False,
2084
2039
  )
2085
2040
  else:
@@ -2118,7 +2073,7 @@ class MainTable(tk.Canvas):
2118
2073
  return
2119
2074
  if self.selected.type_ == "columns":
2120
2075
  c = self.selected.column
2121
- if c != 0 and self.CH.col_selection_enabled:
2076
+ if c and self.CH.col_selection_enabled:
2122
2077
  if self.cell_completely_visible(r=0, c=c - 1):
2123
2078
  self.CH.select_col(c - 1, redraw=True)
2124
2079
  else:
@@ -2130,19 +2085,70 @@ class MainTable(tk.Canvas):
2130
2085
  bottom_right_corner=True,
2131
2086
  check_cell_visibility=False,
2132
2087
  )
2088
+ elif self.selected.type_ == "rows" and self.selected.column:
2089
+ self.select_cell(self.selected.row, self.selected.column - 1)
2090
+ self.see(self.selected.row, self.selected.column, check_cell_visibility=True)
2133
2091
  elif self.selected.type_ == "cells":
2134
2092
  r = self.selected.row
2135
2093
  c = self.selected.column
2136
- if c == 0 and self.RI.row_selection_enabled:
2137
- if not self.cell_completely_visible(r=r, c=0):
2138
- self.see(r, c, keep_yscroll=True, check_cell_visibility=False)
2139
- elif c != 0 and (self.single_selection_enabled or self.toggle_selection_enabled):
2094
+ if not c and not self.cell_completely_visible(r=r, c=0):
2095
+ self.see(r, c, keep_yscroll=True, check_cell_visibility=False)
2096
+ elif c and (self.single_selection_enabled or self.toggle_selection_enabled):
2140
2097
  if self.cell_completely_visible(r=r, c=c - 1):
2141
2098
  self.select_cell(r, c - 1, redraw=True)
2142
2099
  else:
2143
2100
  self.select_cell(r, c - 1)
2144
2101
  self.see(r, c - 1, keep_yscroll=True, check_cell_visibility=False)
2145
2102
 
2103
+ def arrowkey_RIGHT(self, event=None):
2104
+ if not self.selected:
2105
+ return
2106
+ if self.selected.type_ == "rows":
2107
+ r = self.selected.row
2108
+ if self.single_selection_enabled or self.toggle_selection_enabled:
2109
+ if self.selected.column == len(self.col_positions) - 2:
2110
+ c = self.selected.column
2111
+ else:
2112
+ c = self.selected.column + 1
2113
+ if self.cell_completely_visible(r=r, c=c):
2114
+ self.select_cell(r, c, redraw=True)
2115
+ else:
2116
+ self.select_cell(r, c)
2117
+ self.see(
2118
+ r,
2119
+ c,
2120
+ check_cell_visibility=False,
2121
+ )
2122
+ elif self.selected.type_ == "columns":
2123
+ c = self.selected.column
2124
+ if c < len(self.col_positions) - 2 and self.CH.col_selection_enabled:
2125
+ if self.cell_completely_visible(r=0, c=c + 1):
2126
+ self.CH.select_col(c + 1, redraw=True)
2127
+ else:
2128
+ self.CH.select_col(c + 1)
2129
+ self.see(
2130
+ 0,
2131
+ c + 1,
2132
+ keep_yscroll=True,
2133
+ bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2134
+ check_cell_visibility=False,
2135
+ )
2136
+ else:
2137
+ r = self.selected.row
2138
+ c = self.selected.column
2139
+ if c < len(self.col_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2140
+ if self.cell_completely_visible(r=r, c=c + 1):
2141
+ self.select_cell(r, c + 1, redraw=True)
2142
+ else:
2143
+ self.select_cell(r, c + 1)
2144
+ self.see(
2145
+ r,
2146
+ c + 1,
2147
+ keep_yscroll=True,
2148
+ bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2149
+ check_cell_visibility=False,
2150
+ )
2151
+
2146
2152
  def key_bindings(self) -> None:
2147
2153
  for widget in (self, self.RI, self.CH, self.TL):
2148
2154
  for binding in self.PAR.ops.copy_bindings:
@@ -3376,7 +3382,7 @@ class MainTable(tk.Canvas):
3376
3382
  def set_table_font_help(self):
3377
3383
  self.table_txt_width, self.table_txt_height = self.get_txt_dimensions("|", self.PAR.ops.table_font)
3378
3384
  self.table_half_txt_height = ceil(self.table_txt_height / 2)
3379
- if self.table_half_txt_height % 2 == 0:
3385
+ if not self.table_half_txt_height % 2:
3380
3386
  self.table_first_ln_ins = self.table_half_txt_height + 2
3381
3387
  else:
3382
3388
  self.table_first_ln_ins = self.table_half_txt_height + 3
@@ -3404,7 +3410,7 @@ class MainTable(tk.Canvas):
3404
3410
  def set_header_font_help(self):
3405
3411
  self.header_txt_width, self.header_txt_height = self.get_txt_dimensions("|", self.PAR.ops.header_font)
3406
3412
  self.header_half_txt_height = ceil(self.header_txt_height / 2)
3407
- if self.header_half_txt_height % 2 == 0:
3413
+ if not self.header_half_txt_height % 2:
3408
3414
  self.header_first_ln_ins = self.header_half_txt_height + 2
3409
3415
  else:
3410
3416
  self.header_first_ln_ins = self.header_half_txt_height + 3
@@ -3435,7 +3441,7 @@ class MainTable(tk.Canvas):
3435
3441
  def set_index_font_help(self):
3436
3442
  self.index_txt_width, self.index_txt_height = self.get_txt_dimensions("|", self.PAR.ops.index_font)
3437
3443
  self.index_half_txt_height = ceil(self.index_txt_height / 2)
3438
- if self.index_half_txt_height % 2 == 0:
3444
+ if not self.index_half_txt_height % 2:
3439
3445
  self.index_first_ln_ins = self.index_half_txt_height + 2
3440
3446
  else:
3441
3447
  self.index_first_ln_ins = self.index_half_txt_height + 3
@@ -3562,19 +3568,22 @@ class MainTable(tk.Canvas):
3562
3568
  else:
3563
3569
  return False
3564
3570
 
3565
- def set_all_cell_sizes_to_text(self, include_index: bool = False) -> tuple[list[float], list[float]]:
3571
+ def set_all_cell_sizes_to_text(self, w: int | None = None) -> tuple[list[float], list[float]]:
3566
3572
  min_column_width = int(self.min_column_width)
3567
3573
  min_rh = int(self.min_row_height)
3568
- w = min_column_width
3574
+ w = min_column_width if w is None else w
3569
3575
  h = min_rh
3570
3576
  rhs = defaultdict(lambda: int(min_rh))
3571
3577
  cws = []
3572
- itmcon = self.txt_measure_canvas.itemconfig
3573
- itmbbx = self.txt_measure_canvas.bbox
3574
- self.txt_measure_canvas.itemconfig(self.txt_measure_canvas_text, font=self.PAR.ops.table_font)
3578
+ qconf = self.txt_measure_canvas.itemconfig
3579
+ qbbox = self.txt_measure_canvas.bbox
3580
+ qtxtm = self.txt_measure_canvas_text
3581
+ qtxth = self.table_txt_height
3582
+ qfont = self.PAR.ops.table_font
3575
3583
  numrows = self.total_data_rows()
3584
+ numcols = self.total_data_cols()
3576
3585
  if self.all_columns_displayed:
3577
- itercols = range(self.total_data_cols())
3586
+ itercols = range(numcols)
3578
3587
  else:
3579
3588
  itercols = self.displayed_columns
3580
3589
  if self.all_rows_displayed:
@@ -3591,23 +3600,28 @@ class MainTable(tk.Canvas):
3591
3600
  if h > rhs[datarn]:
3592
3601
  rhs[datarn] = h
3593
3602
  for datacn in itercols:
3594
- w, h_ = self.CH.get_cell_dimensions(datacn)
3595
- if self.all_rows_displayed:
3596
- iterrows = range(numrows)
3603
+ if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w:
3604
+ w = hw
3597
3605
  for datarn in iterrows:
3598
3606
  txt = self.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
3599
3607
  if txt:
3600
- itmcon(self.txt_measure_canvas_text, text=txt)
3601
- b = itmbbx(self.txt_measure_canvas_text)
3608
+ qconf(qtxtm, text=txt, font=qfont)
3609
+ b = qbbox(qtxtm)
3602
3610
  tw = b[2] - b[0] + 7
3603
3611
  h = b[3] - b[1] + 5
3604
3612
  else:
3605
3613
  tw = min_column_width
3606
3614
  h = min_rh
3607
- if self.get_cell_kwargs(datarn, datacn, key="dropdown") or self.get_cell_kwargs(
3608
- datarn, datacn, key="checkbox"
3615
+ if self.get_cell_kwargs(
3616
+ datarn,
3617
+ datacn,
3618
+ key="dropdown",
3619
+ ) or self.get_cell_kwargs(
3620
+ datarn,
3621
+ datacn,
3622
+ key="checkbox",
3609
3623
  ):
3610
- tw += self.table_txt_height
3624
+ tw += qtxth
3611
3625
  if tw > w:
3612
3626
  w = tw
3613
3627
  if h < min_rh:
@@ -3621,8 +3635,8 @@ class MainTable(tk.Canvas):
3621
3635
  elif w > self.max_column_width:
3622
3636
  w = int(self.max_column_width)
3623
3637
  cws.append(w)
3624
- self.set_row_positions(itr=(height for height in rhs.values()))
3625
- self.set_col_positions(itr=(width for width in cws))
3638
+ self.set_row_positions(itr=rhs.values())
3639
+ self.set_col_positions(itr=cws)
3626
3640
  self.recreate_all_selection_boxes()
3627
3641
  return self.row_positions, self.col_positions
3628
3642
 
@@ -5689,6 +5703,7 @@ class MainTable(tk.Canvas):
5689
5703
  c: int,
5690
5704
  type_: Literal["cells", "rows", "columns"],
5691
5705
  fill_iid: int,
5706
+ lower_selection_boxes: bool = True,
5692
5707
  ) -> int:
5693
5708
  fill, outline = self.get_selected_box_bg_fg(type_=type_)
5694
5709
  x1 = self.col_positions[c] + 1
@@ -5699,6 +5714,7 @@ class MainTable(tk.Canvas):
5699
5714
  if self.PAR.ops.show_selected_cells_border:
5700
5715
  fill = ""
5701
5716
  else:
5717
+ fill = outline
5702
5718
  outline = ""
5703
5719
  iid = self.display_box(
5704
5720
  x1,
@@ -5719,10 +5735,7 @@ class MainTable(tk.Canvas):
5719
5735
  iid=iid,
5720
5736
  fill_iid=fill_iid,
5721
5737
  )
5722
- if self.PAR.ops.show_selected_cells_border:
5723
- self.tag_raise(iid)
5724
- else:
5725
- self.tag_lower(iid)
5738
+ if lower_selection_boxes:
5726
5739
  self.lower_selection_boxes()
5727
5740
  return iid
5728
5741
 
@@ -5871,19 +5884,25 @@ class MainTable(tk.Canvas):
5871
5884
  elif isinstance(set_current, tuple):
5872
5885
  curr_r = set_current[0]
5873
5886
  curr_c = set_current[1]
5874
- self.create_currently_selected_box(curr_r, curr_c, type_, fill_iid)
5887
+ self.create_currently_selected_box(curr_r, curr_c, type_, fill_iid, lower_selection_boxes=False)
5875
5888
  self.lower_selection_boxes()
5876
5889
  if run_binding:
5877
5890
  self.run_selection_binding(type_)
5878
5891
  return fill_iid
5879
5892
 
5880
5893
  def lower_selection_boxes(self) -> None:
5881
- for iid, box in reversed(self.selection_boxes.items()):
5882
- self.tag_lower(iid)
5883
- self.RI.tag_lower(box.index)
5884
- self.CH.tag_lower(box.header)
5885
- if self.PAR.ops.show_selected_cells_border and self.selected:
5886
- self.tag_raise(self.selected.iid)
5894
+ if self.selected:
5895
+ if not self.PAR.ops.show_selected_cells_border:
5896
+ self.tag_lower(self.selected.iid)
5897
+ self.tag_lower("rows")
5898
+ self.tag_lower("columns")
5899
+ self.tag_lower("cells")
5900
+ self.RI.tag_lower("rows")
5901
+ self.RI.tag_lower("cells")
5902
+ self.CH.tag_lower("columns")
5903
+ self.CH.tag_lower("cells")
5904
+ if self.PAR.ops.show_selected_cells_border:
5905
+ self.tag_raise(self.selected.iid)
5887
5906
 
5888
5907
  def recreate_selection_box(
5889
5908
  self,
@@ -6418,12 +6437,12 @@ class MainTable(tk.Canvas):
6418
6437
  }
6419
6438
  ),
6420
6439
  "sheet_ops": self.PAR.ops,
6421
- "border_color": self.PAR.ops.table_selected_cells_border_fg,
6440
+ "border_color": self.PAR.ops.table_selected_box_cells_fg,
6422
6441
  "text": text,
6423
6442
  "state": state,
6424
6443
  "width": w,
6425
6444
  "height": h,
6426
- "show_border": self.PAR.ops.show_selected_cells_border,
6445
+ "show_border": True,
6427
6446
  "bg": bg,
6428
6447
  "fg": fg,
6429
6448
  "align": self.get_cell_align(r, c),
@@ -6462,6 +6481,8 @@ class MainTable(tk.Canvas):
6462
6481
  check_lines: bool = True,
6463
6482
  ) -> None:
6464
6483
  curr_height = self.text_editor.window.winfo_height()
6484
+ if curr_height < self.min_row_height:
6485
+ return
6465
6486
  if not check_lines or self.get_lines_cell_height(self.text_editor.window.get_num_lines() + 1) > curr_height:
6466
6487
  new_height = curr_height + self.table_xtra_lines_increment
6467
6488
  space_bot = self.get_space_bot(r)
@@ -6761,6 +6782,7 @@ class MainTable(tk.Canvas):
6761
6782
  if not self.open_text_editor(event=event, r=r, c=c, dropdown=True):
6762
6783
  return
6763
6784
  win_h, anchor = self.get_dropdown_height_anchor(r, c)
6785
+ win_w = self.col_positions[c + 1] - self.col_positions[c] + 1
6764
6786
  if anchor == "nw":
6765
6787
  if kwargs["state"] == "normal":
6766
6788
  ypos = self.row_positions[r] + self.text_editor.window.winfo_height() - 1
@@ -6768,33 +6790,29 @@ class MainTable(tk.Canvas):
6768
6790
  ypos = self.row_positions[r + 1]
6769
6791
  else:
6770
6792
  ypos = self.row_positions[r]
6771
- if self.dropdown.window is not None:
6772
- self.dropdown.window.search_function = kwargs["search_function"]
6773
- self.dropdown.window.r = r
6774
- self.dropdown.window.c = c
6775
- self.dropdown.window.row = -1
6776
- self.dropdown.window.set_options()
6777
- self.dropdown.window.values(kwargs["values"])
6778
- if not self.dropdown.open:
6779
- self.itemconfig(self.dropdown.canvas_id, state="normal")
6793
+ reset_kwargs = {
6794
+ "r": r,
6795
+ "c": c,
6796
+ "width": win_w,
6797
+ "height": win_h,
6798
+ "font": self.PAR.ops.table_font,
6799
+ "ops": self.PAR.ops,
6800
+ "outline_color": self.get_selected_box_bg_fg(type_="cells")[1],
6801
+ "align": self.get_cell_align(r, c),
6802
+ "values": kwargs["values"],
6803
+ }
6804
+ if self.dropdown.window:
6805
+ self.dropdown.window.reset(**reset_kwargs)
6806
+ self.itemconfig(self.dropdown.canvas_id, state="normal")
6780
6807
  self.coords(self.dropdown.canvas_id, self.col_positions[c], ypos)
6781
6808
  else:
6782
6809
  self.dropdown.window = self.PAR.dropdown_class(
6783
6810
  self.winfo_toplevel(),
6784
- r,
6785
- c,
6786
- width=self.col_positions[c + 1] - self.col_positions[c] + 1,
6787
- height=win_h,
6788
- font=self.PAR.ops.table_font,
6789
- ops=self.PAR.ops,
6790
- outline_color=self.get_selected_box_bg_fg(type_="cells")[1],
6791
- outline_thickness=2,
6792
- values=kwargs["values"],
6811
+ **reset_kwargs,
6793
6812
  close_dropdown_window=self.close_dropdown_window,
6794
6813
  search_function=kwargs["search_function"],
6795
6814
  arrowkey_RIGHT=self.arrowkey_RIGHT,
6796
6815
  arrowkey_LEFT=self.arrowkey_LEFT,
6797
- align="w", # self.get_cell_align(r, c)
6798
6816
  )
6799
6817
  self.dropdown.canvas_id = self.create_window(
6800
6818
  (self.col_positions[c], ypos),
tksheet/row_index.py CHANGED
@@ -266,7 +266,9 @@ class RowIndex(tk.Canvas):
266
266
  if self.MT.selected and self.MT.selected.type_ == "rows":
267
267
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
268
268
  self.MT.deselect("all", redraw=False)
269
- self.being_drawn_item = self.MT.create_selection_box(*self.get_shift_select_box(r, r_to_sel), "rows")
269
+ self.being_drawn_item = self.MT.create_selection_box(
270
+ *self.get_shift_select_box(r, r_to_sel), "rows"
271
+ )
270
272
  self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
271
273
  else:
272
274
  self.being_drawn_item = self.select_row(r, run_binding_func=False)
@@ -1756,9 +1758,9 @@ class RowIndex(tk.Canvas):
1756
1758
  if not self.MT.see(r=r, c=0, keep_yscroll=True, check_cell_visibility=True):
1757
1759
  self.MT.refresh()
1758
1760
  x = 0
1759
- y = self.MT.row_positions[r] + 1
1761
+ y = self.MT.row_positions[r]
1760
1762
  w = self.current_width + 1
1761
- h = self.MT.row_positions[r + 1] - y
1763
+ h = self.MT.row_positions[r + 1] - y + 1
1762
1764
  datarn = r if self.MT.all_rows_displayed else self.MT.displayed_rows[r]
1763
1765
  if text is None:
1764
1766
  text = self.get_cell_data(datarn, none_to_empty_str=True, redirect_int=True)
@@ -1774,12 +1776,12 @@ class RowIndex(tk.Canvas):
1774
1776
  }
1775
1777
  ),
1776
1778
  "sheet_ops": self.PAR.ops,
1777
- "border_color": self.PAR.ops.table_selected_cells_border_fg,
1779
+ "border_color": self.PAR.ops.index_selected_rows_bg,
1778
1780
  "text": text,
1779
1781
  "state": state,
1780
1782
  "width": w,
1781
1783
  "height": h,
1782
- "show_border": self.PAR.ops.show_selected_cells_border,
1784
+ "show_border": True,
1783
1785
  "bg": bg,
1784
1786
  "fg": fg,
1785
1787
  "align": self.get_cell_align(r),
@@ -1809,42 +1811,45 @@ class RowIndex(tk.Canvas):
1809
1811
  return True
1810
1812
 
1811
1813
  def text_editor_newline_binding(self, r=0, c=0, event: object = None, check_lines=True):
1812
- if self.height_resizing_enabled:
1813
- curr_height = self.text_editor.window.winfo_height()
1814
- if (
1815
- not check_lines
1816
- or self.MT.get_lines_cell_height(
1817
- self.text_editor.window.get_num_lines() + 1,
1818
- font=self.PAR.ops.index_font,
1819
- )
1820
- > curr_height
1821
- ):
1822
- new_height = curr_height + self.MT.index_xtra_lines_increment
1823
- space_bot = self.MT.get_space_bot(r)
1824
- if new_height > space_bot:
1825
- new_height = space_bot
1826
- if new_height != curr_height:
1827
- self.set_row_height(r, new_height)
1828
- self.MT.refresh()
1829
- self.text_editor.window.config(height=new_height)
1830
- self.coords(self.text_editor.canvas_id, 0, self.MT.row_positions[r] + 1)
1831
- if self.dropdown.open and self.dropdown.get_coords() == r:
1832
- text_editor_h = self.text_editor.window.winfo_height()
1833
- win_h, anchor = self.get_dropdown_height_anchor(r, text_editor_h)
1834
- if anchor == "nw":
1835
- self.coords(
1836
- self.dropdown.canvas_id,
1837
- self.MT.col_positions[c],
1838
- self.MT.row_positions[r] + text_editor_h - 1,
1839
- )
1840
- self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1841
- elif anchor == "sw":
1842
- self.coords(
1843
- self.dropdown.canvas_id,
1844
- self.MT.col_positions[c],
1845
- self.MT.row_positions[r],
1846
- )
1847
- self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1814
+ if not self.height_resizing_enabled:
1815
+ return
1816
+ curr_height = self.text_editor.window.winfo_height()
1817
+ if curr_height < self.MT.min_row_height:
1818
+ return
1819
+ if (
1820
+ not check_lines
1821
+ or self.MT.get_lines_cell_height(
1822
+ self.text_editor.window.get_num_lines() + 1,
1823
+ font=self.PAR.ops.index_font,
1824
+ )
1825
+ > curr_height
1826
+ ):
1827
+ new_height = curr_height + self.MT.index_xtra_lines_increment
1828
+ space_bot = self.MT.get_space_bot(r)
1829
+ if new_height > space_bot:
1830
+ new_height = space_bot
1831
+ if new_height != curr_height:
1832
+ self.set_row_height(r, new_height)
1833
+ self.MT.refresh()
1834
+ self.text_editor.window.config(height=new_height)
1835
+ self.coords(self.text_editor.canvas_id, 0, self.MT.row_positions[r] + 1)
1836
+ if self.dropdown.open and self.dropdown.get_coords() == r:
1837
+ text_editor_h = self.text_editor.window.winfo_height()
1838
+ win_h, anchor = self.get_dropdown_height_anchor(r, text_editor_h)
1839
+ if anchor == "nw":
1840
+ self.coords(
1841
+ self.dropdown.canvas_id,
1842
+ self.MT.col_positions[c],
1843
+ self.MT.row_positions[r] + text_editor_h - 1,
1844
+ )
1845
+ self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1846
+ elif anchor == "sw":
1847
+ self.coords(
1848
+ self.dropdown.canvas_id,
1849
+ self.MT.col_positions[c],
1850
+ self.MT.row_positions[r],
1851
+ )
1852
+ self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
1848
1853
 
1849
1854
  def refresh_open_window_positions(self):
1850
1855
  if self.text_editor.open:
@@ -1981,33 +1986,32 @@ class RowIndex(tk.Canvas):
1981
1986
  if not self.open_text_editor(event=event, r=r, dropdown=True):
1982
1987
  return
1983
1988
  win_h, anchor = self.get_dropdown_height_anchor(r)
1989
+ win_w = self.current_width
1984
1990
  ypos = self.MT.row_positions[r + 1]
1985
- if self.dropdown.window is not None:
1986
- self.dropdown.window.search_function = kwargs["search_function"]
1987
- self.dropdown.window.r = r
1988
- self.dropdown.window.row = -1
1989
- self.dropdown.window.set_options()
1990
- self.dropdown.window.values(kwargs["values"])
1991
- if not self.dropdown.open:
1992
- self.itemconfig(self.dropdown.canvas_id, state="normal")
1991
+ reset_kwargs = {
1992
+ "r": r,
1993
+ "c": 0,
1994
+ "width": win_w,
1995
+ "height": win_h,
1996
+ "font": self.PAR.ops.index_font,
1997
+ "ops": self.PAR.ops,
1998
+ "outline_color": self.PAR.ops.popup_menu_fg,
1999
+ "align": self.get_cell_align(r),
2000
+ "values": kwargs["values"],
2001
+ }
2002
+ if self.dropdown.window:
2003
+ self.dropdown.window.reset(**reset_kwargs)
2004
+ self.itemconfig(self.dropdown.canvas_id, state="normal")
1993
2005
  self.coords(self.dropdown.canvas_id, 0, ypos)
1994
2006
  else:
1995
2007
  self.dropdown.window = self.PAR.dropdown_class(
1996
- self.MT.winfo_toplevel(),
1997
- r,
1998
- 0,
1999
- width=self.current_width,
2000
- height=win_h,
2001
- font=self.PAR.ops.index_font,
2002
- ops=self.PAR.ops,
2003
- outline_color=self.PAR.ops.popup_menu_fg,
2004
- values=kwargs["values"],
2008
+ self.winfo_toplevel(),
2009
+ **reset_kwargs,
2010
+ single_index="r",
2005
2011
  close_dropdown_window=self.close_dropdown_window,
2006
2012
  search_function=kwargs["search_function"],
2007
2013
  arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
2008
2014
  arrowkey_LEFT=self.MT.arrowkey_LEFT,
2009
- align="w",
2010
- single_index="r",
2011
2015
  )
2012
2016
  self.dropdown.canvas_id = self.create_window(
2013
2017
  (0, ypos),
tksheet/sheet.py CHANGED
@@ -14,6 +14,7 @@ from .column_headers import ColumnHeaders
14
14
  from .functions import (
15
15
  add_highlight,
16
16
  add_to_options,
17
+ convert_align,
17
18
  data_to_displayed_idxs,
18
19
  del_from_options,
19
20
  del_named_span_options,
@@ -314,14 +315,14 @@ class Sheet(tk.Frame):
314
315
  self.RI = RowIndex(
315
316
  parent=self,
316
317
  row_index_align=(
317
- self.convert_align(row_index_align) if row_index_align is not None else self.convert_align(index_align)
318
+ convert_align(row_index_align) if row_index_align is not None else convert_align(index_align)
318
319
  ),
319
320
  default_row_index=default_row_index,
320
321
  )
321
322
  self.CH = ColumnHeaders(
322
323
  parent=self,
323
324
  default_header=default_header,
324
- header_align=self.convert_align(header_align),
325
+ header_align=convert_align(header_align),
325
326
  )
326
327
  self.MT = MainTable(
327
328
  parent=self,
@@ -341,7 +342,7 @@ class Sheet(tk.Frame):
341
342
  row_index=row_index,
342
343
  index=index,
343
344
  zoom=zoom,
344
- align=self.convert_align(align),
345
+ align=convert_align(align),
345
346
  displayed_columns=displayed_columns,
346
347
  all_columns_displayed=all_columns_displayed,
347
348
  displayed_rows=displayed_rows,
@@ -2796,21 +2797,6 @@ class Sheet(tk.Frame):
2796
2797
  def header_font(self, newfont: tuple[str, int, str] | None = None) -> tuple[str, int, str]:
2797
2798
  return self.MT.set_header_font(newfont)
2798
2799
 
2799
- def convert_align(self, align: str | None) -> str | None:
2800
- if isinstance(align, str):
2801
- a = align.lower()
2802
- if a == "global":
2803
- return None
2804
- elif a in ("c", "center", "centre"):
2805
- return "center"
2806
- elif a in ("w", "west", "left"):
2807
- return "w"
2808
- elif a in ("e", "east", "right"):
2809
- return "e"
2810
- elif align is None:
2811
- return None
2812
- raise ValueError("Align must be one of the following values: c, center, w, west, left, e, east, right")
2813
-
2814
2800
  def table_align(
2815
2801
  self,
2816
2802
  align: str = None,
@@ -2818,8 +2804,8 @@ class Sheet(tk.Frame):
2818
2804
  ) -> str | Sheet:
2819
2805
  if align is None:
2820
2806
  return self.MT.align
2821
- elif self.convert_align(align):
2822
- self.MT.align = self.convert_align(align)
2807
+ elif convert_align(align):
2808
+ self.MT.align = convert_align(align)
2823
2809
  else:
2824
2810
  raise ValueError("Align must be one of the following values: c, center, w, west, e, east")
2825
2811
  self.set_refresh_timer(redraw)
@@ -2832,8 +2818,8 @@ class Sheet(tk.Frame):
2832
2818
  ) -> str | Sheet:
2833
2819
  if align is None:
2834
2820
  return self.CH.align
2835
- elif self.convert_align(align):
2836
- self.CH.align = self.convert_align(align)
2821
+ elif convert_align(align):
2822
+ self.CH.align = convert_align(align)
2837
2823
  else:
2838
2824
  raise ValueError("Align must be one of the following values: c, center, w, west, e, east")
2839
2825
  self.set_refresh_timer(redraw)
@@ -2846,8 +2832,8 @@ class Sheet(tk.Frame):
2846
2832
  ) -> str | Sheet:
2847
2833
  if align is None:
2848
2834
  return self.RI.align
2849
- elif self.convert_align(align):
2850
- self.RI.align = self.convert_align(align)
2835
+ elif convert_align(align):
2836
+ self.RI.align = convert_align(align)
2851
2837
  else:
2852
2838
  raise ValueError("Align must be one of the following values: c, center, w, west, e, east")
2853
2839
  self.set_refresh_timer(redraw)
@@ -2869,7 +2855,7 @@ class Sheet(tk.Frame):
2869
2855
  span = self.span_from_key(*key)
2870
2856
  rows, cols = self.ranges_from_span(span)
2871
2857
  table, index, header = span.table, span.index, span.header
2872
- align = self.convert_align(align)
2858
+ align = convert_align(align)
2873
2859
  if span.kind == "cell":
2874
2860
  if header:
2875
2861
  for c in cols:
@@ -3169,7 +3155,7 @@ class Sheet(tk.Frame):
3169
3155
  c1: int,
3170
3156
  r2: int,
3171
3157
  c2: int,
3172
- type_: str = "cells",
3158
+ type_: Literal["cells", "rows", "columns", "cols"] = "cells",
3173
3159
  ) -> int:
3174
3160
  return self.MT.create_selection_box(r1=r1, c1=c1, r2=r2, c2=c2, type_="columns" if type_ == "cols" else type_)
3175
3161
 
@@ -3179,9 +3165,9 @@ class Sheet(tk.Frame):
3179
3165
 
3180
3166
  def deselect(
3181
3167
  self,
3182
- row: int | None | str = None,
3168
+ row: int | None | Literal["all"] = None,
3183
3169
  column: int | None = None,
3184
- cell: tuple | None = None,
3170
+ cell: tuple[int, int] | None = None,
3185
3171
  redraw: bool = True,
3186
3172
  ) -> Sheet:
3187
3173
  self.MT.deselect(r=row, c=column, cell=cell, redraw=False)
@@ -3216,8 +3202,12 @@ class Sheet(tk.Frame):
3216
3202
  self.set_refresh_timer(redraw)
3217
3203
  return self
3218
3204
 
3219
- def set_all_cell_sizes_to_text(self, redraw: bool = True) -> tuple[list[float], list[float]]:
3220
- self.MT.set_all_cell_sizes_to_text()
3205
+ def set_all_cell_sizes_to_text(
3206
+ self,
3207
+ redraw: bool = True,
3208
+ width: int | None = None,
3209
+ ) -> tuple[list[float], list[float]]:
3210
+ self.MT.set_all_cell_sizes_to_text(w=width)
3221
3211
  self.set_refresh_timer(redraw)
3222
3212
  return self.MT.row_positions, self.MT.col_positions
3223
3213
 
@@ -4580,8 +4570,9 @@ class Sheet(tk.Frame):
4580
4570
  )
4581
4571
  else:
4582
4572
  self.RI.tree_open_ids.discard(item)
4573
+ rows = {self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)}
4583
4574
  self.hide_rows(
4584
- (self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item)),
4575
+ rows,
4585
4576
  redraw=False,
4586
4577
  deselect_all=False,
4587
4578
  data_indexes=True,
@@ -5526,13 +5517,13 @@ class Sheet(tk.Frame):
5526
5517
  ) -> None:
5527
5518
  if isinstance(cells, dict):
5528
5519
  for k, v in cells.items():
5529
- set_align(self.MT.cell_options, k, self.convert_align(v))
5520
+ set_align(self.MT.cell_options, k, convert_align(v))
5530
5521
  elif cells:
5531
- align = self.convert_align(align)
5522
+ align = convert_align(align)
5532
5523
  for k in cells:
5533
5524
  set_align(self.MT.cell_options, k, align)
5534
5525
  else:
5535
- set_align(self.MT.cell_options, (row, column), self.convert_align(align))
5526
+ set_align(self.MT.cell_options, (row, column), convert_align(align))
5536
5527
  self.set_refresh_timer(redraw)
5537
5528
 
5538
5529
  def align_rows(
@@ -5544,18 +5535,18 @@ class Sheet(tk.Frame):
5544
5535
  ) -> None:
5545
5536
  if isinstance(rows, dict):
5546
5537
  for k, v in rows.items():
5547
- align = self.convert_align(v)
5538
+ align = convert_align(v)
5548
5539
  set_align(self.MT.row_options, k, align)
5549
5540
  if align_index:
5550
5541
  set_align(self.RI.cell_options, k, align)
5551
5542
  elif is_iterable(rows):
5552
- align = self.convert_align(align)
5543
+ align = convert_align(align)
5553
5544
  for k in rows:
5554
5545
  set_align(self.MT.row_options, k, align)
5555
5546
  if align_index:
5556
5547
  set_align(self.RI.cell_options, k, align)
5557
5548
  elif isinstance(rows, int):
5558
- set_align(self.MT.row_options, rows, self.convert_align(align))
5549
+ set_align(self.MT.row_options, rows, convert_align(align))
5559
5550
  if align_index:
5560
5551
  set_align(self.RI.cell_options, rows, align)
5561
5552
  self.set_refresh_timer(redraw)
@@ -5569,18 +5560,18 @@ class Sheet(tk.Frame):
5569
5560
  ) -> None:
5570
5561
  if isinstance(columns, dict):
5571
5562
  for k, v in columns.items():
5572
- align = self.convert_align(v)
5563
+ align = convert_align(v)
5573
5564
  set_align(self.MT.col_options, k, align)
5574
5565
  if align_header:
5575
5566
  set_align(self.CH.cell_options, k, align)
5576
5567
  elif is_iterable(columns):
5577
- align = self.convert_align(align)
5568
+ align = convert_align(align)
5578
5569
  for k in columns:
5579
5570
  set_align(self.MT.col_options, k, align)
5580
5571
  if align_header:
5581
5572
  set_align(self.CH.cell_options, k, align)
5582
5573
  elif isinstance(columns, int):
5583
- set_align(self.MT.col_options, columns, self.convert_align(align))
5574
+ set_align(self.MT.col_options, columns, convert_align(align))
5584
5575
  if align_header:
5585
5576
  set_align(self.CH.cell_options, columns, align)
5586
5577
  self.set_refresh_timer(redraw)
@@ -5593,13 +5584,13 @@ class Sheet(tk.Frame):
5593
5584
  ) -> None:
5594
5585
  if isinstance(columns, dict):
5595
5586
  for k, v in columns.items():
5596
- set_align(self.CH.cell_options, k, self.convert_align(v))
5587
+ set_align(self.CH.cell_options, k, convert_align(v))
5597
5588
  elif is_iterable(columns):
5598
- align = self.convert_align(align)
5589
+ align = convert_align(align)
5599
5590
  for k in columns:
5600
5591
  set_align(self.CH.cell_options, k, align)
5601
5592
  elif isinstance(columns, int):
5602
- set_align(self.CH.cell_options, columns, self.convert_align(align))
5593
+ set_align(self.CH.cell_options, columns, convert_align(align))
5603
5594
  self.set_refresh_timer(redraw)
5604
5595
 
5605
5596
  def align_index(
@@ -5610,13 +5601,13 @@ class Sheet(tk.Frame):
5610
5601
  ) -> None:
5611
5602
  if isinstance(rows, dict):
5612
5603
  for k, v in rows.items():
5613
- set_align(self.RI.cell_options, k, self.convert_align(v))
5604
+ set_align(self.RI.cell_options, k, convert_align(v))
5614
5605
  elif is_iterable(rows):
5615
- align = self.convert_align(align)
5606
+ align = convert_align(align)
5616
5607
  for k in rows:
5617
5608
  set_align(self.RI.cell_options, k, align)
5618
5609
  elif isinstance(rows, int):
5619
- set_align(self.RI.cell_options, rows, self.convert_align(align))
5610
+ set_align(self.RI.cell_options, rows, convert_align(align))
5620
5611
  self.set_refresh_timer(redraw)
5621
5612
 
5622
5613
  def get_cell_alignments(self) -> dict:
@@ -6381,7 +6372,7 @@ class Dropdown(Sheet):
6381
6372
  width: int | None = None,
6382
6373
  height: int | None = None,
6383
6374
  font: None | tuple[str, int, str] = None,
6384
- outline_thickness: int = 2,
6375
+ outline_thickness: int = 1,
6385
6376
  values: list[object] = [],
6386
6377
  close_dropdown_window: Callable | None = None,
6387
6378
  search_function: Callable = dropdown_search_function,
@@ -6391,47 +6382,29 @@ class Dropdown(Sheet):
6391
6382
  # False for using r, c
6392
6383
  # "r" for r
6393
6384
  # "c" for c
6394
- single_index: str | bool = False,
6385
+ single_index: Literal["r", "c"] | bool = False,
6395
6386
  ) -> None:
6396
6387
  Sheet.__init__(
6397
6388
  self,
6398
6389
  parent=parent,
6399
6390
  outline_thickness=outline_thickness,
6400
- outline_color=outline_color,
6401
- table_grid_fg=ops.popup_menu_fg,
6402
6391
  show_horizontal_grid=True,
6403
6392
  show_vertical_grid=False,
6404
6393
  show_header=False,
6405
6394
  show_row_index=False,
6406
6395
  show_top_left=False,
6407
- # alignments other than w for dropdown boxes are broken at the moment
6408
- align="w",
6409
6396
  empty_horizontal=0,
6410
6397
  empty_vertical=0,
6411
6398
  selected_rows_to_end_of_window=True,
6412
6399
  horizontal_grid_to_end_of_window=True,
6413
6400
  set_cell_sizes_on_zoom=True,
6414
6401
  show_selected_cells_border=False,
6415
- table_selected_cells_border_fg=ops.popup_menu_fg,
6416
- table_selected_cells_bg=ops.popup_menu_highlight_bg,
6417
- table_selected_rows_border_fg=ops.popup_menu_fg,
6418
- table_selected_rows_bg=ops.popup_menu_highlight_bg,
6419
- table_selected_rows_fg=ops.popup_menu_highlight_fg,
6420
- width=width,
6421
- height=height,
6422
- font=font if font else self.ops.table_font,
6423
- table_fg=ops.popup_menu_fg,
6424
- table_bg=ops.popup_menu_bg,
6425
- **{k: ops[k] for k in scrollbar_options_keys},
6426
6402
  )
6427
6403
  self.parent = parent
6428
6404
  self.close_dropdown_window = close_dropdown_window
6429
6405
  self.search_function = search_function
6430
6406
  self.arrowkey_RIGHT = arrowkey_RIGHT
6431
6407
  self.arrowkey_LEFT = arrowkey_LEFT
6432
- self.r = r
6433
- self.c = c
6434
- self.row = -1
6435
6408
  self.single_index = single_index
6436
6409
  self.bind("<Motion>", self.mouse_motion)
6437
6410
  self.bind("<ButtonPress-1>", self.b1)
@@ -6443,11 +6416,43 @@ class Dropdown(Sheet):
6443
6416
  self.bind("<Prior>", self.arrowkey_UP)
6444
6417
  self.bind("<Next>", self.arrowkey_DOWN)
6445
6418
  self.bind("<Return>", self.b1)
6446
- if values:
6447
- self.values(values)
6419
+ self.reset(r, c, width, height, font, ops, outline_color, align, values)
6420
+
6421
+ def reset(
6422
+ self,
6423
+ r: int,
6424
+ c: int,
6425
+ width: int,
6426
+ height: int,
6427
+ font: tuple[str, int, str],
6428
+ ops: DotDict,
6429
+ outline_color: str,
6430
+ align: str,
6431
+ values: list[object] | None = None,
6432
+ ) -> None:
6433
+ self.r = r
6434
+ self.c = c
6435
+ self.row = -1
6436
+ self.height_and_width(height=height, width=width)
6437
+ self.table_align(align)
6438
+ self.set_options(
6439
+ outline_color=outline_color,
6440
+ table_grid_fg=ops.popup_menu_fg,
6441
+ table_selected_cells_border_fg=ops.popup_menu_fg,
6442
+ table_selected_cells_bg=ops.popup_menu_highlight_bg,
6443
+ table_selected_rows_border_fg=ops.popup_menu_fg,
6444
+ table_selected_rows_bg=ops.popup_menu_highlight_bg,
6445
+ table_selected_rows_fg=ops.popup_menu_highlight_fg,
6446
+ table_selected_box_cells_fg=ops.popup_menu_highlight_bg,
6447
+ table_selected_box_rows_fg=ops.popup_menu_highlight_bg,
6448
+ font=font,
6449
+ table_fg=ops.popup_menu_fg,
6450
+ table_bg=ops.popup_menu_bg,
6451
+ **{k: ops[k] for k in scrollbar_options_keys},
6452
+ )
6453
+ self.values(values, width=width - self.yscroll.winfo_width() - 4)
6448
6454
 
6449
6455
  def arrowkey_UP(self, event: object = None) -> None:
6450
- self.deselect("all")
6451
6456
  if self.row > 0:
6452
6457
  self.row -= 1
6453
6458
  else:
@@ -6456,7 +6461,6 @@ class Dropdown(Sheet):
6456
6461
  self.select_row(self.row)
6457
6462
 
6458
6463
  def arrowkey_DOWN(self, event: object = None) -> None:
6459
- self.deselect("all")
6460
6464
  if len(self.MT.data) - 1 > self.row:
6461
6465
  self.row += 1
6462
6466
  self.see(self.row, 0, redraw=False)
@@ -6474,7 +6478,6 @@ class Dropdown(Sheet):
6474
6478
  row = self.identify_row(event, exclude_index=True, allow_end=False)
6475
6479
  if row is not None and row != self.row:
6476
6480
  self.row = row
6477
- self.deselect("all", redraw=False)
6478
6481
  self.select_row(self.row)
6479
6482
 
6480
6483
  def _reselect(self) -> None:
@@ -6514,7 +6517,12 @@ class Dropdown(Sheet):
6514
6517
  return self.c
6515
6518
  return self.r, self.c
6516
6519
 
6517
- def values(self, values: list = [], redraw: bool = True) -> None:
6520
+ def values(
6521
+ self,
6522
+ values: list = [],
6523
+ redraw: bool = True,
6524
+ width: int | None = None,
6525
+ ) -> None:
6518
6526
  self.set_sheet_data(
6519
6527
  [[v] for v in values],
6520
6528
  reset_col_positions=False,
@@ -6522,4 +6530,4 @@ class Dropdown(Sheet):
6522
6530
  redraw=False,
6523
6531
  verify=False,
6524
6532
  )
6525
- self.set_all_cell_sizes_to_text(redraw=redraw)
6533
+ self.set_all_cell_sizes_to_text(redraw=redraw, width=width)
tksheet/text_editor.py CHANGED
@@ -4,6 +4,9 @@ import tkinter as tk
4
4
  from collections.abc import Callable
5
5
  from typing import Literal
6
6
 
7
+ from .functions import (
8
+ convert_align,
9
+ )
7
10
  from .other_classes import (
8
11
  DotDict,
9
12
  )
@@ -91,16 +94,15 @@ class TextEditorTkText(tk.Text):
91
94
  command=self.undo,
92
95
  **menu_kwargs,
93
96
  )
94
- self.delete(1.0, "end")
95
- self.insert(1.0, text)
96
- self.yview_moveto(1)
97
- self.tag_configure("align", justify=self.align)
97
+ align = convert_align(align)
98
98
  if align == "w":
99
99
  self.align = "left"
100
- elif align == "center":
101
- self.align = "center"
102
100
  elif align == "e":
103
101
  self.align = "right"
102
+ self.delete(1.0, "end")
103
+ self.insert(1.0, text)
104
+ self.yview_moveto(1)
105
+ self.tag_configure("align", justify=self.align)
104
106
  self.tag_add("align", 1.0, "end")
105
107
 
106
108
  def _proxy(self, command: object, *args) -> object:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.4
3
+ Version: 7.1.5
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=bzXUATwg31SEbu5F3bS-MFBDpi4MAuMZ0TPh49RAonU,1874
2
+ tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
+ tksheet/column_headers.py,sha256=9LOi8-Xr7_h0UlF277VDVg_UWQ3UGVwD9fufwq3SbMU,99272
4
+ tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
+ tksheet/functions.py,sha256=PN2qanv32V4Hg221b-999fEH4yxYNoze925txUP5kA4,39245
6
+ tksheet/main_table.py,sha256=QHFqCkCWkiecHBjbiGBJSJ0SoMp2htXBCpkLIMQEeWI,318511
7
+ tksheet/other_classes.py,sha256=Hjr7c0kD2_880xjtGuFn9gQ-7ED5kSiNahniBeXcf84,13604
8
+ tksheet/row_index.py,sha256=ZPBiKNB5NghU_Q-LEqWrC9-VqaVYj__DodenDSR_oeA,103990
9
+ tksheet/sheet.py,sha256=ho4dGIco8GTCJluFZcJhOJNgnJTA_S_dMm-xU4cJPGo,256866
10
+ tksheet/sheet_options.py,sha256=Vcy4RxTKvf2HM-Yc53ex0lpBe6ATXc_pdx4oLhfjDgU,11906
11
+ tksheet/text_editor.py,sha256=81_IZKrTVa2KIx2cJ4n3cFvFMAwvbHIQYgqtyat-97I,6681
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.5.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
+ tksheet-7.1.5.dist-info/METADATA,sha256=WBm8p-qBsL207lJ6_tznMJE9Vo62iKaZmj-nmyj-UbE,6013
18
+ tksheet-7.1.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
+ tksheet-7.1.5.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
+ tksheet-7.1.5.dist-info/RECORD,,
@@ -1,20 +0,0 @@
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,,