tksheet 7.1.12__py3-none-any.whl → 7.1.20__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.12"
7
+ __version__ = "7.1.20"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
@@ -42,6 +42,7 @@ from .functions import (
42
42
  event_dict,
43
43
  get_checkbox_dict,
44
44
  get_checkbox_kwargs,
45
+ get_data_from_clipboard,
45
46
  get_dropdown_dict,
46
47
  get_dropdown_kwargs,
47
48
  get_index_of_gap_in_sorted_integer_seq_forward,
tksheet/column_headers.py CHANGED
@@ -22,10 +22,10 @@ from .colors import (
22
22
  from .formatters import is_bool_like, try_to_bool
23
23
  from .functions import (
24
24
  consecutive_ranges,
25
- ev_stack_dict,
26
25
  event_dict,
27
26
  get_n2a,
28
27
  is_contiguous,
28
+ pickled_event_dict,
29
29
  rounded_box_coords,
30
30
  try_binding,
31
31
  )
@@ -133,6 +133,9 @@ class ColumnHeaders(tk.Canvas):
133
133
  self.bind("<Double-Button-1>", self.double_b1)
134
134
  self.bind(rc_binding, self.rc)
135
135
  self.bind("<MouseWheel>", self.mousewheel)
136
+ if USER_OS == "linux":
137
+ self.bind("<Button-4>", self.mousewheel)
138
+ self.bind("<Button-5>", self.mousewheel)
136
139
  else:
137
140
  self.unbind("<Motion>")
138
141
  self.unbind("<ButtonPress-1>")
@@ -141,6 +144,9 @@ class ColumnHeaders(tk.Canvas):
141
144
  self.unbind("<Double-Button-1>")
142
145
  self.unbind(rc_binding)
143
146
  self.unbind("<MouseWheel>")
147
+ if USER_OS == "linux":
148
+ self.unbind("<Button-4>")
149
+ self.unbind("<Button-5>")
144
150
 
145
151
  def mousewheel(self, event: object):
146
152
  maxlines = 0
@@ -845,7 +851,7 @@ class ColumnHeaders(tk.Canvas):
845
851
  "displayed": disp_new_idxs,
846
852
  }
847
853
  if self.MT.undo_enabled:
848
- self.MT.undo_stack.append(ev_stack_dict(event_data))
854
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
849
855
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
850
856
  try_binding(self.ch_extra_end_drag_drop_func, event_data, "end_move_columns")
851
857
  self.MT.sheet_modified(event_data)
@@ -2091,7 +2097,7 @@ class ColumnHeaders(tk.Canvas):
2091
2097
  self.fix_header(datacn)
2092
2098
  if not check_input_valid or self.input_valid_for_cell(datacn, value):
2093
2099
  if self.MT.undo_enabled and undo:
2094
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2100
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2095
2101
  self.set_cell_data(datacn=datacn, value=value)
2096
2102
  edited = True
2097
2103
  if edited and cell_resize and self.PAR.ops.cell_auto_resize_enabled:
tksheet/functions.py CHANGED
@@ -1,8 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import bisect
4
+ import csv
5
+ import io
4
6
  import pickle
5
7
  import re
8
+ import tkinter as tk
6
9
  import zlib
7
10
  from collections import deque
8
11
  from collections.abc import (
@@ -19,6 +22,7 @@ from .other_classes import (
19
22
  DotDict,
20
23
  EventDataDict,
21
24
  Highlight,
25
+ Loc,
22
26
  Span,
23
27
  )
24
28
 
@@ -27,6 +31,21 @@ pickle_obj = partial(pickle.dumps, protocol=pickle.HIGHEST_PROTOCOL)
27
31
  unpickle_obj = pickle.loads
28
32
 
29
33
 
34
+ def get_data_from_clipboard(
35
+ widget: tk.Misc,
36
+ delimiters: str,
37
+ lineterminator: str = "\n",
38
+ ) -> list[list[str]]:
39
+ data = widget.clipboard_get()
40
+ try:
41
+ dialect = csv.Sniffer().sniff(data, delimiters=delimiters)
42
+ except Exception:
43
+ dialect = csv.excel_tab
44
+ if dialect.delimiter in data or lineterminator in data:
45
+ return list(csv.reader(io.StringIO(data), dialect=dialect, skipinitialspace=True))
46
+ return [[data]]
47
+
48
+
30
49
  def pickle_compress(obj: object) -> bytes:
31
50
  return compress(pickle_obj(obj))
32
51
 
@@ -164,11 +183,8 @@ def change_eventname(event_dict: EventDataDict, newname: str) -> EventDataDict:
164
183
  return EventDataDict({**event_dict, **{"eventname": newname}})
165
184
 
166
185
 
167
- def ev_stack_dict(d: DotDict) -> DotDict:
168
- return DotDict(
169
- name=d["eventname"],
170
- data=pickle_compress(d),
171
- )
186
+ def pickled_event_dict(d: DotDict) -> DotDict:
187
+ return DotDict(name=d["eventname"], data=pickle_compress(d))
172
188
 
173
189
 
174
190
  def len_to_idx(n: int) -> int:
@@ -406,11 +422,13 @@ def index_exists(seq: Sequence[object], index: int) -> bool:
406
422
  def move_elements_by_mapping(
407
423
  seq: list[object],
408
424
  new_idxs: dict[int, int],
409
- old_idxs: dict[int, int],
425
+ old_idxs: dict[int, int] | None = None,
410
426
  ) -> list[object]:
411
427
  # move elements of a list around, displacing
412
428
  # other elements based on mapping
413
429
  # of {old index: new index, ...}
430
+ if old_idxs is None:
431
+ old_idxs = dict(zip(new_idxs.values(), new_idxs))
414
432
 
415
433
  # create dummy list
416
434
  res = [0] * len(seq)
@@ -1293,10 +1311,12 @@ def mod_span_widget(span: Span, widget: object) -> Span:
1293
1311
  def mod_event_val(
1294
1312
  event_data: EventDataDict,
1295
1313
  val: object,
1296
- loc: tuple[int, int] | int,
1314
+ loc: Loc | int,
1297
1315
  ) -> EventDataDict:
1298
1316
  event_data.value = val
1299
- event_data.loc = loc
1317
+ event_data.loc = Loc(*loc)
1318
+ event_data.row = loc[0]
1319
+ event_data.column = loc[1]
1300
1320
  return event_data
1301
1321
 
1302
1322
 
tksheet/main_table.py CHANGED
@@ -52,9 +52,9 @@ from .functions import (
52
52
  decompress_load,
53
53
  diff_gen,
54
54
  diff_list,
55
- ev_stack_dict,
56
55
  event_dict,
57
56
  gen_formatted,
57
+ get_data_from_clipboard,
58
58
  get_new_indexes,
59
59
  get_seq_without_gaps_at_index,
60
60
  index_exists,
@@ -68,6 +68,7 @@ from .functions import (
68
68
  mod_span_widget,
69
69
  move_elements_by_mapping,
70
70
  pickle_obj,
71
+ pickled_event_dict,
71
72
  rounded_box_coords,
72
73
  span_idxs_post_move,
73
74
  try_binding,
@@ -363,10 +364,10 @@ class MainTable(tk.Canvas):
363
364
  ("<ButtonRelease-1>", self, self.b1_release),
364
365
  ("<Double-Button-1>", self, self.double_b1),
365
366
  ("<MouseWheel>", self, self.mousewheel),
367
+ ("<MouseWheel>", self.RI, self.mousewheel),
366
368
  ("<Shift-ButtonPress-1>", self, self.shift_b1_press),
367
369
  ("<Shift-ButtonPress-1>", self.CH, self.CH.shift_b1_press),
368
370
  ("<Shift-ButtonPress-1>", self.RI, self.RI.shift_b1_press),
369
- ("<MouseWheel>", self.RI, self.mousewheel),
370
371
  (rc_binding, self, self.rc),
371
372
  (f"<{ctrl_key}-ButtonPress-1>", self, self.ctrl_b1_press),
372
373
  (f"<{ctrl_key}-ButtonPress-1>", self.CH, self.CH.ctrl_b1_press),
@@ -385,9 +386,11 @@ class MainTable(tk.Canvas):
385
386
  ("<Control-equal>", self.zoom_in),
386
387
  ("<Control-minus>", self.zoom_out),
387
388
  )
388
- all_canvas_linux_bindings = {
389
+ mt_ri_canvas_linux_bindings = {
389
390
  ("<Button-4>", self.mousewheel),
390
391
  ("<Button-5>", self.mousewheel),
392
+ }
393
+ all_canvas_linux_bindings = {
391
394
  ("<Shift-Button-4>", self.shift_mousewheel),
392
395
  ("<Shift-Button-5>", self.shift_mousewheel),
393
396
  ("<Control-Button-4>", self.ctrl_mousewheel),
@@ -400,6 +403,9 @@ class MainTable(tk.Canvas):
400
403
  for canvas in (self, self.RI, self.CH):
401
404
  canvas.bind(b[0], b[1])
402
405
  if USER_OS == "linux":
406
+ for b in mt_ri_canvas_linux_bindings:
407
+ for canvas in (self, self.RI):
408
+ canvas.bind(b[0], b[1])
403
409
  for b in all_canvas_linux_bindings:
404
410
  for canvas in (self, self.RI, self.CH):
405
411
  canvas.bind(b[0], b[1])
@@ -410,6 +416,9 @@ class MainTable(tk.Canvas):
410
416
  for canvas in (self, self.RI, self.CH):
411
417
  canvas.unbind(b[0])
412
418
  if USER_OS == "linux":
419
+ for b in mt_ri_canvas_linux_bindings:
420
+ for canvas in (self, self.RI):
421
+ canvas.unbind(b[0])
413
422
  for b in all_canvas_linux_bindings:
414
423
  for canvas in (self, self.RI, self.CH):
415
424
  canvas.unbind(b[0])
@@ -495,6 +504,8 @@ class MainTable(tk.Canvas):
495
504
  def get_ctrl_x_c_boxes(self) -> tuple[dict[tuple[int, int, int, int], str], int]:
496
505
  boxes = {}
497
506
  maxrows = 0
507
+ if not self.selected:
508
+ return boxes, maxrows
498
509
  if self.selected.type_ in ("cells", "columns"):
499
510
  curr_box = self.selection_boxes[self.selected.fill_iid].coords
500
511
  maxrows = curr_box[2] - curr_box[0]
@@ -517,7 +528,7 @@ class MainTable(tk.Canvas):
517
528
  )
518
529
  return s, writer
519
530
 
520
- def ctrl_c(self, event=None) -> None:
531
+ def ctrl_c(self, event=None) -> None | EventDataDict:
521
532
  if not self.selected:
522
533
  return
523
534
  event_data = event_dict(
@@ -555,14 +566,17 @@ class MainTable(tk.Canvas):
555
566
  for r1, c1, r2, c2 in boxes:
556
567
  self.show_ctrl_outline(canvas="table", start_cell=(c1, r1), end_cell=(c2, r2))
557
568
  self.clipboard_clear()
558
- if len(event_data["cells"]["table"]) == 1:
569
+ if len(event_data["cells"]["table"]) == 1 and self.PAR.ops.to_clipboard_lineterminator not in next(
570
+ iter(event_data["cells"]["table"].values())
571
+ ):
559
572
  self.clipboard_append(next(iter(event_data["cells"]["table"].values())))
560
573
  else:
561
574
  self.clipboard_append(s.getvalue())
562
575
  self.update_idletasks()
563
576
  try_binding(self.extra_end_ctrl_c_func, event_data, "end_ctrl_c")
577
+ return event_data
564
578
 
565
- def ctrl_x(self, event=None) -> None:
579
+ def ctrl_x(self, event=None, validation: bool = True) -> None | EventDataDict:
566
580
  if not self.selected:
567
581
  return
568
582
  event_data = event_dict(
@@ -586,10 +600,14 @@ class MainTable(tk.Canvas):
586
600
  datacn = self.datacn(c)
587
601
  row.append(self.get_cell_clipboard(datarn, datacn))
588
602
  val = self.get_value_for_empty_cell(datarn, datacn)
589
- if not self.edit_validation_func or (
590
- self.edit_validation_func
591
- and (val := self.edit_validation_func(mod_event_val(event_data, val, (r1 + rn, c))))
592
- is not None
603
+ if (
604
+ not self.edit_validation_func
605
+ or not validation
606
+ or (
607
+ self.edit_validation_func
608
+ and (val := self.edit_validation_func(mod_event_val(event_data, val, (r1 + rn, c))))
609
+ is not None
610
+ )
593
611
  ):
594
612
  event_data = self.event_data_set_cell(
595
613
  datarn,
@@ -607,10 +625,14 @@ class MainTable(tk.Canvas):
607
625
  datacn = self.datacn(c)
608
626
  row.append(self.get_cell_clipboard(datarn, datacn))
609
627
  val = self.get_value_for_empty_cell(datarn, datacn)
610
- if not self.edit_validation_func or (
611
- self.edit_validation_func
612
- and (val := self.edit_validation_func(mod_event_val(event_data, val, (r1 + rn, c))))
613
- is not None
628
+ if (
629
+ not self.edit_validation_func
630
+ or not validation
631
+ or (
632
+ self.edit_validation_func
633
+ and (val := self.edit_validation_func(mod_event_val(event_data, val, (r1 + rn, c))))
634
+ is not None
635
+ )
614
636
  ):
615
637
  event_data = self.event_data_set_cell(
616
638
  datarn,
@@ -620,9 +642,11 @@ class MainTable(tk.Canvas):
620
642
  )
621
643
  writer.writerow(row)
622
644
  if event_data["cells"]["table"]:
623
- self.undo_stack.append(ev_stack_dict(event_data))
645
+ self.undo_stack.append(pickled_event_dict(event_data))
624
646
  self.clipboard_clear()
625
- if len(event_data["cells"]["table"]) == 1:
647
+ if len(event_data["cells"]["table"]) == 1 and self.PAR.ops.to_clipboard_lineterminator not in next(
648
+ iter(event_data["cells"]["table"].values())
649
+ ):
626
650
  self.clipboard_append(next(iter(event_data["cells"]["table"].values())))
627
651
  else:
628
652
  self.clipboard_append(s.getvalue())
@@ -633,8 +657,9 @@ class MainTable(tk.Canvas):
633
657
  if event_data["cells"]["table"]:
634
658
  try_binding(self.extra_end_ctrl_x_func, event_data, "end_ctrl_x")
635
659
  self.sheet_modified(event_data)
660
+ return event_data
636
661
 
637
- def ctrl_v(self, event: object = None) -> None:
662
+ def ctrl_v(self, event: object = None, validation: bool = True) -> None | EventDataDict:
638
663
  if not self.PAR.ops.expand_sheet_if_paste_too_big and (
639
664
  len(self.col_positions) == 1 or len(self.row_positions) == 1
640
665
  ):
@@ -660,18 +685,13 @@ class MainTable(tk.Canvas):
660
685
  elif len(self.row_positions) > 1 and len(self.col_positions) > 1:
661
686
  selected_c, selected_r = 0, len(self.row_positions) - 1
662
687
  try:
663
- data = self.clipboard_get()
688
+ data = get_data_from_clipboard(
689
+ widget=self,
690
+ delimiters=self.PAR.ops.from_clipboard_delimiters,
691
+ lineterminator=self.PAR.ops.to_clipboard_lineterminator,
692
+ )
664
693
  except Exception:
665
694
  return
666
- try:
667
- dialect = csv.Sniffer().sniff(data, delimiters=self.PAR.ops.from_clipboard_delimiters)
668
- except Exception:
669
- dialect = csv.excel_tab
670
- if dialect.delimiter in data:
671
- if not (data := list(csv.reader(io.StringIO(data), dialect=dialect, skipinitialspace=True))):
672
- return
673
- else:
674
- data = [[data]]
675
695
  new_data_numcols = max(map(len, data))
676
696
  new_data_numrows = len(data)
677
697
  for rn, r in enumerate(data):
@@ -749,9 +769,13 @@ class MainTable(tk.Canvas):
749
769
  for ndr, r in enumerate(range(selected_r, selected_r_adjusted_new_data_numrows)):
750
770
  for ndc, c in enumerate(range(selected_c, selected_c_adjusted_new_data_numcols)):
751
771
  val = data[ndr][ndc]
752
- if not self.edit_validation_func or (
753
- self.edit_validation_func
754
- and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
772
+ if (
773
+ not self.edit_validation_func
774
+ or not validation
775
+ or (
776
+ self.edit_validation_func
777
+ and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
778
+ )
755
779
  ):
756
780
  event_data = self.event_data_set_cell(
757
781
  datarn=self.datarn(r),
@@ -785,10 +809,14 @@ class MainTable(tk.Canvas):
785
809
  ):
786
810
  val = data[ndr][ndc]
787
811
  datacn = self.datacn(c)
788
- if not self.edit_validation_func or (
789
- self.edit_validation_func
790
- and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
791
- and self.input_valid_for_cell(r, datacn, val, ignore_empty=True)
812
+ if (
813
+ not self.edit_validation_func
814
+ or not validation
815
+ or (
816
+ self.edit_validation_func
817
+ and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
818
+ and self.input_valid_for_cell(r, datacn, val, ignore_empty=True)
819
+ )
792
820
  ):
793
821
  rows[r][datacn] = val
794
822
  ctr += 1
@@ -823,10 +851,14 @@ class MainTable(tk.Canvas):
823
851
  ):
824
852
  val = data[ndr][ndc]
825
853
  datarn = self.datarn(r)
826
- if not self.edit_validation_func or (
827
- self.edit_validation_func
828
- and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
829
- and self.input_valid_for_cell(datarn, c, val, ignore_empty=True)
854
+ if (
855
+ not self.edit_validation_func
856
+ or not validation
857
+ or (
858
+ self.edit_validation_func
859
+ and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
860
+ and self.input_valid_for_cell(datarn, c, val, ignore_empty=True)
861
+ )
830
862
  ):
831
863
  columns[c][datarn] = val
832
864
  ctr += 1
@@ -839,7 +871,7 @@ class MainTable(tk.Canvas):
839
871
  )
840
872
  self.deselect("all", redraw=False)
841
873
  if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
842
- self.undo_stack.append(ev_stack_dict(event_data))
874
+ self.undo_stack.append(pickled_event_dict(event_data))
843
875
  self.create_selection_box(
844
876
  selected_r,
845
877
  selected_c,
@@ -861,8 +893,9 @@ class MainTable(tk.Canvas):
861
893
  if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
862
894
  try_binding(self.extra_end_ctrl_v_func, event_data, "end_ctrl_v")
863
895
  self.sheet_modified(event_data)
896
+ return event_data
864
897
 
865
- def delete_key(self, event: object = None) -> None:
898
+ def delete_key(self, event: object = None, validation: bool = True) -> None | EventDataDict:
866
899
  if not self.selected:
867
900
  return
868
901
  event_data = event_dict(
@@ -879,9 +912,13 @@ class MainTable(tk.Canvas):
879
912
  for c in range(c1, c2):
880
913
  datarn, datacn = self.datarn(r), self.datacn(c)
881
914
  val = self.get_value_for_empty_cell(datarn, datacn)
882
- if not self.edit_validation_func or (
883
- self.edit_validation_func
884
- and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
915
+ if (
916
+ not self.edit_validation_func
917
+ or not validation
918
+ or (
919
+ self.edit_validation_func
920
+ and (val := self.edit_validation_func(mod_event_val(event_data, val, (r, c)))) is not None
921
+ )
885
922
  ):
886
923
  event_data = self.event_data_set_cell(
887
924
  datarn,
@@ -890,10 +927,11 @@ class MainTable(tk.Canvas):
890
927
  event_data,
891
928
  )
892
929
  if event_data["cells"]["table"]:
893
- self.undo_stack.append(ev_stack_dict(event_data))
930
+ self.undo_stack.append(pickled_event_dict(event_data))
894
931
  try_binding(self.extra_end_delete_key_func, event_data, "end_delete")
895
932
  self.refresh()
896
933
  self.sheet_modified(event_data)
934
+ return event_data
897
935
 
898
936
  def event_data_set_cell(self, datarn: int, datacn: int, value: object, event_data: dict) -> EventDataDict:
899
937
  if self.input_valid_for_cell(datarn, datacn, value):
@@ -1370,39 +1408,36 @@ class MainTable(tk.Canvas):
1370
1408
  # all the way from 0 to max_idx
1371
1409
  if old_idxs is None:
1372
1410
  old_idxs = dict(zip(new_idxs.values(), new_idxs))
1373
- seq = tuple(range(max_idx + 1))
1374
1411
  return dict(
1375
1412
  zip(
1376
- move_elements_by_mapping(seq, new_idxs, old_idxs),
1377
- seq,
1413
+ move_elements_by_mapping(tuple(range(max_idx + 1)), new_idxs, old_idxs),
1414
+ range(max_idx + 1),
1378
1415
  )
1379
1416
  )
1380
1417
 
1381
- def undo(self, event: object = None) -> None:
1418
+ def undo(self, event: object = None) -> None | EventDataDict:
1382
1419
  if not self.undo_stack:
1383
1420
  return
1384
- if isinstance(self.undo_stack[-1]["data"], dict):
1385
- modification = self.undo_stack[-1]["data"]
1386
- else:
1387
- modification = decompress_load(self.undo_stack[-1]["data"])
1421
+ modification = decompress_load(self.undo_stack[-1]["data"])
1388
1422
  if not try_binding(self.extra_begin_ctrl_z_func, modification, "begin_undo"):
1389
1423
  return
1390
- self.redo_stack.append(self.undo_modification_invert_event(modification))
1424
+ event_data = self.undo_modification_invert_event(modification)
1425
+ self.redo_stack.append(pickled_event_dict(event_data))
1391
1426
  self.undo_stack.pop()
1392
- try_binding(self.extra_end_ctrl_z_func, modification, "end_undo")
1427
+ try_binding(self.extra_end_ctrl_z_func, event_data, "end_undo")
1428
+ return event_data
1393
1429
 
1394
- def redo(self, event: object = None) -> None:
1430
+ def redo(self, event: object = None) -> None | EventDataDict:
1395
1431
  if not self.redo_stack:
1396
1432
  return
1397
- if isinstance(self.redo_stack[-1]["data"], dict):
1398
- modification = self.redo_stack[-1]["data"]
1399
- else:
1400
- modification = decompress_load(self.redo_stack[-1]["data"])
1433
+ modification = decompress_load(self.redo_stack[-1]["data"])
1401
1434
  if not try_binding(self.extra_begin_ctrl_z_func, modification, "begin_redo"):
1402
1435
  return
1403
- self.undo_stack.append(self.undo_modification_invert_event(modification, name="redo"))
1436
+ event_data = self.undo_modification_invert_event(modification, name="redo")
1437
+ self.undo_stack.append(pickled_event_dict(event_data))
1404
1438
  self.redo_stack.pop()
1405
- try_binding(self.extra_end_ctrl_z_func, modification, "end_redo")
1439
+ try_binding(self.extra_end_ctrl_z_func, event_data, "end_redo")
1440
+ return event_data
1406
1441
 
1407
1442
  def sheet_modified(self, event_data: EventDataDict, purge_redo: bool = True) -> None:
1408
1443
  self.PAR.emit_event("<<SheetModified>>", event_data)
@@ -1450,7 +1485,7 @@ class MainTable(tk.Canvas):
1450
1485
  k: mod_span_widget(unpickle_obj(v), self.PAR) for k, v in modification["named_spans"].items()
1451
1486
  }
1452
1487
 
1453
- def undo_modification_invert_event(self, modification: EventDataDict, name: str = "undo") -> bytes | EventDataDict:
1488
+ def undo_modification_invert_event(self, modification: EventDataDict, name: str = "undo") -> EventDataDict:
1454
1489
  self.deselect("all", redraw=False)
1455
1490
  event_data = event_dict(
1456
1491
  name=modification["eventname"],
@@ -1615,7 +1650,7 @@ class MainTable(tk.Canvas):
1615
1650
 
1616
1651
  self.sheet_modified(event_data, purge_redo=False)
1617
1652
  self.refresh()
1618
- return ev_stack_dict(event_data)
1653
+ return event_data
1619
1654
 
1620
1655
  def see(
1621
1656
  self,
@@ -2733,9 +2768,10 @@ class MainTable(tk.Canvas):
2733
2768
  popup_menu = self.rc_popup_menu
2734
2769
  else:
2735
2770
  self.deselect("all")
2736
- popup_menu = self.empty_rc_popup_menu
2771
+ if self.rc_popup_menus_enabled:
2772
+ popup_menu = self.empty_rc_popup_menu
2737
2773
  try_binding(self.extra_rc_func, event)
2738
- if popup_menu is not None:
2774
+ if popup_menu:
2739
2775
  popup_menu.tk_popup(event.x_root, event.y_root)
2740
2776
 
2741
2777
  def b1_press(self, event=None):
@@ -3715,6 +3751,22 @@ class MainTable(tk.Canvas):
3715
3751
  del self.row_positions[idx]
3716
3752
  self.row_positions[idx:] = [e - w for e in islice(self.row_positions, idx, len(self.row_positions))]
3717
3753
 
3754
+ def del_col_positions(self, idxs: Iterator[int] | None = None):
3755
+ if idxs is None:
3756
+ del self.col_positions[-1]
3757
+ else:
3758
+ if not isinstance(idxs, set):
3759
+ idxs = set(idxs)
3760
+ self.set_col_positions(itr=(w for i, w in enumerate(self.gen_column_widths()) if i not in idxs))
3761
+
3762
+ def del_row_positions(self, idxs: Iterator[int] | None = None):
3763
+ if idxs is None:
3764
+ del self.row_positions[-1]
3765
+ else:
3766
+ if not isinstance(idxs, set):
3767
+ idxs = set(idxs)
3768
+ self.set_row_positions(itr=(h for i, h in enumerate(self.gen_row_heights()) if i not in idxs))
3769
+
3718
3770
  def get_column_widths(self) -> list[int]:
3719
3771
  return diff_list(self.col_positions)
3720
3772
 
@@ -3727,26 +3779,6 @@ class MainTable(tk.Canvas):
3727
3779
  def gen_row_heights(self) -> Generator[int]:
3728
3780
  return diff_gen(self.row_positions)
3729
3781
 
3730
- def del_col_positions(self, idx: int, num: int = 1, deselect_all: bool = False):
3731
- if deselect_all:
3732
- self.deselect("all", redraw=False)
3733
- if idx == "end" or len(self.col_positions) <= idx + 1:
3734
- del self.col_positions[-1]
3735
- else:
3736
- cws = self.get_column_widths()
3737
- cws[idx : idx + num] = []
3738
- self.set_col_positions(itr=cws)
3739
-
3740
- def del_row_positions(self, idx: int, numrows: int = 1, deselect_all: bool = False):
3741
- if deselect_all:
3742
- self.deselect("all", redraw=False)
3743
- if idx == "end" or len(self.row_positions) <= idx + 1:
3744
- del self.row_positions[-1]
3745
- else:
3746
- rhs = self.get_row_heights()
3747
- rhs[idx : idx + numrows] = []
3748
- self.set_row_positions(itr=rhs)
3749
-
3750
3782
  def insert_col_position(
3751
3783
  self,
3752
3784
  idx: Literal["end"] | int = "end",
@@ -4301,7 +4333,7 @@ class MainTable(tk.Canvas):
4301
4333
  event_data=event_data,
4302
4334
  )
4303
4335
  if self.undo_enabled:
4304
- self.undo_stack.append(ev_stack_dict(event_data))
4336
+ self.undo_stack.append(pickled_event_dict(event_data))
4305
4337
  self.refresh()
4306
4338
  try_binding(self.extra_end_insert_cols_rc_func, event_data, "end_add_columns")
4307
4339
  self.sheet_modified(event_data)
@@ -4432,7 +4464,7 @@ class MainTable(tk.Canvas):
4432
4464
  event_data=event_data,
4433
4465
  )
4434
4466
  if self.undo_enabled:
4435
- self.undo_stack.append(ev_stack_dict(event_data))
4467
+ self.undo_stack.append(pickled_event_dict(event_data))
4436
4468
  self.refresh()
4437
4469
  try_binding(self.extra_end_insert_rows_rc_func, event_data, "end_add_rows")
4438
4470
  self.sheet_modified(event_data)
@@ -4604,7 +4636,7 @@ class MainTable(tk.Canvas):
4604
4636
  data_cols = selected if self.all_columns_displayed else [self.displayed_columns[c] for c in selected]
4605
4637
  event_data = self.delete_columns_data(data_cols, event_data)
4606
4638
  if self.undo_enabled:
4607
- self.undo_stack.append(ev_stack_dict(event_data))
4639
+ self.undo_stack.append(pickled_event_dict(event_data))
4608
4640
  self.deselect("all")
4609
4641
  try_binding(self.extra_end_del_cols_rc_func, event_data, "end_delete_columns")
4610
4642
  self.sheet_modified(event_data)
@@ -4658,7 +4690,7 @@ class MainTable(tk.Canvas):
4658
4690
  data_rows = selected if self.all_rows_displayed else [self.displayed_rows[r] for r in selected]
4659
4691
  event_data = self.delete_rows_data(data_rows, event_data)
4660
4692
  if self.undo_enabled:
4661
- self.undo_stack.append(ev_stack_dict(event_data))
4693
+ self.undo_stack.append(pickled_event_dict(event_data))
4662
4694
  self.deselect("all")
4663
4695
  try_binding(self.extra_end_del_rows_rc_func, event_data, "end_delete_rows")
4664
4696
  self.sheet_modified(event_data)
@@ -6970,7 +7002,7 @@ class MainTable(tk.Canvas):
6970
7002
  )
6971
7003
  if not check_input_valid or self.input_valid_for_cell(datarn, datacn, value):
6972
7004
  if self.undo_enabled and undo:
6973
- self.undo_stack.append(ev_stack_dict(event_data))
7005
+ self.undo_stack.append(pickled_event_dict(event_data))
6974
7006
  self.set_cell_data(datarn, datacn, value)
6975
7007
  if cell_resize and self.PAR.ops.cell_auto_resize_enabled:
6976
7008
  self.set_cell_size_to_text(r, c, only_set_if_too_small=True, redraw=redraw, run_binding=True)
tksheet/row_index.py CHANGED
@@ -29,11 +29,11 @@ from .formatters import (
29
29
  )
30
30
  from .functions import (
31
31
  consecutive_chunks,
32
- ev_stack_dict,
33
32
  event_dict,
34
33
  get_n2a,
35
34
  is_contiguous,
36
35
  num2alpha,
36
+ pickled_event_dict,
37
37
  rounded_box_coords,
38
38
  try_binding,
39
39
  )
@@ -851,7 +851,7 @@ class RowIndex(tk.Canvas):
851
851
  "displayed": disp_new_idxs,
852
852
  }
853
853
  if self.MT.undo_enabled:
854
- self.MT.undo_stack.append(ev_stack_dict(event_data))
854
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
855
855
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
856
856
  try_binding(self.ri_extra_end_drag_drop_func, event_data, "end_move_rows")
857
857
  self.MT.sheet_modified(event_data)
@@ -2189,7 +2189,7 @@ class RowIndex(tk.Canvas):
2189
2189
  self.fix_index(datarn)
2190
2190
  if not check_input_valid or self.input_valid_for_cell(datarn, value):
2191
2191
  if self.MT.undo_enabled and undo:
2192
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2192
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2193
2193
  self.set_cell_data(datarn=datarn, value=value)
2194
2194
  edited = True
2195
2195
  if edited and cell_resize and self.PAR.ops.cell_auto_resize_enabled:
tksheet/sheet.py CHANGED
@@ -19,7 +19,6 @@ from .functions import (
19
19
  del_named_span_options,
20
20
  del_named_span_options_nested,
21
21
  dropdown_search_function,
22
- ev_stack_dict,
23
22
  event_dict,
24
23
  fix_format_kwargs,
25
24
  get_checkbox_dict,
@@ -30,6 +29,7 @@ from .functions import (
30
29
  is_iterable,
31
30
  key_to_span,
32
31
  num2alpha,
32
+ pickled_event_dict,
33
33
  pop_positions,
34
34
  set_align,
35
35
  set_readonly,
@@ -1050,29 +1050,23 @@ class Sheet(tk.Frame):
1050
1050
  canvas.basic_bindings(enable)
1051
1051
  return self
1052
1052
 
1053
- def cut(self, event: object = None) -> Sheet:
1054
- self.MT.ctrl_x(event)
1055
- return self
1053
+ def cut(self, event: object = None, validation: bool = True) -> None | EventDataDict:
1054
+ return self.MT.ctrl_x(event, validation)
1056
1055
 
1057
- def copy(self, event: object = None) -> Sheet:
1058
- self.MT.ctrl_c(event)
1059
- return self
1056
+ def copy(self, event: object = None) -> None | EventDataDict:
1057
+ return self.MT.ctrl_c(event)
1060
1058
 
1061
- def paste(self, event: object = None) -> Sheet:
1062
- self.MT.ctrl_v(event)
1063
- return self
1059
+ def paste(self, event: object = None, validation: bool = True) -> None | EventDataDict:
1060
+ return self.MT.ctrl_v(event, validation)
1064
1061
 
1065
- def delete(self, event: object = None) -> Sheet:
1066
- self.MT.delete_key(event)
1067
- return self
1062
+ def delete(self, event: object = None, validation: bool = True) -> None | EventDataDict:
1063
+ return self.MT.delete_key(event, validation)
1068
1064
 
1069
- def undo(self, event: object = None) -> Sheet:
1070
- self.MT.undo(event)
1071
- return self
1065
+ def undo(self, event: object = None) -> None | EventDataDict:
1066
+ return self.MT.undo(event)
1072
1067
 
1073
- def redo(self, event: object = None) -> Sheet:
1074
- self.MT.redo(event)
1075
- return self
1068
+ def redo(self, event: object = None) -> None | EventDataDict:
1069
+ return self.MT.redo(event)
1076
1070
 
1077
1071
  def has_focus(
1078
1072
  self,
@@ -1801,7 +1795,7 @@ class Sheet(tk.Frame):
1801
1795
  or event_data["added"]["rows"]
1802
1796
  ):
1803
1797
  if undo is True or (undo is None and span.undo):
1804
- self.MT.undo_stack.append(ev_stack_dict(event_data))
1798
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
1805
1799
  if emit_event is True or (emit_event is None and span.emit_event):
1806
1800
  self.emit_event("<<SheetModified>>", event_data)
1807
1801
  self.set_refresh_timer(redraw)
@@ -1840,7 +1834,7 @@ class Sheet(tk.Frame):
1840
1834
  event_data = clear_t(r, c, quick_tval(r, c), event_data)
1841
1835
  if event_data["cells"]["table"] or event_data["cells"]["header"] or event_data["cells"]["index"]:
1842
1836
  if undo is True or (undo is None and span.undo):
1843
- self.MT.undo_stack.append(ev_stack_dict(event_data))
1837
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
1844
1838
  if emit_event is True or (emit_event is None and span.emit_event):
1845
1839
  self.emit_event("<<SheetModified>>", event_data)
1846
1840
  self.set_refresh_timer(redraw)
@@ -2009,7 +2003,7 @@ class Sheet(tk.Frame):
2009
2003
  push_ops=push_ops,
2010
2004
  )
2011
2005
  if undo:
2012
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2006
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2013
2007
  if emit_event:
2014
2008
  self.emit_event("<<SheetModified>>", event_data)
2015
2009
  self.set_refresh_timer(redraw)
@@ -2104,7 +2098,7 @@ class Sheet(tk.Frame):
2104
2098
  push_ops=push_ops,
2105
2099
  )
2106
2100
  if undo:
2107
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2101
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2108
2102
  if emit_event:
2109
2103
  self.emit_event("<<SheetModified>>", event_data)
2110
2104
  self.set_refresh_timer(redraw)
@@ -2178,7 +2172,7 @@ class Sheet(tk.Frame):
2178
2172
  event_data,
2179
2173
  )
2180
2174
  if undo:
2181
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2175
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2182
2176
  if emit_event:
2183
2177
  self.emit_event("<<SheetModified>>", event_data)
2184
2178
  self.MT.deselect("all", redraw=False)
@@ -2219,7 +2213,7 @@ class Sheet(tk.Frame):
2219
2213
  event_data,
2220
2214
  )
2221
2215
  if undo:
2222
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2216
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2223
2217
  if emit_event:
2224
2218
  self.emit_event("<<SheetModified>>", event_data)
2225
2219
  self.MT.deselect("all", redraw=False)
@@ -2320,7 +2314,7 @@ class Sheet(tk.Frame):
2320
2314
  data_indexes=data_indexes,
2321
2315
  )
2322
2316
  if undo:
2323
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2317
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2324
2318
  if emit_event:
2325
2319
  self.emit_event("<<SheetModified>>", event_data)
2326
2320
  self.set_refresh_timer(redraw)
@@ -2348,7 +2342,7 @@ class Sheet(tk.Frame):
2348
2342
  data_indexes=data_indexes,
2349
2343
  )
2350
2344
  if undo:
2351
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2345
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2352
2346
  if emit_event:
2353
2347
  self.emit_event("<<SheetModified>>", event_data)
2354
2348
  self.set_refresh_timer(redraw)
@@ -2375,7 +2369,7 @@ class Sheet(tk.Frame):
2375
2369
  data_indexes=data_indexes,
2376
2370
  )
2377
2371
  if undo:
2378
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2372
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2379
2373
  if emit_event:
2380
2374
  self.emit_event("<<SheetModified>>", event_data)
2381
2375
  self.set_refresh_timer(redraw)
@@ -2402,7 +2396,7 @@ class Sheet(tk.Frame):
2402
2396
  data_indexes=data_indexes,
2403
2397
  )
2404
2398
  if undo:
2405
- self.MT.undo_stack.append(ev_stack_dict(event_data))
2399
+ self.MT.undo_stack.append(pickled_event_dict(event_data))
2406
2400
  if emit_event:
2407
2401
  self.emit_event("<<SheetModified>>", event_data)
2408
2402
  self.set_refresh_timer(redraw)
@@ -3446,12 +3440,22 @@ class Sheet(tk.Frame):
3446
3440
 
3447
3441
  delete_row_position = del_row_position
3448
3442
 
3443
+ def del_row_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
3444
+ self.MT.del_row_positions(idxs=idxs)
3445
+ self.set_refresh_timer()
3446
+ return self
3447
+
3449
3448
  def del_column_position(self, idx: int, deselect_all: bool = False) -> Sheet:
3450
3449
  self.MT.del_col_position(idx, deselect_all=deselect_all)
3451
3450
  return self
3452
3451
 
3453
3452
  delete_column_position = del_column_position
3454
3453
 
3454
+ def del_column_positions(self, idxs: Iterator[int] | None = None) -> Sheet:
3455
+ self.MT.del_col_positions(idxs=idxs)
3456
+ self.set_refresh_timer()
3457
+ return self
3458
+
3455
3459
  def insert_column_position(
3456
3460
  self,
3457
3461
  idx: Literal["end"] | int = "end",
@@ -4253,27 +4257,27 @@ class Sheet(tk.Frame):
4253
4257
  target = self.CH.cell_options
4254
4258
  if key is None:
4255
4259
  return target
4256
- return {k: v for k, v in target.items() if key in v}
4260
+ return {k: v[key] for k, v in target.items() if key in v}
4257
4261
 
4258
4262
  def get_row_options(self, key: None | str = None) -> dict:
4259
4263
  if key is None:
4260
4264
  return self.MT.row_options
4261
- return {k: v for k, v in self.MT.row_options.items() if key in v}
4265
+ return {k: v[key] for k, v in self.MT.row_options.items() if key in v}
4262
4266
 
4263
4267
  def get_column_options(self, key: None | str = None) -> dict:
4264
4268
  if key is None:
4265
4269
  return self.MT.col_options
4266
- return {k: v for k, v in self.MT.col_options.items() if key in v}
4270
+ return {k: v[key] for k, v in self.MT.col_options.items() if key in v}
4267
4271
 
4268
4272
  def get_index_options(self, key: None | str = None) -> dict:
4269
4273
  if key is None:
4270
4274
  return self.RI.cell_options
4271
- return {k: v for k, v in self.RI.cell_options.items() if key in v}
4275
+ return {k: v[key] for k, v in self.RI.cell_options.items() if key in v}
4272
4276
 
4273
4277
  def get_header_options(self, key: None | str = None) -> dict:
4274
4278
  if key is None:
4275
4279
  return self.CH.cell_options
4276
- return {k: v for k, v in self.CH.cell_options.items() if key in v}
4280
+ return {k: v[key] for k, v in self.CH.cell_options.items() if key in v}
4277
4281
 
4278
4282
  def del_out_of_bounds_options(self) -> Sheet:
4279
4283
  maxc = self.total_columns()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.12
3
+ Version: 7.1.20
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
@@ -42,7 +42,7 @@ License-File: LICENSE.txt
42
42
 
43
43
  # tksheet
44
44
 
45
- [![PyPI version shields.io](https://img.shields.io/pypi/v/tksheet.svg)](https://pypi.python.org/pypi/tksheet/) ![python](https://img.shields.io/badge/python-3.8+-blue) [![License: MIT](https://img.shields.io/badge/License-MIT%20-blue.svg)](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
45
+ [![PyPI version shields.io](https://img.shields.io/pypi/v/tksheet.svg)](https://pypi.python.org/pypi/tksheet/) ![python](https://img.shields.io/badge/python-3.8|3.9|3.10|3.11|3.12-blue) [![License: MIT](https://img.shields.io/badge/License-MIT%20-blue.svg)](https://github.com/ragardner/tksheet/blob/master/LICENSE.txt)
46
46
 
47
47
  [![GitHub Release Date](https://img.shields.io/github/release-date-pre/ragardner/tksheet.svg)](https://github.com/ragardner/tksheet/releases) [![Downloads](https://img.shields.io/pypi/dm/tksheet.svg)](https://pypi.org/project/tksheet/)
48
48
 
@@ -0,0 +1,20 @@
1
+ tksheet/__init__.py,sha256=n15iE0L6zsiYW5IhLE5m3yb867QM9gl2SBrdQk_bjLc,2044
2
+ tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
+ tksheet/column_headers.py,sha256=Kzu_nIMt3oFZO6F00iHBmjv5L0STsVN7Gc34wzwKDJ4,100785
4
+ tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
+ tksheet/functions.py,sha256=Vm_tCPCaos8C_or_70OGpSrXKmFnE8OxODchfrUJBMM,40281
6
+ tksheet/main_table.py,sha256=DrRC3WLGiS6JkAS4Ir-8c1n_4C4l4Coe6jb45Uceekc,320235
7
+ tksheet/other_classes.py,sha256=P3FYUYreLhstATvHCNow8sDQoCsD_02KB6oXcca3ahE,13628
8
+ tksheet/row_index.py,sha256=57cWphhUGsghh9UiHtAHi0m9S403-9MrYiMtTzK7h8E,106014
9
+ tksheet/sheet.py,sha256=TLWV_C-C3XiweHbPdskCnT9v6Zr6Dxym2Ijv-CULgWs,260302
10
+ tksheet/sheet_options.py,sha256=mh0rTvWrFvIKaiv88jtMZy0TSA8zTS1GXSe88u8_rzk,11978
11
+ tksheet/text_editor.py,sha256=81_IZKrTVa2KIx2cJ4n3cFvFMAwvbHIQYgqtyat-97I,6681
12
+ tksheet/themes.py,sha256=0XY97zB9e26edyxMWutofNarNon8Pp5lpprHYeL_4b0,13490
13
+ tksheet/top_left_rectangle.py,sha256=-2u9GfOvcqhkKwHEtbqdFvXCY3RbvL5k2Sh9l3r_k04,8275
14
+ tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
15
+ tksheet/vars.py,sha256=Nb0mhxJt-SXipi3cE9J9Ea1H1iPqC8PRvUR9CqqMlVA,3062
16
+ tksheet-7.1.20.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
+ tksheet-7.1.20.dist-info/METADATA,sha256=C_WIADFKe41LVlFXKzK7QFO6vQIi0ym2Uk40WiNx9zM,6032
18
+ tksheet-7.1.20.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
+ tksheet-7.1.20.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
+ tksheet-7.1.20.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- tksheet/__init__.py,sha256=NUxHKOZFQzf4A8eiKohXLDQe-9iyK2d4ZDzkDr4_GQk,2014
2
- tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
- tksheet/column_headers.py,sha256=eZKZGZEstg5HeCtvdVYmu5nqoY0bdxrwYScQvZz5xEQ,100496
4
- tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
- tksheet/functions.py,sha256=1aI9sN-O0DOFITj0bOORzI9XQteThciCXhTr8GPHgkw,39616
6
- tksheet/main_table.py,sha256=z9Q8BjFqoGW88Cm1av7nR8fkYw-HxnOMVlBqgY3R1gU,318838
7
- tksheet/other_classes.py,sha256=P3FYUYreLhstATvHCNow8sDQoCsD_02KB6oXcca3ahE,13628
8
- tksheet/row_index.py,sha256=ytD1A6dmzzrM9EYm-IIJ0_xo-2XVfecKgYBG_Hxm_m8,105999
9
- tksheet/sheet.py,sha256=rc4BuXw9JxV3_Ja-fdBDEkE_1P6jNl8jhPs8MoGuw6E,259740
10
- tksheet/sheet_options.py,sha256=mh0rTvWrFvIKaiv88jtMZy0TSA8zTS1GXSe88u8_rzk,11978
11
- tksheet/text_editor.py,sha256=81_IZKrTVa2KIx2cJ4n3cFvFMAwvbHIQYgqtyat-97I,6681
12
- tksheet/themes.py,sha256=0XY97zB9e26edyxMWutofNarNon8Pp5lpprHYeL_4b0,13490
13
- tksheet/top_left_rectangle.py,sha256=-2u9GfOvcqhkKwHEtbqdFvXCY3RbvL5k2Sh9l3r_k04,8275
14
- tksheet/types.py,sha256=IgoEHMbceKpakcZtanxKaKJ4RdCq7UW6EoEIIz5O59k,340
15
- tksheet/vars.py,sha256=Nb0mhxJt-SXipi3cE9J9Ea1H1iPqC8PRvUR9CqqMlVA,3062
16
- tksheet-7.1.12.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
- tksheet-7.1.12.dist-info/METADATA,sha256=fWMZLYa3BI5udpVfd5vuyt-S7i17enOimu6FNwkKOlc,6014
18
- tksheet-7.1.12.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
- tksheet-7.1.12.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
- tksheet-7.1.12.dist-info/RECORD,,