tksheet 7.1.6__py3-none-any.whl → 7.1.8__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/sheet.py CHANGED
@@ -8,7 +8,6 @@ from itertools import accumulate, chain, islice, product
8
8
  from timeit import default_timer
9
9
  from tkinter import ttk
10
10
  from typing import Literal
11
- from warnings import warn as WARNING
12
11
 
13
12
  from .column_headers import ColumnHeaders
14
13
  from .functions import (
@@ -46,8 +45,8 @@ from .other_classes import (
46
45
  FontTuple,
47
46
  GeneratedMouseEvent,
48
47
  Node,
49
- Span,
50
48
  Selected,
49
+ Span,
51
50
  )
52
51
  from .row_index import RowIndex
53
52
  from .sheet_options import (
@@ -171,6 +170,9 @@ class Sheet(tk.Frame):
171
170
  display_selected_fg_over_highlights: bool = False,
172
171
  show_selected_cells_border: bool = True,
173
172
  treeview: bool = False,
173
+ treeview_indent: str | int = "3",
174
+ rounded_boxes: bool = True,
175
+ alternate_color: str = "",
174
176
  # colors
175
177
  outline_thickness: int = 0,
176
178
  outline_color: str = theme_light_blue["outline_color"],
@@ -269,9 +271,6 @@ class Sheet(tk.Frame):
269
271
  highlightbackground=outline_color,
270
272
  highlightcolor=outline_color,
271
273
  )
272
- WARNING(
273
- "There have been many changes from tksheet version 6.x.x to version 7.x.x. Please see the changelog for more information."
274
- )
275
274
  self.ops = new_sheet_options()
276
275
  if column_width is not None:
277
276
  default_column_width = column_width
@@ -611,7 +610,7 @@ class Sheet(tk.Frame):
611
610
  for b, f in iterable:
612
611
  b = b.lower()
613
612
 
614
- if func is not None and b in emitted_events:
613
+ if f is not None and b in emitted_events:
615
614
  self.bind(b, f)
616
615
 
617
616
  if b in (
@@ -1354,16 +1353,14 @@ class Sheet(tk.Frame):
1354
1353
  if header:
1355
1354
  if table:
1356
1355
  res.extend(
1357
- [
1358
- [quick_hdata(c, get_displayed=hdisp)]
1359
- + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows]
1360
- for c in cols
1361
- ]
1356
+ [quick_hdata(c, get_displayed=hdisp)]
1357
+ + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows]
1358
+ for c in cols
1362
1359
  )
1363
1360
  else:
1364
- res.extend([[quick_hdata(c, get_displayed=hdisp)] for c in cols])
1361
+ res.extend([quick_hdata(c, get_displayed=hdisp)] for c in cols)
1365
1362
  elif table:
1366
- res.extend([[quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows] for c in cols])
1363
+ res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows] for c in cols)
1367
1364
  elif not span.transposed:
1368
1365
  if header:
1369
1366
  if header and index:
@@ -1376,16 +1373,14 @@ class Sheet(tk.Frame):
1376
1373
  if index:
1377
1374
  if table:
1378
1375
  res.extend(
1379
- [
1380
- [quick_idata(r, get_displayed=idisp)]
1381
- + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols]
1382
- for r in rows
1383
- ]
1376
+ [quick_idata(r, get_displayed=idisp)]
1377
+ + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols]
1378
+ for r in rows
1384
1379
  )
1385
1380
  else:
1386
- res.extend([[quick_idata(r, get_displayed=idisp)] for r in rows])
1381
+ res.extend([quick_idata(r, get_displayed=idisp)] for r in rows)
1387
1382
  elif table:
1388
- res.extend([[quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols] for r in rows])
1383
+ res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols] for r in rows)
1389
1384
  if not span.ndim:
1390
1385
  # it's a cell
1391
1386
  if len(res) == 1 and len(res[0]) == 1:
@@ -1518,7 +1513,7 @@ class Sheet(tk.Frame):
1518
1513
  )
1519
1514
 
1520
1515
  @data.setter
1521
- def data(self, value):
1516
+ def data(self, value: list[list[object]]) -> None:
1522
1517
  self.data_reference(value)
1523
1518
 
1524
1519
  def set_data(
@@ -2847,12 +2842,7 @@ class Sheet(tk.Frame):
2847
2842
  self.set_refresh_timer(redraw)
2848
2843
  return self
2849
2844
 
2850
- def index_align(
2851
- self,
2852
- align: str = None,
2853
- redraw: bool = True,
2854
- ) -> str | Sheet:
2855
- return self.row_index_align(align, redraw)
2845
+ index_align = row_index_align
2856
2846
 
2857
2847
  def align(
2858
2848
  self,
@@ -2910,12 +2900,25 @@ class Sheet(tk.Frame):
2910
2900
  def selected(self) -> tuple[()] | Selected:
2911
2901
  return self.MT.selected
2912
2902
 
2903
+ @selected.setter
2904
+ def selected(self, selected: tuple[()] | Selected) -> Sheet:
2905
+ if selected:
2906
+ self.MT.set_currently_selected(
2907
+ r=selected[0],
2908
+ c=selected[1],
2909
+ item=selected[4],
2910
+ box=selected[3],
2911
+ )
2912
+ else:
2913
+ self.MT.deselect()
2914
+ return self
2915
+
2913
2916
  def get_selected_rows(
2914
2917
  self,
2915
2918
  get_cells: bool = False,
2916
2919
  get_cells_as_rows: bool = False,
2917
2920
  return_tuple: bool = False,
2918
- ) -> tuple | set:
2921
+ ) -> tuple[int] | tuple[tuple[int, int]] | set[int] | set[tuple[int, int]]:
2919
2922
  if return_tuple:
2920
2923
  return tuple(self.MT.get_selected_rows(get_cells=get_cells, get_cells_as_rows=get_cells_as_rows))
2921
2924
  return self.MT.get_selected_rows(get_cells=get_cells, get_cells_as_rows=get_cells_as_rows)
@@ -2925,7 +2928,7 @@ class Sheet(tk.Frame):
2925
2928
  get_cells: bool = False,
2926
2929
  get_cells_as_columns: bool = False,
2927
2930
  return_tuple: bool = False,
2928
- ) -> tuple | set:
2931
+ ) -> tuple[int] | tuple[tuple[int, int]] | set[int] | set[tuple[int, int]]:
2929
2932
  if return_tuple:
2930
2933
  return tuple(self.MT.get_selected_cols(get_cells=get_cells, get_cells_as_cols=get_cells_as_columns))
2931
2934
  return self.MT.get_selected_cols(get_cells=get_cells, get_cells_as_cols=get_cells_as_columns)
@@ -2936,7 +2939,7 @@ class Sheet(tk.Frame):
2936
2939
  get_columns: bool = False,
2937
2940
  sort_by_row: bool = False,
2938
2941
  sort_by_column: bool = False,
2939
- ) -> list | set:
2942
+ ) -> list[tuple[int, int]] | set[tuple[int, int]]:
2940
2943
  if sort_by_row and sort_by_column:
2941
2944
  sels = sorted(
2942
2945
  self.MT.get_selected_cells(get_rows=get_rows, get_cols=get_columns),
@@ -2965,6 +2968,14 @@ class Sheet(tk.Frame):
2965
2968
  def boxes(self) -> list[tuple[tuple[int, int, int, int], str]]:
2966
2969
  return self.MT.get_all_selection_boxes_with_types()
2967
2970
 
2971
+ @boxes.setter
2972
+ def boxes(self, boxes: Sequence[tuple[tuple[int, int, int, int], str]]) -> Sheet:
2973
+ self.MT.deselect()
2974
+ self.MT.reselect_from_get_boxes(
2975
+ boxes={box[0] if isinstance(box[0], tuple) else tuple(box[0]): box[1] for box in boxes}
2976
+ )
2977
+ return self
2978
+
2968
2979
  def cell_selected(
2969
2980
  self,
2970
2981
  r: int,
@@ -3020,7 +3031,7 @@ class Sheet(tk.Frame):
3020
3031
 
3021
3032
  def select_row(self, row: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3022
3033
  self.RI.select_row(
3023
- int(row) if not isinstance(row, int) else row,
3034
+ row if isinstance(row, int) else int(row),
3024
3035
  redraw=False,
3025
3036
  run_binding_func=run_binding_func,
3026
3037
  )
@@ -3029,7 +3040,7 @@ class Sheet(tk.Frame):
3029
3040
 
3030
3041
  def select_column(self, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3031
3042
  self.CH.select_col(
3032
- int(column) if not isinstance(column, int) else column,
3043
+ column if isinstance(column, int) else int(column),
3033
3044
  redraw=False,
3034
3045
  run_binding_func=run_binding_func,
3035
3046
  )
@@ -3038,8 +3049,8 @@ class Sheet(tk.Frame):
3038
3049
 
3039
3050
  def select_cell(self, row: int, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3040
3051
  self.MT.select_cell(
3041
- int(row) if not isinstance(row, int) else row,
3042
- int(column) if not isinstance(column, int) else column,
3052
+ row if isinstance(row, int) else int(row),
3053
+ column if isinstance(column, int) else int(column),
3043
3054
  redraw=False,
3044
3055
  run_binding_func=run_binding_func,
3045
3056
  )
@@ -3719,10 +3730,24 @@ class Sheet(tk.Frame):
3719
3730
  self.MT.all_columns_displayed = a
3720
3731
  return v
3721
3732
 
3733
+ @property
3734
+ def all_columns(self) -> bool:
3735
+ return self.MT.all_columns_displayed
3736
+
3737
+ @all_columns.setter
3738
+ def all_columns(self, a: bool) -> Sheet:
3739
+ self.MT.all_columns_displayed = a
3740
+ return self
3741
+
3722
3742
  @property
3723
3743
  def displayed_columns(self) -> list[int]:
3724
3744
  return self.MT.displayed_columns
3725
3745
 
3746
+ @displayed_columns.setter
3747
+ def displayed_columns(self, columns: list[int]) -> Sheet:
3748
+ self.display_columns(columns=columns, reset_col_positions=False, redraw=True)
3749
+ return self
3750
+
3726
3751
  # Hiding Rows
3727
3752
 
3728
3753
  def displayed_row_to_data(self, r: int) -> int:
@@ -3795,8 +3820,6 @@ class Sheet(tk.Frame):
3795
3820
  )
3796
3821
  if deselect_all:
3797
3822
  self.MT.deselect(redraw=False)
3798
- else:
3799
- self.MT.deselect_any(rows=rows, redraw=False)
3800
3823
  self.set_refresh_timer(redraw)
3801
3824
  return self
3802
3825
 
@@ -3827,10 +3850,24 @@ class Sheet(tk.Frame):
3827
3850
  self.MT.all_rows_displayed = a
3828
3851
  return v
3829
3852
 
3853
+ @property
3854
+ def all_rows(self) -> bool:
3855
+ return self.MT.all_rows_displayed
3856
+
3857
+ @all_rows.setter
3858
+ def all_rows(self, a: bool) -> Sheet:
3859
+ self.MT.all_rows_displayed = a
3860
+ return self
3861
+
3830
3862
  @property
3831
3863
  def displayed_rows(self) -> list[int]:
3832
3864
  return self.MT.displayed_rows
3833
3865
 
3866
+ @displayed_rows.setter
3867
+ def displayed_rows(self, rows: list[int]) -> Sheet:
3868
+ self.display_rows(rows=rows, reset_row_positions=False, redraw=True)
3869
+ return self
3870
+
3834
3871
  # Hiding Sheet Elements
3835
3872
 
3836
3873
  def hide(
@@ -4241,9 +4278,7 @@ class Sheet(tk.Frame):
4241
4278
  self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
4242
4279
  return self
4243
4280
 
4244
- def refresh(self, redraw_header: bool = True, redraw_row_index: bool = True) -> Sheet:
4245
- self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
4246
- return self
4281
+ refresh = redraw
4247
4282
 
4248
4283
  # Tags
4249
4284
 
@@ -4380,7 +4415,10 @@ class Sheet(tk.Frame):
4380
4415
  data: list[list[object]],
4381
4416
  iid_column: int,
4382
4417
  parent_column: int,
4418
+ text_column: None | int = None,
4383
4419
  ) -> Sheet:
4420
+ if text_column is None:
4421
+ text_column = iid_column
4384
4422
  tally_of_ids = defaultdict(lambda: -1)
4385
4423
  ncols = max(map(len, data), default=0)
4386
4424
  for rn, row in enumerate(data):
@@ -4399,13 +4437,13 @@ class Sheet(tk.Frame):
4399
4437
  tally_of_ids[iid] += 1
4400
4438
  row[iid_column] = new
4401
4439
  if iid not in self.RI.tree:
4402
- self.RI.tree[iid] = Node(row[iid_column], iid, "")
4440
+ self.RI.tree[iid] = Node(row[text_column], iid, "")
4403
4441
  if iid == pid or self.RI.pid_causes_recursive_loop(iid, pid):
4404
4442
  row[parent_column] = ""
4405
4443
  pid = ""
4406
4444
  if pid:
4407
4445
  if pid not in self.RI.tree:
4408
- self.RI.tree[pid] = Node(row[parent_column], pid)
4446
+ self.RI.tree[pid] = Node(row[text_column], pid)
4409
4447
  self.RI.tree[iid].parent = self.RI.tree[pid]
4410
4448
  self.RI.tree[pid].children.append(self.RI.tree[iid])
4411
4449
  else:
@@ -4415,7 +4453,7 @@ class Sheet(tk.Frame):
4415
4453
  if n.parent is None:
4416
4454
  n.parent = ""
4417
4455
  newrow = self.MT.get_empty_row_seq(len(data), ncols)
4418
- newrow[iid_column] = n.text
4456
+ newrow[iid_column] = n.iid
4419
4457
  self.RI.tree_rns[n.iid] = len(data)
4420
4458
  data.append(newrow)
4421
4459
  self.insert_rows(
@@ -4449,7 +4487,7 @@ class Sheet(tk.Frame):
4449
4487
  Accepts set[str] of iids that are open in the treeview
4450
4488
  Closes everything else
4451
4489
  """
4452
- self.RI.tree_open_ids = open_ids
4490
+ self.RI.tree_open_ids = open_ids if isinstance(open_ids, set) else set(open_ids)
4453
4491
  self.hide_rows(
4454
4492
  set(self.MT.displayed_rows),
4455
4493
  redraw=False,
@@ -4558,6 +4596,7 @@ class Sheet(tk.Frame):
4558
4596
  text: str | None = None,
4559
4597
  values: list | None = None,
4560
4598
  open_: bool | None = None,
4599
+ redraw: bool = True,
4561
4600
  ) -> DotDict | Sheet:
4562
4601
  """
4563
4602
  Modify options for item
@@ -4600,7 +4639,7 @@ class Sheet(tk.Frame):
4600
4639
  else:
4601
4640
  self.RI.tree_open_ids.discard(item)
4602
4641
  get = not (isinstance(iid, str) or isinstance(text, str) or isinstance(values, list) or isinstance(open_, bool))
4603
- self.set_refresh_timer(redraw=not get)
4642
+ self.set_refresh_timer(redraw=not get or redraw)
4604
4643
  if get:
4605
4644
  return DotDict(
4606
4645
  text=self.RI.tree[item].text,
@@ -4616,10 +4655,11 @@ class Sheet(tk.Frame):
4616
4655
  raise ValueError(f"item '{item.lower()}' does not exist.")
4617
4656
 
4618
4657
  def rowitem(self, row: int, data_index: bool = False) -> str | None:
4619
- if not data_index:
4620
- row = self.data_r(row)
4621
- if isinstance(row, int) and len(self.MT._row_index) > row:
4622
- return self.MT._row_index[row].iid
4658
+ if isinstance(row, int):
4659
+ if not data_index:
4660
+ row = self.data_r(row)
4661
+ if len(self.MT._row_index) > row:
4662
+ return self.MT._row_index[row].iid
4623
4663
  return None
4624
4664
 
4625
4665
  def get_children(self, item: None | str = None) -> Generator[str]:
@@ -4660,67 +4700,23 @@ class Sheet(tk.Frame):
4660
4700
  self.set_refresh_timer(True)
4661
4701
  return self
4662
4702
 
4663
- def set_children(self, item: str, *newchildren) -> Sheet:
4703
+ def set_children(self, parent: str, *newchildren) -> Sheet:
4664
4704
  """
4665
- Moves everything in '*newchildren' under 'item'
4705
+ Moves everything in '*newchildren' under 'parent'
4666
4706
  """
4667
- if (item := item.lower()) and item not in self.RI.tree:
4668
- raise ValueError(f"Item '{item}' does not exist.")
4669
- mapping = {}
4670
- to_show = []
4671
- if item:
4672
- new_parent = self.RI.tree[item]
4673
- if new_parent.children:
4674
- ctr = self.RI.tree_rns[new_parent.children[-1].iid] + 1
4675
- else:
4676
- ctr = self.RI.tree_rns[new_parent.iid] + 1
4677
- for cid in unpack(newchildren):
4678
- if self.RI.pid_causes_recursive_loop(cid, item):
4679
- raise ValueError(f"iid '{cid}' causes a recursive loop with parent '{item}'.")
4680
- cid_node = self.RI.tree[cid]
4681
- mapping[self.RI.tree_rns[cid]] = ctr
4682
- if item in self.RI.tree_open_ids and self.item_displayed(item):
4683
- to_show.append(ctr)
4684
- ctr += 1
4685
- for did in self.RI.get_iid_descendants(cid):
4686
- mapping[self.RI.tree_rns[did]] = ctr
4687
- if to_show and self.RI.ancestors_all_open(did, self.RI.tree[cid].parent):
4688
- to_show.append(ctr)
4689
- ctr += 1
4690
- self.RI.remove_node_from_parents_children(cid_node)
4691
- cid_node.parent = new_parent
4692
- new_parent.children.append(cid_node)
4693
- else:
4694
- ctr = (
4695
- len(self.MT._row_index)
4696
- - len(newchildren)
4697
- - sum(1 for cid in unpack(newchildren) for _ in self.RI.get_iid_descendants(cid))
4698
- )
4699
- for cid in unpack(newchildren):
4700
- cid_node = self.RI.tree[cid]
4701
- mapping[self.RI.tree_rns[cid]] = ctr
4702
- to_show.append(ctr)
4703
- ctr += 1
4704
- for did in self.RI.get_iid_descendants(cid):
4705
- mapping[self.RI.tree_rns[did]] = ctr
4706
- if self.RI.ancestors_all_open(did, cid_node.parent):
4707
- to_show.append(ctr)
4708
- ctr += 1
4709
- self.RI.remove_node_from_parents_children(cid_node)
4710
- self.RI.tree[cid].parent = ""
4711
- self.mapping_move_rows(
4712
- data_new_idxs=mapping,
4713
- data_indexes=True,
4714
- create_selections=False,
4715
- redraw=False,
4716
- )
4717
- if item and (item not in self.RI.tree_open_ids or not self.item_displayed(item)):
4718
- self.hide_rows(set(mapping.values()), data_indexes=True)
4719
- self.show_rows(to_show)
4720
- self.set_refresh_timer(True)
4707
+ for iid in unpack(newchildren):
4708
+ self.move(iid, parent)
4721
4709
  return self
4722
4710
 
4723
- def move(self, item: str, parent: str, index: int = 0) -> Sheet:
4711
+ def find_rn_at_top_index(self, index: int) -> int:
4712
+ wo_par = 0
4713
+ for rn, n in enumerate(self.MT._row_index):
4714
+ if not n.parent:
4715
+ if wo_par == index:
4716
+ return rn
4717
+ wo_par += 1
4718
+
4719
+ def move(self, item: str, parent: str, index: int | None = None) -> Sheet:
4724
4720
  """
4725
4721
  Moves item to be under parent as child at index
4726
4722
  'parent' can be empty string which will make item a top node
@@ -4737,35 +4733,49 @@ class Sheet(tk.Frame):
4737
4733
  raise ValueError(f"iid '{item}' causes a recursive loop with parent '{parent}'.")
4738
4734
  parent_node = self.RI.tree[parent]
4739
4735
  if parent_node.children:
4740
- if len(parent_node.children) < index:
4741
- index = len(parent_node.children)
4742
- ctr = self.RI.tree_rns[parent_node.children[index].iid]
4736
+ if index is None or index >= len(parent_node.children):
4737
+ index = len(parent_node.children) - 1
4738
+ item_r = self.RI.tree_rns[item]
4739
+ new_r = self.RI.tree_rns[parent_node.children[index].iid]
4740
+ if item_node not in parent_node.children:
4741
+ new_r += 1
4742
+ new_r_desc = sum(1 for _ in self.RI.get_iid_descendants(parent_node.children[index].iid))
4743
+ item_desc = sum(1 for _ in self.RI.get_iid_descendants(item))
4744
+ if item_r < new_r:
4745
+ r_ctr = new_r + new_r_desc - item_desc
4746
+ else:
4747
+ r_ctr = new_r
4743
4748
  else:
4744
- ctr = self.RI.tree_rns[parent_node.iid] + 1
4745
- mapping[self.RI.tree_rns[item]] = ctr
4749
+ r_ctr = self.RI.tree_rns[parent_node.iid] + 1
4750
+ mapping[item_r] = r_ctr
4746
4751
  if parent in self.RI.tree_open_ids and self.item_displayed(parent):
4747
- to_show.append(ctr)
4748
- ctr += 1
4752
+ to_show.append(r_ctr)
4753
+ r_ctr += 1
4749
4754
  for did in self.RI.get_iid_descendants(item):
4750
- mapping[self.RI.tree_rns[did]] = ctr
4755
+ mapping[self.RI.tree_rns[did]] = r_ctr
4751
4756
  if to_show and self.RI.ancestors_all_open(did, item_node.parent):
4752
- to_show.append(ctr)
4753
- ctr += 1
4757
+ to_show.append(r_ctr)
4758
+ r_ctr += 1
4754
4759
  self.RI.remove_node_from_parents_children(item_node)
4755
4760
  item_node.parent = parent_node
4756
4761
  parent_node.children.append(item_node)
4757
4762
  else:
4758
- if len(self.MT._row_index) < index:
4759
- index = len(self.MT._row_index)
4760
- ctr = index
4761
- mapping[self.RI.tree_rns[item]] = ctr
4762
- to_show.append(ctr)
4763
- ctr += 1
4763
+ new_r = self.find_rn_at_top_index((sum(1 for _ in self.get_children("")) - 1) if index is None else index)
4764
+ item_r = self.RI.tree_rns[item]
4765
+ if item_r < new_r:
4766
+ par_desc = sum(1 for _ in self.RI.get_iid_descendants(self.rowitem(new_r, data_index=True)))
4767
+ item_desc = sum(1 for _ in self.RI.get_iid_descendants(item))
4768
+ r_ctr = new_r + par_desc - item_desc
4769
+ else:
4770
+ r_ctr = new_r
4771
+ mapping[item_r] = r_ctr
4772
+ to_show.append(r_ctr)
4773
+ r_ctr += 1
4764
4774
  for did in self.RI.get_iid_descendants(item):
4765
- mapping[self.RI.tree_rns[did]] = ctr
4775
+ mapping[self.RI.tree_rns[did]] = r_ctr
4766
4776
  if to_show and self.RI.ancestors_all_open(did, item_node.parent):
4767
- to_show.append(ctr)
4768
- ctr += 1
4777
+ to_show.append(r_ctr)
4778
+ r_ctr += 1
4769
4779
  self.RI.remove_node_from_parents_children(item_node)
4770
4780
  self.RI.tree[item].parent = ""
4771
4781
  self.mapping_move_rows(
@@ -4838,8 +4848,9 @@ class Sheet(tk.Frame):
4838
4848
  ]
4839
4849
 
4840
4850
  def selection_set(self, *items) -> Sheet:
4841
- self.deselect()
4842
- self.selection_add(*items)
4851
+ if any(item.lower() in self.RI.tree for item in unpack(items)):
4852
+ self.deselect()
4853
+ self.selection_add(*items)
4843
4854
  return self
4844
4855
 
4845
4856
  def selection_add(self, *items) -> Sheet:
@@ -4895,12 +4906,8 @@ class Sheet(tk.Frame):
4895
4906
  if redraw and self.after_redraw_id is None:
4896
4907
  self.after_redraw_id = self.after(self.after_redraw_time_ms, self.after_redraw)
4897
4908
 
4898
- def after_redraw(
4899
- self,
4900
- redraw_header: bool = True,
4901
- redraw_row_index: bool = True,
4902
- ) -> None:
4903
- self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
4909
+ def after_redraw(self) -> None:
4910
+ self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
4904
4911
  self.after_redraw_id = None
4905
4912
 
4906
4913
  def del_options_using_span(
tksheet/sheet_options.py CHANGED
@@ -234,6 +234,8 @@ def new_sheet_options() -> DotDict:
234
234
  "display_selected_fg_over_highlights": False,
235
235
  "show_selected_cells_border": True,
236
236
  "treeview": False,
237
- "treeview_indent": "2",
237
+ "treeview_indent": "3",
238
+ "rounded_boxes": True,
239
+ "alternate_color": "",
238
240
  }
239
241
  )
tksheet/vars.py CHANGED
@@ -26,6 +26,16 @@ emitted_events: set[str] = {
26
26
  backwards_compatibility_keys: dict[str, str] = {
27
27
  "font": "table_font",
28
28
  }
29
+ text_editor_to_unbind: tuple[str] = (
30
+ "<Alt-Return>",
31
+ "<Alt-KP_Enter>",
32
+ "<Option-Return>",
33
+ "<Tab>",
34
+ "<Return>",
35
+ "<KP_Enter>",
36
+ "<FocusOut>",
37
+ "<Escape>",
38
+ )
29
39
  scrollbar_options_keys: set[str] = {
30
40
  "vertical_scroll_background",
31
41
  "horizontal_scroll_background",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.6
3
+ Version: 7.1.8
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=QkLl7gG86v_1GMYTSGmOr137dpoTBZE2IpCEgCB40d8,1994
2
+ tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
+ tksheet/column_headers.py,sha256=u5SRsI3VAoqxpUpPQZfu2Zimmf2OmZUBD_hMJKso-pw,100204
4
+ tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
+ tksheet/functions.py,sha256=__21LS0cft9quuzFXcJ0BMbB0DEntvS4NQvreGk2U8Y,39709
6
+ tksheet/main_table.py,sha256=zY5RNV2AyJ3jM8JPMmYrwCXGsnefnVVlXcjaqYxdxvg,318290
7
+ tksheet/other_classes.py,sha256=P3FYUYreLhstATvHCNow8sDQoCsD_02KB6oXcca3ahE,13628
8
+ tksheet/row_index.py,sha256=wfOPHitGfipTysCMfQA-Nl4mJawmkv9gm5CAtIlKgxo,105673
9
+ tksheet/sheet.py,sha256=WvCuIszL31oJLhf0XJpvc0kHxa1yMAwEjiPrjeLkAQ8,257298
10
+ tksheet/sheet_options.py,sha256=mh0rTvWrFvIKaiv88jtMZy0TSA8zTS1GXSe88u8_rzk,11978
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=8Qxas-m5nU-yMaeAweO4Z30FM9cOQoRTiOsH4kgZp5s,2288
16
+ tksheet-7.1.8.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
+ tksheet-7.1.8.dist-info/METADATA,sha256=eyi1aRtOSI35o-qYZpAJSZMyYjisRqRyZk_qg1JWx74,6013
18
+ tksheet-7.1.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
+ tksheet-7.1.8.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
+ tksheet-7.1.8.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- tksheet/__init__.py,sha256=95JUoulFU3M59S4BSLtmbHtdYN9bUTph238FEb2u0S8,1874
2
- tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
- tksheet/column_headers.py,sha256=2Y5QcT5WmxjXudPszKHcd7hHuTNRfxoRVyKx2bsBGZI,99449
4
- tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
- tksheet/functions.py,sha256=OZdcbYcKpiU_2YhwPWASZ8QfyF3tRhGiwY80sh5Rbx4,39610
6
- tksheet/main_table.py,sha256=ThNsmwC_e2o5nEjB53RvIMLaj3rcWEfASeMtt2TTNl4,321201
7
- tksheet/other_classes.py,sha256=Hjr7c0kD2_880xjtGuFn9gQ-7ED5kSiNahniBeXcf84,13604
8
- tksheet/row_index.py,sha256=TsAYN0cBchH-diKzU3fuZXlgTOmrODq8EIeT2RcTblk,104750
9
- tksheet/sheet.py,sha256=_VotKhIMM1aAUmDNPZC4h0_q6NP-sB4nGRRIZ-iggSc,257417
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.6.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
- tksheet-7.1.6.dist-info/METADATA,sha256=2ZtrwFvnlwzpFt9hY_C_Mpf5ghtHjmRPz65pfc5N1xI,6013
18
- tksheet-7.1.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
- tksheet-7.1.6.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
- tksheet-7.1.6.dist-info/RECORD,,