tksheet 7.1.7__py3-none-any.whl → 7.1.9__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/other_classes.py CHANGED
@@ -17,10 +17,8 @@ Box_t = namedtuple(
17
17
  "Box_t",
18
18
  "from_r from_c upto_r upto_c type_",
19
19
  )
20
- Box_st = namedtuple(
21
- "Box_st",
22
- "coords type_"
23
- )
20
+ Box_st = namedtuple("Box_st", "coords type_")
21
+ Loc = namedtuple("Loc", "row column")
24
22
 
25
23
  Highlight = namedtuple(
26
24
  "Highlight",
@@ -472,4 +470,3 @@ Selected = namedtuple(
472
470
  None,
473
471
  ),
474
472
  )
475
-
tksheet/row_index.py CHANGED
@@ -31,10 +31,10 @@ from .functions import (
31
31
  consecutive_chunks,
32
32
  ev_stack_dict,
33
33
  event_dict,
34
- rounded_box_coords,
35
34
  get_n2a,
36
35
  is_contiguous,
37
36
  num2alpha,
37
+ rounded_box_coords,
38
38
  try_binding,
39
39
  )
40
40
  from .other_classes import (
@@ -51,6 +51,7 @@ from .vars import (
51
51
  USER_OS,
52
52
  rc_binding,
53
53
  symbols_set,
54
+ text_editor_to_unbind,
54
55
  )
55
56
 
56
57
 
@@ -965,7 +966,7 @@ class RowIndex(tk.Canvas):
965
966
  y1,
966
967
  x2,
967
968
  y2,
968
- radius=9 if self.PAR.ops.rounded_boxes else 0,
969
+ radius=8 if self.PAR.ops.rounded_boxes else 0,
969
970
  )
970
971
  if isinstance(iid, int):
971
972
  self.coords(iid, coords)
@@ -1755,6 +1756,7 @@ class RowIndex(tk.Canvas):
1755
1756
  key=extra_func_key,
1756
1757
  value=text,
1757
1758
  loc=r,
1759
+ row=r,
1758
1760
  boxes=self.MT.get_boxes(),
1759
1761
  selected=self.MT.selected,
1760
1762
  )
@@ -1816,12 +1818,14 @@ class RowIndex(tk.Canvas):
1816
1818
  self.text_editor.tktext.focus_set()
1817
1819
  self.text_editor.window.scroll_to_bottom()
1818
1820
  self.text_editor.tktext.bind("<Alt-Return>", lambda _x: self.text_editor_newline_binding(r=r))
1821
+ self.text_editor.tktext.bind("<Alt-KP_Enter>", lambda _x: self.text_editor_newline_binding(r=r))
1819
1822
  if USER_OS == "darwin":
1820
1823
  self.text_editor.tktext.bind("<Option-Return>", lambda _x: self.text_editor_newline_binding(r=r))
1821
1824
  for key, func in self.MT.text_editor_user_bound_keys.items():
1822
1825
  self.text_editor.tktext.bind(key, func)
1823
1826
  self.text_editor.tktext.bind("<Tab>", lambda _x: self.close_text_editor((r, "Tab")))
1824
1827
  self.text_editor.tktext.bind("<Return>", lambda _x: self.close_text_editor((r, "Return")))
1828
+ self.text_editor.tktext.bind("<KP_Enter>", lambda _x: self.close_text_editor((r, "Return")))
1825
1829
  if not dropdown:
1826
1830
  self.text_editor.tktext.bind("<FocusOut>", lambda _x: self.close_text_editor((r, "FocusOut")))
1827
1831
  self.text_editor.tktext.bind("<Escape>", lambda _x: self.close_text_editor((r, "Escape")))
@@ -1909,8 +1913,8 @@ class RowIndex(tk.Canvas):
1909
1913
 
1910
1914
  def hide_text_editor(self, reason: None | str = None) -> None:
1911
1915
  if self.text_editor.open:
1912
- for b in ("<Alt-Return>", "<Option-Return>", "<Tab>", "<Return>", "<FocusOut>", "<Escape>"):
1913
- self.text_editor.tktext.unbind(b)
1916
+ for binding in text_editor_to_unbind:
1917
+ self.text_editor.tktext.unbind(binding)
1914
1918
  self.itemconfig(self.text_editor.canvas_id, state="hidden")
1915
1919
  self.text_editor.open = False
1916
1920
  if reason == "Escape":
@@ -1942,6 +1946,7 @@ class RowIndex(tk.Canvas):
1942
1946
  key=editor_info[1] if len(editor_info) >= 2 else "FocusOut",
1943
1947
  value=text_editor_value,
1944
1948
  loc=r,
1949
+ row=r,
1945
1950
  boxes=self.MT.get_boxes(),
1946
1951
  selected=self.MT.selected,
1947
1952
  )
@@ -2064,6 +2069,7 @@ class RowIndex(tk.Canvas):
2064
2069
  sheet=self.PAR.name,
2065
2070
  value=self.text_editor.get(),
2066
2071
  loc=r,
2072
+ row=r,
2067
2073
  boxes=self.MT.get_boxes(),
2068
2074
  selected=self.MT.selected,
2069
2075
  ),
@@ -2100,6 +2106,7 @@ class RowIndex(tk.Canvas):
2100
2106
  key="??",
2101
2107
  value=selection,
2102
2108
  loc=r,
2109
+ row=r,
2103
2110
  boxes=self.MT.get_boxes(),
2104
2111
  selected=self.MT.selected,
2105
2112
  )
@@ -2322,6 +2329,7 @@ class RowIndex(tk.Canvas):
2322
2329
  key="??",
2323
2330
  value=value,
2324
2331
  loc=r,
2332
+ row=r,
2325
2333
  boxes=self.MT.get_boxes(),
2326
2334
  selected=self.MT.selected,
2327
2335
  )
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,9 @@ from .other_classes import (
46
45
  FontTuple,
47
46
  GeneratedMouseEvent,
48
47
  Node,
49
- Span,
50
48
  Selected,
49
+ SelectionBox,
50
+ Span,
51
51
  )
52
52
  from .row_index import RowIndex
53
53
  from .sheet_options import (
@@ -272,9 +272,6 @@ class Sheet(tk.Frame):
272
272
  highlightbackground=outline_color,
273
273
  highlightcolor=outline_color,
274
274
  )
275
- WARNING(
276
- "There have been many changes from tksheet version 6.x.x to version 7.x.x. Please see the changelog for more information."
277
- )
278
275
  self.ops = new_sheet_options()
279
276
  if column_width is not None:
280
277
  default_column_width = column_width
@@ -614,7 +611,7 @@ class Sheet(tk.Frame):
614
611
  for b, f in iterable:
615
612
  b = b.lower()
616
613
 
617
- if func is not None and b in emitted_events:
614
+ if f is not None and b in emitted_events:
618
615
  self.bind(b, f)
619
616
 
620
617
  if b in (
@@ -1074,6 +1071,17 @@ class Sheet(tk.Frame):
1074
1071
  self.MT.redo(event)
1075
1072
  return self
1076
1073
 
1074
+ def has_focus(
1075
+ self,
1076
+ ) -> bool:
1077
+ """
1078
+ Check if any Sheet widgets have focus
1079
+ Includes child widgets such as scroll bars
1080
+ Returns bool
1081
+ """
1082
+ widget = self.focus_get()
1083
+ return widget == self or any(widget == c for c in self.children.values())
1084
+
1077
1085
  def focus_set(
1078
1086
  self,
1079
1087
  canvas: Literal[
@@ -1357,16 +1365,14 @@ class Sheet(tk.Frame):
1357
1365
  if header:
1358
1366
  if table:
1359
1367
  res.extend(
1360
- [
1361
- [quick_hdata(c, get_displayed=hdisp)]
1362
- + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows]
1363
- for c in cols
1364
- ]
1368
+ [quick_hdata(c, get_displayed=hdisp)]
1369
+ + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows]
1370
+ for c in cols
1365
1371
  )
1366
1372
  else:
1367
- res.extend([[quick_hdata(c, get_displayed=hdisp)] for c in cols])
1373
+ res.extend([quick_hdata(c, get_displayed=hdisp)] for c in cols)
1368
1374
  elif table:
1369
- res.extend([[quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows] for c in cols])
1375
+ res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for r in rows] for c in cols)
1370
1376
  elif not span.transposed:
1371
1377
  if header:
1372
1378
  if header and index:
@@ -1379,16 +1385,14 @@ class Sheet(tk.Frame):
1379
1385
  if index:
1380
1386
  if table:
1381
1387
  res.extend(
1382
- [
1383
- [quick_idata(r, get_displayed=idisp)]
1384
- + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols]
1385
- for r in rows
1386
- ]
1388
+ [quick_idata(r, get_displayed=idisp)]
1389
+ + [quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols]
1390
+ for r in rows
1387
1391
  )
1388
1392
  else:
1389
- res.extend([[quick_idata(r, get_displayed=idisp)] for r in rows])
1393
+ res.extend([quick_idata(r, get_displayed=idisp)] for r in rows)
1390
1394
  elif table:
1391
- res.extend([[quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols] for r in rows])
1395
+ res.extend([quick_tdata(r, c, get_displayed=tdisp, fmt_kw=fmt_kw) for c in cols] for r in rows)
1392
1396
  if not span.ndim:
1393
1397
  # it's a cell
1394
1398
  if len(res) == 1 and len(res[0]) == 1:
@@ -1399,11 +1403,7 @@ class Sheet(tk.Frame):
1399
1403
  # retrieving a list of index cells or
1400
1404
  elif (index and not span.transposed and not table and not header) or (
1401
1405
  # it's a column that's spread across sublists
1402
- table
1403
- and res
1404
- and not span.transposed
1405
- and len(res[0]) == 1
1406
- and len(res[-1]) == 1
1406
+ table and res and not span.transposed and len(res[0]) == 1 and len(res[-1]) == 1
1407
1407
  ):
1408
1408
  res = list(chain.from_iterable(res))
1409
1409
  elif span.ndim == 1:
@@ -1521,7 +1521,7 @@ class Sheet(tk.Frame):
1521
1521
  )
1522
1522
 
1523
1523
  @data.setter
1524
- def data(self, value):
1524
+ def data(self, value: list[list[object]]) -> None:
1525
1525
  self.data_reference(value)
1526
1526
 
1527
1527
  def set_data(
@@ -2397,8 +2397,31 @@ class Sheet(tk.Frame):
2397
2397
  self.set_refresh_timer(redraw)
2398
2398
  return data_idxs, disp_idxs, event_data
2399
2399
 
2400
- def equalize_data_row_lengths(self, include_header: bool = False) -> int:
2401
- return self.MT.equalize_data_row_lengths(include_header=include_header)
2400
+ def equalize_data_row_lengths(
2401
+ self,
2402
+ include_header: bool = True,
2403
+ ) -> int:
2404
+ return self.MT.equalize_data_row_lengths(
2405
+ include_header=include_header,
2406
+ )
2407
+
2408
+ def full_move_rows_idxs(self, data_idxs: dict[int, int]) -> dict[int, int]:
2409
+ """
2410
+ Converts the dict provided by moving rows event data
2411
+ Under the keys ['moved']['rows']['data']
2412
+ Into a dict of {old index: new index} for every row
2413
+ Includes row numbers in cell options, spans, etc.
2414
+ """
2415
+ return self.MT.get_full_new_idxs(self.MT.get_max_row_idx(), data_idxs)
2416
+
2417
+ def full_move_columns_idxs(self, data_idxs: dict[int, int]) -> dict[int, int]:
2418
+ """
2419
+ Converts the dict provided by moving columns event data
2420
+ Under the keys ['moved']['columns']['data']
2421
+ Into a dict of {old index: new index} for every column
2422
+ Includes column numbers in cell options, spans, etc.
2423
+ """
2424
+ return self.MT.get_full_new_idxs(self.MT.get_max_column_idx(), data_idxs)
2402
2425
 
2403
2426
  # Highlighting Cells
2404
2427
 
@@ -2850,12 +2873,7 @@ class Sheet(tk.Frame):
2850
2873
  self.set_refresh_timer(redraw)
2851
2874
  return self
2852
2875
 
2853
- def index_align(
2854
- self,
2855
- align: str = None,
2856
- redraw: bool = True,
2857
- ) -> str | Sheet:
2858
- return self.row_index_align(align, redraw)
2876
+ index_align = row_index_align
2859
2877
 
2860
2878
  def align(
2861
2879
  self,
@@ -2913,12 +2931,25 @@ class Sheet(tk.Frame):
2913
2931
  def selected(self) -> tuple[()] | Selected:
2914
2932
  return self.MT.selected
2915
2933
 
2934
+ @selected.setter
2935
+ def selected(self, selected: tuple[()] | Selected) -> Sheet:
2936
+ if selected:
2937
+ self.MT.set_currently_selected(
2938
+ r=selected[0],
2939
+ c=selected[1],
2940
+ item=selected[4],
2941
+ box=selected[3],
2942
+ )
2943
+ else:
2944
+ self.MT.deselect()
2945
+ return self
2946
+
2916
2947
  def get_selected_rows(
2917
2948
  self,
2918
2949
  get_cells: bool = False,
2919
2950
  get_cells_as_rows: bool = False,
2920
2951
  return_tuple: bool = False,
2921
- ) -> tuple | set:
2952
+ ) -> tuple[int] | tuple[tuple[int, int]] | set[int] | set[tuple[int, int]]:
2922
2953
  if return_tuple:
2923
2954
  return tuple(self.MT.get_selected_rows(get_cells=get_cells, get_cells_as_rows=get_cells_as_rows))
2924
2955
  return self.MT.get_selected_rows(get_cells=get_cells, get_cells_as_rows=get_cells_as_rows)
@@ -2928,7 +2959,7 @@ class Sheet(tk.Frame):
2928
2959
  get_cells: bool = False,
2929
2960
  get_cells_as_columns: bool = False,
2930
2961
  return_tuple: bool = False,
2931
- ) -> tuple | set:
2962
+ ) -> tuple[int] | tuple[tuple[int, int]] | set[int] | set[tuple[int, int]]:
2932
2963
  if return_tuple:
2933
2964
  return tuple(self.MT.get_selected_cols(get_cells=get_cells, get_cells_as_cols=get_cells_as_columns))
2934
2965
  return self.MT.get_selected_cols(get_cells=get_cells, get_cells_as_cols=get_cells_as_columns)
@@ -2939,7 +2970,7 @@ class Sheet(tk.Frame):
2939
2970
  get_columns: bool = False,
2940
2971
  sort_by_row: bool = False,
2941
2972
  sort_by_column: bool = False,
2942
- ) -> list | set:
2973
+ ) -> list[tuple[int, int]] | set[tuple[int, int]]:
2943
2974
  if sort_by_row and sort_by_column:
2944
2975
  sels = sorted(
2945
2976
  self.MT.get_selected_cells(get_rows=get_rows, get_cols=get_columns),
@@ -2968,6 +2999,18 @@ class Sheet(tk.Frame):
2968
2999
  def boxes(self) -> list[tuple[tuple[int, int, int, int], str]]:
2969
3000
  return self.MT.get_all_selection_boxes_with_types()
2970
3001
 
3002
+ @boxes.setter
3003
+ def boxes(self, boxes: Sequence[tuple[tuple[int, int, int, int], str]]) -> Sheet:
3004
+ self.MT.deselect()
3005
+ self.MT.reselect_from_get_boxes(
3006
+ boxes={box[0] if isinstance(box[0], tuple) else tuple(box[0]): box[1] for box in boxes}
3007
+ )
3008
+ return self
3009
+
3010
+ @property
3011
+ def canvas_boxes(self) -> dict[int, SelectionBox]:
3012
+ return self.MT.selection_boxes
3013
+
2971
3014
  def cell_selected(
2972
3015
  self,
2973
3016
  r: int,
@@ -3000,8 +3043,17 @@ class Sheet(tk.Frame):
3000
3043
  def all_selected(self) -> bool:
3001
3044
  return self.MT.all_selected()
3002
3045
 
3003
- def get_ctrl_x_c_boxes(self) -> tuple[dict[tuple[int, int, int, int], str], int]:
3004
- return self.MT.get_ctrl_x_c_boxes()
3046
+ def get_ctrl_x_c_boxes(
3047
+ self,
3048
+ nrows: bool = True,
3049
+ ) -> tuple[dict[tuple[int, int, int, int], str], int] | dict[tuple[int, int, int, int], str]:
3050
+ if nrows:
3051
+ return self.MT.get_ctrl_x_c_boxes()
3052
+ return self.MT.get_ctrl_x_c_boxes()[0]
3053
+
3054
+ @property
3055
+ def ctrl_boxes(self) -> dict[tuple[int, int, int, int], str]:
3056
+ return self.MT.get_ctrl_x_c_boxes()[0]
3005
3057
 
3006
3058
  def get_selected_min_max(
3007
3059
  self,
@@ -3023,7 +3075,7 @@ class Sheet(tk.Frame):
3023
3075
 
3024
3076
  def select_row(self, row: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3025
3077
  self.RI.select_row(
3026
- int(row) if not isinstance(row, int) else row,
3078
+ row if isinstance(row, int) else int(row),
3027
3079
  redraw=False,
3028
3080
  run_binding_func=run_binding_func,
3029
3081
  )
@@ -3032,7 +3084,7 @@ class Sheet(tk.Frame):
3032
3084
 
3033
3085
  def select_column(self, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3034
3086
  self.CH.select_col(
3035
- int(column) if not isinstance(column, int) else column,
3087
+ column if isinstance(column, int) else int(column),
3036
3088
  redraw=False,
3037
3089
  run_binding_func=run_binding_func,
3038
3090
  )
@@ -3041,8 +3093,8 @@ class Sheet(tk.Frame):
3041
3093
 
3042
3094
  def select_cell(self, row: int, column: int, redraw: bool = True, run_binding_func: bool = True) -> Sheet:
3043
3095
  self.MT.select_cell(
3044
- int(row) if not isinstance(row, int) else row,
3045
- int(column) if not isinstance(column, int) else column,
3096
+ row if isinstance(row, int) else int(row),
3097
+ column if isinstance(column, int) else int(column),
3046
3098
  redraw=False,
3047
3099
  run_binding_func=run_binding_func,
3048
3100
  )
@@ -3722,10 +3774,24 @@ class Sheet(tk.Frame):
3722
3774
  self.MT.all_columns_displayed = a
3723
3775
  return v
3724
3776
 
3777
+ @property
3778
+ def all_columns(self) -> bool:
3779
+ return self.MT.all_columns_displayed
3780
+
3781
+ @all_columns.setter
3782
+ def all_columns(self, a: bool) -> Sheet:
3783
+ self.MT.all_columns_displayed = a
3784
+ return self
3785
+
3725
3786
  @property
3726
3787
  def displayed_columns(self) -> list[int]:
3727
3788
  return self.MT.displayed_columns
3728
3789
 
3790
+ @displayed_columns.setter
3791
+ def displayed_columns(self, columns: list[int]) -> Sheet:
3792
+ self.display_columns(columns=columns, reset_col_positions=False, redraw=True)
3793
+ return self
3794
+
3729
3795
  # Hiding Rows
3730
3796
 
3731
3797
  def displayed_row_to_data(self, r: int) -> int:
@@ -3828,10 +3894,24 @@ class Sheet(tk.Frame):
3828
3894
  self.MT.all_rows_displayed = a
3829
3895
  return v
3830
3896
 
3897
+ @property
3898
+ def all_rows(self) -> bool:
3899
+ return self.MT.all_rows_displayed
3900
+
3901
+ @all_rows.setter
3902
+ def all_rows(self, a: bool) -> Sheet:
3903
+ self.MT.all_rows_displayed = a
3904
+ return self
3905
+
3831
3906
  @property
3832
3907
  def displayed_rows(self) -> list[int]:
3833
3908
  return self.MT.displayed_rows
3834
3909
 
3910
+ @displayed_rows.setter
3911
+ def displayed_rows(self, rows: list[int]) -> Sheet:
3912
+ self.display_rows(rows=rows, reset_row_positions=False, redraw=True)
3913
+ return self
3914
+
3835
3915
  # Hiding Sheet Elements
3836
3916
 
3837
3917
  def hide(
@@ -4242,9 +4322,7 @@ class Sheet(tk.Frame):
4242
4322
  self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
4243
4323
  return self
4244
4324
 
4245
- def refresh(self, redraw_header: bool = True, redraw_row_index: bool = True) -> Sheet:
4246
- self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
4247
- return self
4325
+ refresh = redraw
4248
4326
 
4249
4327
  # Tags
4250
4328
 
@@ -4381,7 +4459,10 @@ class Sheet(tk.Frame):
4381
4459
  data: list[list[object]],
4382
4460
  iid_column: int,
4383
4461
  parent_column: int,
4462
+ text_column: None | int = None,
4384
4463
  ) -> Sheet:
4464
+ if text_column is None:
4465
+ text_column = iid_column
4385
4466
  tally_of_ids = defaultdict(lambda: -1)
4386
4467
  ncols = max(map(len, data), default=0)
4387
4468
  for rn, row in enumerate(data):
@@ -4400,13 +4481,13 @@ class Sheet(tk.Frame):
4400
4481
  tally_of_ids[iid] += 1
4401
4482
  row[iid_column] = new
4402
4483
  if iid not in self.RI.tree:
4403
- self.RI.tree[iid] = Node(row[iid_column], iid, "")
4484
+ self.RI.tree[iid] = Node(row[text_column], iid, "")
4404
4485
  if iid == pid or self.RI.pid_causes_recursive_loop(iid, pid):
4405
4486
  row[parent_column] = ""
4406
4487
  pid = ""
4407
4488
  if pid:
4408
4489
  if pid not in self.RI.tree:
4409
- self.RI.tree[pid] = Node(row[parent_column], pid)
4490
+ self.RI.tree[pid] = Node(row[text_column], pid)
4410
4491
  self.RI.tree[iid].parent = self.RI.tree[pid]
4411
4492
  self.RI.tree[pid].children.append(self.RI.tree[iid])
4412
4493
  else:
@@ -4416,7 +4497,7 @@ class Sheet(tk.Frame):
4416
4497
  if n.parent is None:
4417
4498
  n.parent = ""
4418
4499
  newrow = self.MT.get_empty_row_seq(len(data), ncols)
4419
- newrow[iid_column] = n.text
4500
+ newrow[iid_column] = n.iid
4420
4501
  self.RI.tree_rns[n.iid] = len(data)
4421
4502
  data.append(newrow)
4422
4503
  self.insert_rows(
@@ -4429,7 +4510,7 @@ class Sheet(tk.Frame):
4429
4510
  self.RI.tree_rns = {n.iid: i for i, n in enumerate(self.MT._row_index)}
4430
4511
  self.hide_rows(
4431
4512
  set(self.RI.tree_rns[iid] for iid in self.get_children() if self.RI.tree[iid].parent),
4432
- deselect_all=True,
4513
+ deselect_all=False,
4433
4514
  data_indexes=True,
4434
4515
  )
4435
4516
  return self
@@ -4450,7 +4531,7 @@ class Sheet(tk.Frame):
4450
4531
  Accepts set[str] of iids that are open in the treeview
4451
4532
  Closes everything else
4452
4533
  """
4453
- self.RI.tree_open_ids = open_ids
4534
+ self.RI.tree_open_ids = open_ids if isinstance(open_ids, set) else set(open_ids)
4454
4535
  self.hide_rows(
4455
4536
  set(self.MT.displayed_rows),
4456
4537
  redraw=False,
@@ -4756,7 +4837,7 @@ class Sheet(tk.Frame):
4756
4837
  reattach = move
4757
4838
 
4758
4839
  def exists(self, item: str) -> bool:
4759
- return item in self.RI.tree
4840
+ return item.lower() in self.RI.tree
4760
4841
 
4761
4842
  def parent(self, item: str) -> str:
4762
4843
  if (item := item.lower()) not in self.RI.tree:
@@ -4811,8 +4892,9 @@ class Sheet(tk.Frame):
4811
4892
  ]
4812
4893
 
4813
4894
  def selection_set(self, *items) -> Sheet:
4814
- self.deselect()
4815
- self.selection_add(*items)
4895
+ if any(item.lower() in self.RI.tree for item in unpack(items)):
4896
+ self.deselect()
4897
+ self.selection_add(*items)
4816
4898
  return self
4817
4899
 
4818
4900
  def selection_add(self, *items) -> Sheet:
@@ -4868,12 +4950,8 @@ class Sheet(tk.Frame):
4868
4950
  if redraw and self.after_redraw_id is None:
4869
4951
  self.after_redraw_id = self.after(self.after_redraw_time_ms, self.after_redraw)
4870
4952
 
4871
- def after_redraw(
4872
- self,
4873
- redraw_header: bool = True,
4874
- redraw_row_index: bool = True,
4875
- ) -> None:
4876
- self.MT.main_table_redraw_grid_and_text(redraw_header=redraw_header, redraw_row_index=redraw_row_index)
4953
+ def after_redraw(self) -> None:
4954
+ self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
4877
4955
  self.after_redraw_id = None
4878
4956
 
4879
4957
  def del_options_using_span(
@@ -5385,7 +5463,7 @@ class Sheet(tk.Frame):
5385
5463
  row: int = 0,
5386
5464
  column: int = 0,
5387
5465
  cells: list = [],
5388
- canvas: str = "table",
5466
+ canvas: Literal["table", "index", "header"] = "table",
5389
5467
  bg: bool | None | str = False,
5390
5468
  fg: bool | None | str = False,
5391
5469
  redraw: bool = True,
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.7
3
+ Version: 7.1.9
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=9Wvm_zS75-z0FFGXl9Vz1cGsXbUBi983lVC3VmLnmhM,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=ytmHQtSa8cN6dKYLFra5G0393-4sU7bivvT_U4wxksI,39697
6
+ tksheet/main_table.py,sha256=YKlcqiSj089i0-HXGtPBTLGW28Y7d_lv6hFFF6S_pQM,318310
7
+ tksheet/other_classes.py,sha256=P3FYUYreLhstATvHCNow8sDQoCsD_02KB6oXcca3ahE,13628
8
+ tksheet/row_index.py,sha256=wfOPHitGfipTysCMfQA-Nl4mJawmkv9gm5CAtIlKgxo,105673
9
+ tksheet/sheet.py,sha256=n_LrHnd4Xim2TzgJ1DY8Z1n2aaUdtwWiRukvxFMTOws,258919
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.9.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
+ tksheet-7.1.9.dist-info/METADATA,sha256=Nyratgt4E9d83xYtfOpdQh4nd8o4HzTiV7-Mz61RPZw,6013
18
+ tksheet-7.1.9.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
+ tksheet-7.1.9.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
+ tksheet-7.1.9.dist-info/RECORD,,
tksheet/listbox.py DELETED
@@ -1,19 +0,0 @@
1
- from __future__ import annotations
2
- import tkinter as tk
3
- # from collections.abc import Callable, Generator, Iterator, Sequence
4
-
5
- from .sheet import (
6
- Sheet,
7
- )
8
-
9
-
10
- class ListBox(Sheet):
11
- def __init__(
12
- self,
13
- parent: tk.Misc,
14
- ) -> None:
15
- Sheet.__init__(
16
- self,
17
- parent=parent,
18
- )
19
- self.parent = parent
@@ -1,21 +0,0 @@
1
- tksheet/__init__.py,sha256=UgweIADXnlw1-KpD4Xr0sA_l6qAWTP3yzQ1Bo716Fkg,2010
2
- tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
- tksheet/column_headers.py,sha256=dBEnPjbI6nqcS0OISWJ0tXBBxtGjB67OE8z2-Bx8X1U,99870
4
- tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
- tksheet/functions.py,sha256=dMJwG27Qo5WsfwzkL7A9X-PERGuGFhpQvP95BnlohJ8,39612
6
- tksheet/listbox.py,sha256=BUHx-PsZL6yGMewxAaEZV_8mOXCVWenWqzHp3tasGvo,384
7
- tksheet/main_table.py,sha256=ngwXVNqrtOZPtR-BqCuh7UVAubfB8v_JfdI2peJAzPM,323154
8
- tksheet/other_classes.py,sha256=Hjr7c0kD2_880xjtGuFn9gQ-7ED5kSiNahniBeXcf84,13604
9
- tksheet/row_index.py,sha256=NHFu5a35nPMuxajHhpS2RH8sOTYKKKb6WGO8zWofxqs,105354
10
- tksheet/sheet.py,sha256=PbCa8RCiBYg3Zl_26j1aIKphGst84S2lGHKodnZ6Kk0,256166
11
- tksheet/sheet_options.py,sha256=mh0rTvWrFvIKaiv88jtMZy0TSA8zTS1GXSe88u8_rzk,11978
12
- tksheet/text_editor.py,sha256=81_IZKrTVa2KIx2cJ4n3cFvFMAwvbHIQYgqtyat-97I,6681
13
- tksheet/themes.py,sha256=OwUe31NRbosjw3ZoZsMyB8lNVyYin9YcKLhCturi5q8,13398
14
- tksheet/top_left_rectangle.py,sha256=-2u9GfOvcqhkKwHEtbqdFvXCY3RbvL5k2Sh9l3r_k04,8275
15
- tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
16
- tksheet/vars.py,sha256=Iukk7-MMT9X7vv0m3nQPKzbp2Iw2Pg1wJEW7js919Mo,2092
17
- tksheet-7.1.7.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
18
- tksheet-7.1.7.dist-info/METADATA,sha256=w5PeLRxO5tOgSz577YZLks3-OtluVDYw6Kw--fixI8w,6013
19
- tksheet-7.1.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
20
- tksheet-7.1.7.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
21
- tksheet-7.1.7.dist-info/RECORD,,