tksheet 7.1.24__tar.gz → 7.2.1__tar.gz

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.
Files changed (24) hide show
  1. {tksheet-7.1.24/tksheet.egg-info → tksheet-7.2.1}/PKG-INFO +1 -1
  2. {tksheet-7.1.24 → tksheet-7.2.1}/pyproject.toml +1 -1
  3. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/__init__.py +1 -1
  4. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/column_headers.py +31 -16
  5. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/main_table.py +40 -16
  6. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/row_index.py +29 -16
  7. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/sheet.py +70 -21
  8. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/text_editor.py +1 -1
  9. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/themes.py +5 -5
  10. {tksheet-7.1.24 → tksheet-7.2.1/tksheet.egg-info}/PKG-INFO +1 -1
  11. {tksheet-7.1.24 → tksheet-7.2.1}/LICENSE.txt +0 -0
  12. {tksheet-7.1.24 → tksheet-7.2.1}/README.md +0 -0
  13. {tksheet-7.1.24 → tksheet-7.2.1}/setup.cfg +0 -0
  14. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/colors.py +0 -0
  15. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/formatters.py +0 -0
  16. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/functions.py +0 -0
  17. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/other_classes.py +0 -0
  18. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/sheet_options.py +0 -0
  19. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/top_left_rectangle.py +0 -0
  20. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/types.py +0 -0
  21. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet/vars.py +0 -0
  22. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet.egg-info/SOURCES.txt +0 -0
  23. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet.egg-info/dependency_links.txt +0 -0
  24. {tksheet-7.1.24 → tksheet-7.2.1}/tksheet.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.24
3
+ Version: 7.2.1
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
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
  name = "tksheet"
7
7
  description = "Tkinter table / sheet widget"
8
8
  readme = "README.md"
9
- version = "7.1.24"
9
+ version = "7.2.1"
10
10
  authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
11
11
  requires-python = ">=3.8"
12
12
  license = {file = "LICENSE.txt"}
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.1.24"
7
+ __version__ = "7.2.1"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
@@ -771,11 +771,9 @@ class ColumnHeaders(tk.Canvas):
771
771
  return False
772
772
 
773
773
  def b1_release(self, event: object) -> None:
774
- if self.being_drawn_item is not None:
775
- to_sel = self.MT.coords_and_type(self.being_drawn_item)
774
+ if self.being_drawn_item is not None and (to_sel := self.MT.coords_and_type(self.being_drawn_item)):
776
775
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
777
776
  self.MT.hide_selection_box(self.being_drawn_item)
778
- self.being_drawn_item = None
779
777
  self.MT.set_currently_selected(
780
778
  r_to_sel,
781
779
  c_to_sel,
@@ -784,6 +782,8 @@ class ColumnHeaders(tk.Canvas):
784
782
  sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
785
783
  try_binding(self.drag_selection_binding_func, sel_event)
786
784
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
785
+ else:
786
+ self.being_drawn_item = None
787
787
  self.MT.bind("<MouseWheel>", self.MT.mousewheel)
788
788
  if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
789
789
  self.currently_resizing_width = False
@@ -903,12 +903,13 @@ class ColumnHeaders(tk.Canvas):
903
903
 
904
904
  def toggle_select_col(
905
905
  self,
906
- column,
907
- add_selection=True,
908
- redraw=True,
909
- run_binding_func=True,
910
- set_as_current=True,
911
- ):
906
+ column: int,
907
+ add_selection: bool = True,
908
+ redraw: bool = True,
909
+ run_binding_func: bool = True,
910
+ set_as_current: bool = True,
911
+ ext: bool = False,
912
+ ) -> int:
912
913
  if add_selection:
913
914
  if self.MT.col_selected(column):
914
915
  fill_iid = self.MT.deselect(c=column, redraw=redraw)
@@ -918,26 +919,40 @@ class ColumnHeaders(tk.Canvas):
918
919
  redraw=redraw,
919
920
  run_binding_func=run_binding_func,
920
921
  set_as_current=set_as_current,
922
+ ext=ext,
921
923
  )
922
924
  else:
923
925
  if self.MT.col_selected(column):
924
926
  fill_iid = self.MT.deselect(c=column, redraw=redraw)
925
927
  else:
926
- fill_iid = self.select_col(column, redraw=redraw)
928
+ fill_iid = self.select_col(column, redraw=redraw, ext=ext)
927
929
  return fill_iid
928
930
 
929
- def select_col(self, c, redraw=False, run_binding_func=True):
931
+ def select_col(
932
+ self,
933
+ c: int,
934
+ redraw: bool = False,
935
+ run_binding_func: bool = True,
936
+ ext: bool = False,
937
+ ) -> int:
930
938
  self.MT.deselect("all", redraw=False)
931
- fill_iid = self.MT.create_selection_box(0, c, len(self.MT.row_positions) - 1, c + 1, "columns")
939
+ fill_iid = self.MT.create_selection_box(0, c, len(self.MT.row_positions) - 1, c + 1, "columns", ext=ext)
932
940
  if redraw:
933
941
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
934
942
  if run_binding_func:
935
943
  self.MT.run_selection_binding("columns")
936
944
  return fill_iid
937
945
 
938
- def add_selection(self, c, redraw=False, run_binding_func=True, set_as_current=True):
946
+ def add_selection(
947
+ self,
948
+ c: int,
949
+ redraw: bool = False,
950
+ run_binding_func: bool = True,
951
+ set_as_current: bool = True,
952
+ ext: bool = False,
953
+ ) -> int:
939
954
  box = (0, c, len(self.MT.row_positions) - 1, c + 1, "columns")
940
- fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current)
955
+ fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current, ext=ext)
941
956
  if redraw:
942
957
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
943
958
  if run_binding_func:
@@ -1607,11 +1622,11 @@ class ColumnHeaders(tk.Canvas):
1607
1622
 
1608
1623
  def get_redraw_selections(self, startc: int, endc: int) -> dict[str, set[int]]:
1609
1624
  d = defaultdict(set)
1610
- for item, box in self.MT.get_selection_items(rows=False):
1625
+ for item, box in self.MT.get_selection_items():
1611
1626
  r1, c1, r2, c2 = box.coords
1612
1627
  for c in range(startc, endc):
1613
1628
  if c1 <= c and c2 > c:
1614
- d[box.type_].add(c)
1629
+ d[box.type_ if box.type_ != "rows" else "cells"].add(c)
1615
1630
  return d
1616
1631
 
1617
1632
  def open_cell(self, event: object = None, ignore_existing_editor=False):
@@ -1851,9 +1851,10 @@ class MainTable(tk.Canvas):
1851
1851
  c: int,
1852
1852
  redraw: bool = False,
1853
1853
  run_binding_func: bool = True,
1854
+ ext: bool = False,
1854
1855
  ) -> int:
1855
1856
  self.deselect("all", redraw=False)
1856
- fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden")
1857
+ fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden", ext=ext)
1857
1858
  if redraw:
1858
1859
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
1859
1860
  if run_binding_func:
@@ -1867,8 +1868,9 @@ class MainTable(tk.Canvas):
1867
1868
  redraw: bool = False,
1868
1869
  run_binding_func: bool = True,
1869
1870
  set_as_current: bool = False,
1871
+ ext: bool = False,
1870
1872
  ) -> int:
1871
- fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden", set_current=set_as_current)
1873
+ fill_iid = self.create_selection_box(r, c, r + 1, c + 1, state="hidden", set_current=set_as_current, ext=ext)
1872
1874
  if redraw:
1873
1875
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
1874
1876
  if run_binding_func:
@@ -1883,6 +1885,7 @@ class MainTable(tk.Canvas):
1883
1885
  redraw: bool = True,
1884
1886
  run_binding_func: bool = True,
1885
1887
  set_as_current: bool = True,
1888
+ ext: bool = False,
1886
1889
  ) -> int | None:
1887
1890
  if add_selection:
1888
1891
  if self.cell_selected(row, column, inc_rows=True, inc_cols=True):
@@ -1894,12 +1897,13 @@ class MainTable(tk.Canvas):
1894
1897
  redraw=redraw,
1895
1898
  run_binding_func=run_binding_func,
1896
1899
  set_as_current=set_as_current,
1900
+ ext=ext,
1897
1901
  )
1898
1902
  else:
1899
1903
  if self.cell_selected(row, column, inc_rows=True, inc_cols=True):
1900
1904
  fill_iid = self.deselect(r=row, c=column, redraw=redraw)
1901
1905
  else:
1902
- fill_iid = self.select_cell(row, column, redraw=redraw)
1906
+ fill_iid = self.select_cell(row, column, redraw=redraw, ext=ext)
1903
1907
  return fill_iid
1904
1908
 
1905
1909
  def get_select_event(self, being_drawn_item: None | int = None) -> EventDataDict:
@@ -3079,11 +3083,9 @@ class MainTable(tk.Canvas):
3079
3083
  self.b1_motion(event)
3080
3084
 
3081
3085
  def b1_release(self, event=None):
3082
- if self.being_drawn_item is not None:
3083
- to_sel = self.coords_and_type(self.being_drawn_item)
3086
+ if self.being_drawn_item is not None and (to_sel := self.coords_and_type(self.being_drawn_item)):
3084
3087
  r_to_sel, c_to_sel = self.selected.row, self.selected.column
3085
3088
  self.hide_selection_box(self.being_drawn_item)
3086
- self.being_drawn_item = None
3087
3089
  self.set_currently_selected(
3088
3090
  r_to_sel,
3089
3091
  c_to_sel,
@@ -3101,6 +3103,8 @@ class MainTable(tk.Canvas):
3101
3103
  if self.drag_selection_binding_func:
3102
3104
  self.drag_selection_binding_func(sel_event)
3103
3105
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3106
+ else:
3107
+ self.being_drawn_item = None
3104
3108
  if self.RI.width_resizing_enabled and self.RI.rsz_w is not None and self.RI.currently_resizing_width:
3105
3109
  self.delete_resize_lines()
3106
3110
  self.RI.delete_resize_lines()
@@ -3466,7 +3470,7 @@ class MainTable(tk.Canvas):
3466
3470
  def get_lines_cell_height(self, n, font=None):
3467
3471
  return (
3468
3472
  self.get_txt_h(
3469
- txt="\n".join("|" for lines in range(n)) if n > 1 else "|",
3473
+ txt="\n".join("|" for _ in range(n)) if n > 1 else "|",
3470
3474
  font=self.PAR.ops.table_font if font is None else font,
3471
3475
  )
3472
3476
  + 5
@@ -3484,12 +3488,20 @@ class MainTable(tk.Canvas):
3484
3488
 
3485
3489
  def get_default_row_height(self) -> int:
3486
3490
  if isinstance(self.PAR.ops.default_row_height, str):
3487
- return self.get_lines_cell_height(int(self.PAR.ops.default_row_height))
3491
+ if int(self.PAR.ops.default_row_height) == 1:
3492
+ return self.min_row_height
3493
+ else:
3494
+ return self.min_row_height + self.get_lines_cell_height(int(self.PAR.ops.default_row_height) - 1)
3488
3495
  return self.PAR.ops.default_row_height
3489
3496
 
3490
3497
  def get_default_header_height(self) -> int:
3491
3498
  if isinstance(self.PAR.ops.default_header_height, str):
3492
- return self.get_lines_cell_height(int(self.PAR.ops.default_header_height), font=self.PAR.ops.header_font)
3499
+ if int(self.PAR.ops.default_header_height) == 1:
3500
+ return self.min_header_height
3501
+ else:
3502
+ return self.min_header_height + self.get_lines_cell_height(
3503
+ int(self.PAR.ops.default_header_height) - 1, font=self.PAR.ops.header_font
3504
+ )
3493
3505
  return self.PAR.ops.default_header_height
3494
3506
 
3495
3507
  def set_table_font(self, newfont: tuple | None = None, reset_row_positions: bool = False) -> tuple[str, int, str]:
@@ -3519,8 +3531,8 @@ class MainTable(tk.Canvas):
3519
3531
  self.table_first_ln_ins = self.table_half_txt_height + 2
3520
3532
  else:
3521
3533
  self.table_first_ln_ins = self.table_half_txt_height + 3
3534
+ self.min_row_height = int(self.table_first_ln_ins * 2.22)
3522
3535
  self.table_xtra_lines_increment = int(self.table_txt_height)
3523
- self.min_row_height = self.table_txt_height + 5
3524
3536
  if self.min_row_height < 12:
3525
3537
  self.min_row_height = 12
3526
3538
  self.set_min_column_width()
@@ -3548,7 +3560,7 @@ class MainTable(tk.Canvas):
3548
3560
  else:
3549
3561
  self.header_first_ln_ins = self.header_half_txt_height + 3
3550
3562
  self.header_xtra_lines_increment = self.header_txt_height
3551
- self.min_header_height = self.header_txt_height + 5
3563
+ self.min_header_height = int(self.header_first_ln_ins * 2.22)
3552
3564
  if (
3553
3565
  isinstance(self.PAR.ops.default_header_height, int)
3554
3566
  and self.PAR.ops.default_header_height < self.min_header_height
@@ -5381,6 +5393,10 @@ class MainTable(tk.Canvas):
5381
5393
  if resized_cols or resized_rows or changed_w:
5382
5394
  self.recreate_all_selection_boxes()
5383
5395
  if changed_w:
5396
+ self.update_idletasks()
5397
+ self.RI.update_idletasks()
5398
+ self.CH.update_idletasks()
5399
+ self.TL.update_idletasks()
5384
5400
  return False
5385
5401
  self.hidd_text.update(self.disp_text)
5386
5402
  self.disp_text = {}
@@ -5923,7 +5939,7 @@ class MainTable(tk.Canvas):
5923
5939
  self.hidd_boxes.add(item)
5924
5940
  self.itemconfig(item, state="hidden")
5925
5941
 
5926
- def hide_selection_box(self, item: int | None, set_current: bool = True) -> bool:
5942
+ def hide_selection_box(self, item: int | None) -> bool:
5927
5943
  if item is None or item is True:
5928
5944
  return
5929
5945
  box = self.selection_boxes.pop(item)
@@ -5934,6 +5950,12 @@ class MainTable(tk.Canvas):
5934
5950
  if self.selected.fill_iid == item:
5935
5951
  self.hide_selected()
5936
5952
  self.set_current_to_last()
5953
+ if item == self.being_drawn_item:
5954
+ self.being_drawn_item = None
5955
+ elif item == self.RI.being_drawn_item:
5956
+ self.RI.being_drawn_item = None
5957
+ elif item == self.CH.being_drawn_item:
5958
+ self.CH.being_drawn_item = None
5937
5959
  return True
5938
5960
 
5939
5961
  def hide_selected(self) -> None:
@@ -5951,6 +5973,7 @@ class MainTable(tk.Canvas):
5951
5973
  state: str = "normal",
5952
5974
  set_current: bool | tuple[int, int] = True,
5953
5975
  run_binding: bool = False,
5976
+ ext: bool = False,
5954
5977
  ) -> int:
5955
5978
  if self.col_positions == [0]:
5956
5979
  c1 = 0
@@ -6005,7 +6028,8 @@ class MainTable(tk.Canvas):
6005
6028
  )
6006
6029
  bd_iid = None
6007
6030
  if self.PAR.ops.show_selected_cells_border and (
6008
- (self.being_drawn_item is None and self.RI.being_drawn_item is None and self.CH.being_drawn_item is None)
6031
+ ext
6032
+ or (self.being_drawn_item is None and self.RI.being_drawn_item is None and self.CH.being_drawn_item is None)
6009
6033
  or self.selection_boxes
6010
6034
  ):
6011
6035
  bd_iid = self.display_box(
@@ -6996,9 +7020,9 @@ class MainTable(tk.Canvas):
6996
7020
  return self.mouseclick_outside_editor_or_dropdown()
6997
7021
 
6998
7022
  def hide_dropdown_editor_all_canvases(self):
6999
- self.hide_text_editor_and_dropdown()
7000
- self.RI.hide_text_editor_and_dropdown()
7001
- self.CH.hide_text_editor_and_dropdown()
7023
+ self.hide_text_editor_and_dropdown(redraw=False)
7024
+ self.RI.hide_text_editor_and_dropdown(redraw=False)
7025
+ self.CH.hide_text_editor_and_dropdown(redraw=False)
7002
7026
 
7003
7027
  def hide_dropdown_window(self) -> None:
7004
7028
  if self.dropdown.open:
@@ -772,11 +772,9 @@ class RowIndex(tk.Canvas):
772
772
  return False
773
773
 
774
774
  def b1_release(self, event: object) -> None:
775
- if self.being_drawn_item is not None:
776
- to_sel = self.MT.coords_and_type(self.being_drawn_item)
775
+ if self.being_drawn_item is not None and (to_sel := self.MT.coords_and_type(self.being_drawn_item)):
777
776
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
778
777
  self.MT.hide_selection_box(self.being_drawn_item)
779
- self.being_drawn_item = None
780
778
  self.MT.set_currently_selected(
781
779
  r_to_sel,
782
780
  c_to_sel,
@@ -785,6 +783,8 @@ class RowIndex(tk.Canvas):
785
783
  sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
786
784
  try_binding(self.drag_selection_binding_func, sel_event)
787
785
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
786
+ else:
787
+ self.being_drawn_item = None
788
788
  self.MT.bind("<MouseWheel>", self.MT.mousewheel)
789
789
  if self.height_resizing_enabled and self.rsz_h is not None and self.currently_resizing_height:
790
790
  self.currently_resizing_height = False
@@ -921,6 +921,7 @@ class RowIndex(tk.Canvas):
921
921
  redraw: bool = True,
922
922
  run_binding_func: bool = True,
923
923
  set_as_current: bool = True,
924
+ ext: bool = False,
924
925
  ) -> int | None:
925
926
  if add_selection:
926
927
  if self.MT.row_selected(row):
@@ -931,18 +932,25 @@ class RowIndex(tk.Canvas):
931
932
  redraw=redraw,
932
933
  run_binding_func=run_binding_func,
933
934
  set_as_current=set_as_current,
935
+ ext=ext,
934
936
  )
935
937
  else:
936
938
  if self.MT.row_selected(row):
937
939
  fill_iid = self.MT.deselect(r=row, redraw=redraw)
938
940
  else:
939
- fill_iid = self.select_row(row, redraw=redraw)
941
+ fill_iid = self.select_row(row, redraw=redraw, ext=ext)
940
942
  return fill_iid
941
943
 
942
- def select_row(self, r: int, redraw: bool = False, run_binding_func: bool = True) -> int:
944
+ def select_row(
945
+ self,
946
+ r: int,
947
+ redraw: bool = False,
948
+ run_binding_func: bool = True,
949
+ ext: bool = False,
950
+ ) -> int:
943
951
  self.MT.deselect("all", redraw=False)
944
952
  box = (r, 0, r + 1, len(self.MT.col_positions) - 1, "rows")
945
- fill_iid = self.MT.create_selection_box(*box)
953
+ fill_iid = self.MT.create_selection_box(*box, ext=ext)
946
954
  if redraw:
947
955
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
948
956
  if run_binding_func:
@@ -955,9 +963,10 @@ class RowIndex(tk.Canvas):
955
963
  redraw: bool = False,
956
964
  run_binding_func: bool = True,
957
965
  set_as_current: bool = True,
966
+ ext: bool = False,
958
967
  ) -> int:
959
968
  box = (r, 0, r + 1, len(self.MT.col_positions) - 1, "rows")
960
- fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current)
969
+ fill_iid = self.MT.create_selection_box(*box, set_current=set_as_current, ext=ext)
961
970
  if redraw:
962
971
  self.MT.main_table_redraw_grid_and_text(redraw_header=False, redraw_row_index=True)
963
972
  if run_binding_func:
@@ -1030,7 +1039,7 @@ class RowIndex(tk.Canvas):
1030
1039
  align = self.align
1031
1040
  if align == "w":
1032
1041
  w += self.MT.index_txt_height
1033
- w += self.get_treeview_indent(self.MT._row_index[datarn].iid) + 4
1042
+ w += self.get_treeview_indent(self.MT._row_index[datarn].iid) + 5
1034
1043
  return w, h
1035
1044
 
1036
1045
  def set_row_height(
@@ -1310,7 +1319,8 @@ class RowIndex(tk.Canvas):
1310
1319
  mod = (self.MT.index_txt_height - 1) if self.MT.index_txt_height % 2 else self.MT.index_txt_height
1311
1320
  half_mod = mod / 2
1312
1321
  qtr_mod = mod / 4
1313
- mid_y = (self.MT.index_first_ln_ins - 1) if self.MT.index_first_ln_ins % 2 else self.MT.index_first_ln_ins
1322
+ small_mod = int(half_mod / 4) - 1
1323
+ mid_y = int(self.MT.min_row_height / 2)
1314
1324
  # up arrow
1315
1325
  if open_:
1316
1326
  points = (
@@ -1325,11 +1335,11 @@ class RowIndex(tk.Canvas):
1325
1335
  else:
1326
1336
  points = (
1327
1337
  x1 + half_mod + indent,
1328
- y1 + mid_y - half_mod + 1,
1329
- x1 + mod + indent - 1,
1338
+ y1 + mid_y - half_mod + small_mod,
1339
+ x1 + mod + indent - small_mod,
1330
1340
  y1 + mid_y,
1331
1341
  x1 + half_mod + indent,
1332
- y1 + mid_y + half_mod - 1,
1342
+ y1 + mid_y + half_mod - small_mod,
1333
1343
  )
1334
1344
  if self.hidd_tree_arrow:
1335
1345
  t, sh = self.hidd_tree_arrow.popitem()
@@ -1340,10 +1350,13 @@ class RowIndex(tk.Canvas):
1340
1350
  self.itemconfig(t, fill=fill, tag=tag, state="normal")
1341
1351
  self.lift(t)
1342
1352
  else:
1343
- t = self.create_polygon(
1353
+ t = self.create_line(
1344
1354
  points,
1345
1355
  fill=fill,
1346
1356
  tag=tag,
1357
+ width=2,
1358
+ capstyle=tk.ROUND,
1359
+ joinstyle=tk.BEVEL,
1347
1360
  )
1348
1361
  self.disp_tree_arrow[t] = True
1349
1362
 
@@ -1633,7 +1646,7 @@ class RowIndex(tk.Canvas):
1633
1646
  if align == "w":
1634
1647
  draw_x += self.MT.index_txt_height + 1
1635
1648
  indent = self.get_treeview_indent(iid)
1636
- draw_x += indent + 4
1649
+ draw_x += indent + 5
1637
1650
  if self.tree[iid].children:
1638
1651
  self.redraw_tree_arrow(
1639
1652
  0,
@@ -1738,11 +1751,11 @@ class RowIndex(tk.Canvas):
1738
1751
 
1739
1752
  def get_redraw_selections(self, startr: int, endr: int) -> dict[str, set[int]]:
1740
1753
  d = defaultdict(set)
1741
- for item, box in self.MT.get_selection_items(columns=False):
1754
+ for item, box in self.MT.get_selection_items():
1742
1755
  r1, c1, r2, c2 = box.coords
1743
1756
  for r in range(startr, endr):
1744
1757
  if r1 <= r and r2 > r:
1745
- d[box.type_].add(r)
1758
+ d[box.type_ if box.type_ != "columns" else "cells"].add(r)
1746
1759
  return d
1747
1760
 
1748
1761
  def open_cell(self, event: object = None, ignore_existing_editor=False):
@@ -1464,6 +1464,8 @@ class Sheet(tk.Frame):
1464
1464
  undo_stack: bool = True,
1465
1465
  selections: bool = True,
1466
1466
  sheet_options: bool = False,
1467
+ displayed_rows: bool = True,
1468
+ displayed_columns: bool = True,
1467
1469
  tree: bool = True,
1468
1470
  redraw: bool = True,
1469
1471
  ) -> Sheet:
@@ -1476,6 +1478,12 @@ class Sheet(tk.Frame):
1476
1478
  if index:
1477
1479
  self.RI.hide_text_editor_and_dropdown(redraw=False)
1478
1480
  self.MT._row_index = []
1481
+ if displayed_columns:
1482
+ self.MT.displayed_columns = []
1483
+ self.MT.all_columns_displayed = True
1484
+ if displayed_rows:
1485
+ self.MT.displayed_rows = []
1486
+ self.MT.all_rows_displayed = True
1479
1487
  if row_heights:
1480
1488
  self.MT.saved_row_heights = {}
1481
1489
  self.MT.set_row_positions([])
@@ -3129,6 +3137,7 @@ class Sheet(tk.Frame):
3129
3137
  row if isinstance(row, int) else int(row),
3130
3138
  redraw=False,
3131
3139
  run_binding_func=run_binding_func,
3140
+ ext=True,
3132
3141
  )
3133
3142
  return self.set_refresh_timer(redraw)
3134
3143
 
@@ -3137,6 +3146,7 @@ class Sheet(tk.Frame):
3137
3146
  column if isinstance(column, int) else int(column),
3138
3147
  redraw=False,
3139
3148
  run_binding_func=run_binding_func,
3149
+ ext=True,
3140
3150
  )
3141
3151
  return self.set_refresh_timer(redraw)
3142
3152
 
@@ -3146,6 +3156,7 @@ class Sheet(tk.Frame):
3146
3156
  column if isinstance(column, int) else int(column),
3147
3157
  redraw=False,
3148
3158
  run_binding_func=run_binding_func,
3159
+ ext=True,
3149
3160
  )
3150
3161
  return self.set_refresh_timer(redraw)
3151
3162
 
@@ -3167,6 +3178,7 @@ class Sheet(tk.Frame):
3167
3178
  redraw=False,
3168
3179
  run_binding_func=run_binding_func,
3169
3180
  set_as_current=set_as_current,
3181
+ ext=True,
3170
3182
  )
3171
3183
  return self.set_refresh_timer(redraw)
3172
3184
 
@@ -3182,6 +3194,7 @@ class Sheet(tk.Frame):
3182
3194
  redraw=False,
3183
3195
  run_binding_func=run_binding_func,
3184
3196
  set_as_current=set_as_current,
3197
+ ext=True,
3185
3198
  )
3186
3199
  return self.set_refresh_timer(redraw)
3187
3200
 
@@ -3197,6 +3210,7 @@ class Sheet(tk.Frame):
3197
3210
  redraw=False,
3198
3211
  run_binding_func=run_binding_func,
3199
3212
  set_as_current=set_as_current,
3213
+ ext=True,
3200
3214
  )
3201
3215
  return self.set_refresh_timer(redraw)
3202
3216
 
@@ -3216,6 +3230,7 @@ class Sheet(tk.Frame):
3216
3230
  redraw=False,
3217
3231
  run_binding_func=run_binding_func,
3218
3232
  set_as_current=set_as_current,
3233
+ ext=True,
3219
3234
  )
3220
3235
  return self.set_refresh_timer(redraw)
3221
3236
 
@@ -3233,6 +3248,7 @@ class Sheet(tk.Frame):
3233
3248
  redraw=False,
3234
3249
  run_binding_func=run_binding_func,
3235
3250
  set_as_current=set_as_current,
3251
+ ext=True,
3236
3252
  )
3237
3253
  return self.set_refresh_timer(redraw)
3238
3254
 
@@ -3250,6 +3266,7 @@ class Sheet(tk.Frame):
3250
3266
  redraw=False,
3251
3267
  run_binding_func=run_binding_func,
3252
3268
  set_as_current=set_as_current,
3269
+ ext=True,
3253
3270
  )
3254
3271
  return self.set_refresh_timer(redraw)
3255
3272
 
@@ -3261,7 +3278,14 @@ class Sheet(tk.Frame):
3261
3278
  c2: int,
3262
3279
  type_: Literal["cells", "rows", "columns", "cols"] = "cells",
3263
3280
  ) -> int:
3264
- return self.MT.create_selection_box(r1=r1, c1=c1, r2=r2, c2=c2, type_="columns" if type_ == "cols" else type_)
3281
+ return self.MT.create_selection_box(
3282
+ r1=r1,
3283
+ c1=c1,
3284
+ r2=r2,
3285
+ c2=c2,
3286
+ type_="columns" if type_ == "cols" else type_,
3287
+ ext=True,
3288
+ )
3265
3289
 
3266
3290
  def recreate_all_selection_boxes(self) -> Sheet:
3267
3291
  self.MT.recreate_all_selection_boxes()
@@ -3584,6 +3608,20 @@ class Sheet(tk.Frame):
3584
3608
  z < self.MT.min_column_width or not isinstance(z, int) or isinstance(z, bool) for z in column_widths
3585
3609
  )
3586
3610
 
3611
+ def valid_row_height(self, height: int) -> int:
3612
+ if height < self.MT.min_row_height:
3613
+ return self.MT.min_row_height
3614
+ elif height > self.MT.max_row_height:
3615
+ return self.MT.max_row_height
3616
+ return height
3617
+
3618
+ def valid_column_width(self, width: int) -> int:
3619
+ if width < self.MT.min_column_width:
3620
+ return self.MT.min_column_width
3621
+ elif width > self.MT.max_column_width:
3622
+ return self.MT.max_column_width
3623
+ return width
3624
+
3587
3625
  # Identifying Bound Event Mouse Position
3588
3626
 
3589
3627
  def identify_region(self, event: object) -> Literal["table", "index", "header", "top left"]:
@@ -4512,6 +4550,7 @@ class Sheet(tk.Frame):
4512
4550
  safety: bool = True,
4513
4551
  ncols: int | None = None,
4514
4552
  ) -> Sheet:
4553
+ self.reset(cell_options=False, column_widths=False, header=False, redraw=False)
4515
4554
  if text_column is None:
4516
4555
  text_column = iid_column
4517
4556
  tally_of_ids = defaultdict(lambda: -1)
@@ -4564,6 +4603,8 @@ class Sheet(tk.Frame):
4564
4603
  fill=False,
4565
4604
  push_ops=push_ops,
4566
4605
  )
4606
+ self.MT.all_rows_displayed = False
4607
+ self.MT.displayed_rows = list(range(len(self.MT._row_index)))
4567
4608
  self.RI.tree_rns = {n.iid: i for i, n in enumerate(self.MT._row_index)}
4568
4609
  if open_ids:
4569
4610
  self.tree_set_open(open_ids=open_ids)
@@ -4614,10 +4655,17 @@ class Sheet(tk.Frame):
4614
4655
  Only meant for internal use
4615
4656
  """
4616
4657
  to_open = []
4658
+ disp_set = set(self.MT.displayed_rows)
4659
+ quick_rns = self.RI.tree_rns
4660
+ quick_open_ids = self.RI.tree_open_ids
4617
4661
  for item in filter(items.__contains__, self.get_children()):
4618
4662
  if self.RI.tree[item].children:
4619
- self.RI.tree_open_ids.add(item)
4620
- to_open.extend(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True))
4663
+ quick_open_ids.add(item)
4664
+ if quick_rns[item] in disp_set:
4665
+ to_disp = [quick_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)]
4666
+ for i in to_disp:
4667
+ disp_set.add(i)
4668
+ to_open.extend(to_disp)
4621
4669
  return to_open
4622
4670
 
4623
4671
  def tree_open(self, *items, redraw: bool = True) -> Sheet:
@@ -4627,36 +4675,37 @@ class Sheet(tk.Frame):
4627
4675
  if items := set(unpack(items)):
4628
4676
  to_open = self._tree_open(items)
4629
4677
  else:
4630
- to_open = []
4631
- for item in self.get_children():
4632
- if self.RI.tree[item].children:
4633
- self.RI.tree_open_ids.add(item)
4634
- to_open.extend(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True))
4678
+ to_open = self._tree_open(set(self.get_children()))
4635
4679
  return self.show_rows(
4636
4680
  rows=to_open,
4637
4681
  redraw=redraw,
4638
4682
  deselect_all=False,
4639
4683
  )
4640
4684
 
4685
+ def _tree_close(self, items: Iterator[str]) -> list[int]:
4686
+ """
4687
+ Only meant for internal use
4688
+ """
4689
+ to_close = set()
4690
+ disp_set = set(self.MT.displayed_rows)
4691
+ quick_rns = self.RI.tree_rns
4692
+ quick_open_ids = self.RI.tree_open_ids
4693
+ for item in items:
4694
+ if self.RI.tree[item].children:
4695
+ quick_open_ids.discard(item)
4696
+ if quick_rns[item] in disp_set:
4697
+ for did in self.RI.get_iid_descendants(item, check_open=True):
4698
+ to_close.add(quick_rns[did])
4699
+ return to_close
4700
+
4641
4701
  def tree_close(self, *items, redraw: bool = True) -> Sheet:
4642
4702
  """
4643
4703
  If used without args all items are closed
4644
4704
  """
4645
- to_close = set()
4646
4705
  if items:
4647
- for item in unpack(items):
4648
- if self.RI.tree[item].children:
4649
- self.RI.tree_open_ids.discard(item)
4650
- if self.RI.tree_rns[item] in self.MT.displayed_rows:
4651
- for did in self.RI.get_iid_descendants(item, check_open=True):
4652
- to_close.add(self.RI.tree_rns[did])
4706
+ to_close = self._tree_close(unpack(items))
4653
4707
  else:
4654
- for item in self.get_children():
4655
- if self.RI.tree[item].children:
4656
- self.RI.tree_open_ids.discard(item)
4657
- if self.RI.tree_rns[item] in self.MT.displayed_rows:
4658
- for did in self.RI.get_iid_descendants(item, check_open=True):
4659
- to_close.add(self.RI.tree_rns[did])
4708
+ to_close = self._tree_close(self.get_children())
4660
4709
  return self.hide_rows(
4661
4710
  rows=to_close,
4662
4711
  redraw=redraw,
@@ -26,7 +26,7 @@ class TextEditorTkText(tk.Text):
26
26
  self,
27
27
  parent,
28
28
  spacing1=0,
29
- spacing2=0,
29
+ spacing2=1,
30
30
  spacing3=0,
31
31
  bd=0,
32
32
  highlightthickness=0,
@@ -46,8 +46,8 @@ theme_light_blue: dict[str, str] = DotDict({
46
46
  "table_selected_columns_border_fg": "#0B57D0",
47
47
  "table_selected_columns_bg": "#E6EFFD",
48
48
  "table_selected_columns_fg": "black",
49
- "tree_arrow_fg": "#C4C7C5",
50
- "selected_cells_tree_arrow_fg": "#D3E3FD",
49
+ "tree_arrow_fg": "black",
50
+ "selected_cells_tree_arrow_fg": "black",
51
51
  "selected_rows_tree_arrow_fg": "#FFFFFF",
52
52
  "vertical_scroll_background": "#FFFFFF",
53
53
  "horizontal_scroll_background": "#FFFFFF",
@@ -121,7 +121,7 @@ theme_light_green: dict[str, str] = DotDict({
121
121
  "table_selected_columns_border_fg": "#107C41",
122
122
  "table_selected_columns_bg": "#E3E3E3",
123
123
  "table_selected_columns_fg": "black",
124
- "tree_arrow_fg": "#ababab",
124
+ "tree_arrow_fg": "black",
125
125
  "selected_cells_tree_arrow_fg": "#107C41",
126
126
  "selected_rows_tree_arrow_fg": "#FFFFFF",
127
127
  "vertical_scroll_background": "#FFFFFF",
@@ -272,8 +272,8 @@ theme_black: dict[str, str] = DotDict({
272
272
  "table_selected_columns_bg": "#404040",
273
273
  "table_selected_columns_fg": "#F7F7F7",
274
274
  "tree_arrow_fg": "#8C8C8C",
275
- "selected_cells_tree_arrow_fg": "#8C8C8C",
276
- "selected_rows_tree_arrow_fg": "#8C8C8C",
275
+ "selected_cells_tree_arrow_fg": "#FBB86C",
276
+ "selected_rows_tree_arrow_fg": "#000000",
277
277
  "vertical_scroll_background": "#3b3a39",
278
278
  "horizontal_scroll_background": "#3b3a39",
279
279
  "vertical_scroll_troughcolor": "#000000",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.24
3
+ Version: 7.2.1
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes