tksheet 7.1.9__py3-none-any.whl → 7.1.11__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.9"
7
+ __version__ = "7.1.11"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
@@ -49,6 +49,7 @@ from .functions import (
49
49
  get_n2a,
50
50
  get_new_indexes,
51
51
  get_seq_without_gaps_at_index,
52
+ insert_items,
52
53
  is_iterable,
53
54
  move_elements_by_mapping,
54
55
  move_elements_to,
tksheet/column_headers.py CHANGED
@@ -4,6 +4,7 @@ import tkinter as tk
4
4
  from collections import defaultdict
5
5
  from collections.abc import (
6
6
  Callable,
7
+ Sequence,
7
8
  )
8
9
  from functools import (
9
10
  partial,
@@ -673,11 +674,11 @@ class ColumnHeaders(tk.Canvas):
673
674
 
674
675
  def show_drag_and_drop_indicators(
675
676
  self,
676
- xpos,
677
- y1,
678
- y2,
679
- cols,
680
- ):
677
+ xpos: float,
678
+ y1: float,
679
+ y2: float,
680
+ cols: Sequence[int],
681
+ ) -> None:
681
682
  self.hide_resize_and_ctrl_lines()
682
683
  self.create_resize_line(
683
684
  xpos,
@@ -698,13 +699,13 @@ class ColumnHeaders(tk.Canvas):
698
699
  delete_on_timer=False,
699
700
  )
700
701
 
701
- def hide_resize_and_ctrl_lines(self, ctrl_lines=True):
702
+ def hide_resize_and_ctrl_lines(self, ctrl_lines: bool = True) -> None:
702
703
  self.delete_resize_lines()
703
704
  self.MT.delete_resize_lines()
704
705
  if ctrl_lines:
705
706
  self.MT.delete_ctrl_outlines()
706
707
 
707
- def scroll_if_event_offscreen(self, event: object):
708
+ def scroll_if_event_offscreen(self, event: object) -> bool:
708
709
  xcheck = self.xview()
709
710
  need_redraw = False
710
711
  if event.x > self.winfo_width() and len(xcheck) > 1 and xcheck[1] < 1:
@@ -727,14 +728,14 @@ class ColumnHeaders(tk.Canvas):
727
728
  need_redraw = True
728
729
  return need_redraw
729
730
 
730
- def fix_xview(self):
731
+ def fix_xview(self) -> None:
731
732
  xcheck = self.xview()
732
733
  if xcheck and xcheck[0] < 0:
733
734
  self.MT.set_xviews("moveto", 0)
734
735
  elif len(xcheck) > 1 and xcheck[1] > 1:
735
736
  self.MT.set_xviews("moveto", 1)
736
737
 
737
- def event_over_dropdown(self, c, datacn, event: object, canvasx):
738
+ def event_over_dropdown(self, c: int, datacn: int, event: object, canvasx: float) -> bool:
738
739
  if (
739
740
  event.y < self.MT.header_txt_height + 5
740
741
  and self.get_cell_kwargs(datacn, key="dropdown")
@@ -744,7 +745,7 @@ class ColumnHeaders(tk.Canvas):
744
745
  return True
745
746
  return False
746
747
 
747
- def event_over_checkbox(self, c, datacn, event: object, canvasx):
748
+ def event_over_checkbox(self, c: int, datacn: int, event: object, canvasx: float) -> bool:
748
749
  if (
749
750
  event.y < self.MT.header_txt_height + 5
750
751
  and self.get_cell_kwargs(datacn, key="checkbox")
@@ -753,7 +754,7 @@ class ColumnHeaders(tk.Canvas):
753
754
  return True
754
755
  return False
755
756
 
756
- def b1_release(self, event: object):
757
+ def b1_release(self, event: object) -> None:
757
758
  if self.being_drawn_item is not None:
758
759
  to_sel = self.MT.coords_and_type(self.being_drawn_item)
759
760
  r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
@@ -909,8 +910,7 @@ class ColumnHeaders(tk.Canvas):
909
910
 
910
911
  def select_col(self, c, redraw=False, run_binding_func=True):
911
912
  self.MT.deselect("all", redraw=False)
912
- box = (0, c, len(self.MT.row_positions) - 1, c + 1, "columns")
913
- fill_iid = self.MT.create_selection_box(*box)
913
+ fill_iid = self.MT.create_selection_box(0, c, len(self.MT.row_positions) - 1, c + 1, "columns")
914
914
  if redraw:
915
915
  self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
916
916
  if run_binding_func:
@@ -1320,6 +1320,16 @@ class ColumnHeaders(tk.Canvas):
1320
1320
  t = self.create_polygon(points, fill=fill, outline=outline, tag=tag, smooth=True)
1321
1321
  self.disp_checkbox[t] = True
1322
1322
 
1323
+ def configure_scrollregion(self, last_col_line_pos: float) -> None:
1324
+ self.configure(
1325
+ scrollregion=(
1326
+ 0,
1327
+ 0,
1328
+ last_col_line_pos + self.PAR.ops.empty_horizontal + 2,
1329
+ self.current_height,
1330
+ )
1331
+ )
1332
+
1323
1333
  def redraw_grid_and_text(
1324
1334
  self,
1325
1335
  last_col_line_pos,
@@ -1331,14 +1341,7 @@ class ColumnHeaders(tk.Canvas):
1331
1341
  col_pos_exists,
1332
1342
  ):
1333
1343
  try:
1334
- self.configure(
1335
- scrollregion=(
1336
- 0,
1337
- 0,
1338
- last_col_line_pos + self.PAR.ops.empty_horizontal + 2,
1339
- self.current_height,
1340
- )
1341
- )
1344
+ self.configure_scrollregion(last_col_line_pos=last_col_line_pos)
1342
1345
  except Exception:
1343
1346
  return
1344
1347
  self.hidd_text.update(self.disp_text)
tksheet/main_table.py CHANGED
@@ -551,7 +551,10 @@ class MainTable(tk.Canvas):
551
551
  for r1, c1, r2, c2 in boxes:
552
552
  self.show_ctrl_outline(canvas="table", start_cell=(c1, r1), end_cell=(c2, r2))
553
553
  self.clipboard_clear()
554
- self.clipboard_append(s.getvalue())
554
+ if len(event_data["cells"]["table"]) == 1:
555
+ self.clipboard_append(next(iter(event_data["cells"]["table"].values())))
556
+ else:
557
+ self.clipboard_append(s.getvalue())
555
558
  self.update_idletasks()
556
559
  try_binding(self.extra_end_ctrl_c_func, event_data, "end_ctrl_c")
557
560
 
@@ -615,7 +618,10 @@ class MainTable(tk.Canvas):
615
618
  if event_data["cells"]["table"]:
616
619
  self.undo_stack.append(ev_stack_dict(event_data))
617
620
  self.clipboard_clear()
618
- self.clipboard_append(s.getvalue())
621
+ if len(event_data["cells"]["table"]) == 1:
622
+ self.clipboard_append(next(iter(event_data["cells"]["table"].values())))
623
+ else:
624
+ self.clipboard_append(s.getvalue())
619
625
  self.update_idletasks()
620
626
  self.refresh()
621
627
  for r1, c1, r2, c2 in boxes:
@@ -657,9 +663,11 @@ class MainTable(tk.Canvas):
657
663
  dialect = csv.Sniffer().sniff(data, delimiters=self.PAR.ops.from_clipboard_delimiters)
658
664
  except Exception:
659
665
  dialect = csv.excel_tab
660
- data = list(csv.reader(io.StringIO(data), dialect=dialect, skipinitialspace=True))
661
- if not data:
662
- return
666
+ if dialect.delimiter in data:
667
+ if not (data := list(csv.reader(io.StringIO(data), dialect=dialect, skipinitialspace=True))):
668
+ return
669
+ else:
670
+ data = [[data]]
663
671
  new_data_numcols = max(map(len, data))
664
672
  new_data_numrows = len(data)
665
673
  for rn, r in enumerate(data):
@@ -2203,98 +2211,6 @@ class MainTable(tk.Canvas):
2203
2211
  check_cell_visibility=False,
2204
2212
  )
2205
2213
 
2206
- def key_bindings(self) -> None:
2207
- for widget in (self, self.RI, self.CH, self.TL):
2208
- for binding in self.PAR.ops.copy_bindings:
2209
- if self.copy_enabled:
2210
- widget.bind(binding, self.ctrl_c)
2211
- else:
2212
- widget.unbind(binding)
2213
-
2214
- for binding in self.PAR.ops.cut_bindings:
2215
- if self.cut_enabled:
2216
- widget.bind(binding, self.ctrl_x)
2217
- else:
2218
- widget.unbind(binding)
2219
-
2220
- for binding in self.PAR.ops.paste_bindings:
2221
- if self.paste_enabled:
2222
- widget.bind(binding, self.ctrl_v)
2223
- else:
2224
- widget.unbind(binding)
2225
-
2226
- if self.undo_enabled:
2227
- for binding in self.PAR.ops.undo_bindings:
2228
- widget.bind(binding, self.undo)
2229
- for binding in self.PAR.ops.redo_bindings:
2230
- widget.bind(binding, self.redo)
2231
- else:
2232
- for binding in self.PAR.ops.undo_bindings:
2233
- widget.unbind(binding)
2234
- for binding in self.PAR.ops.redo_bindings:
2235
- widget.unbind(binding)
2236
-
2237
- for binding in self.PAR.ops.delete_bindings:
2238
- if self.delete_key_enabled:
2239
- widget.bind(binding, self.delete_key)
2240
- else:
2241
- widget.unbind(binding)
2242
-
2243
- for binding in self.PAR.ops.select_all_bindings:
2244
- if self.select_all_enabled:
2245
- widget.bind(binding, self.select_all)
2246
- else:
2247
- widget.unbind(binding)
2248
-
2249
- for binding in self.PAR.ops.tab_bindings:
2250
- if self.tab_enabled:
2251
- widget.bind(binding, self.tab_key)
2252
- else:
2253
- widget.unbind(binding)
2254
-
2255
- for binding in self.PAR.ops.up_bindings:
2256
- if self.up_enabled:
2257
- widget.bind(binding, self.arrowkey_UP)
2258
- else:
2259
- widget.unbind(binding)
2260
-
2261
- for binding in self.PAR.ops.right_bindings:
2262
- if self.right_enabled:
2263
- widget.bind(binding, self.arrowkey_RIGHT)
2264
- else:
2265
- widget.unbind(binding)
2266
-
2267
- for binding in self.PAR.ops.down_bindings:
2268
- if self.down_enabled:
2269
- widget.bind(binding, self.arrowkey_DOWN)
2270
- else:
2271
- widget.unbind(binding)
2272
-
2273
- for binding in self.PAR.ops.left_bindings:
2274
- if self.left_enabled:
2275
- widget.bind(binding, self.arrowkey_LEFT)
2276
- else:
2277
- widget.unbind(binding)
2278
-
2279
- for binding in self.PAR.ops.prior_bindings:
2280
- if self.prior_enabled:
2281
- widget.bind(binding, self.page_UP)
2282
- else:
2283
- widget.unbind(binding)
2284
-
2285
- for binding in self.PAR.ops.next_bindings:
2286
- if self.next_enabled:
2287
- widget.bind(binding, self.page_DOWN)
2288
- else:
2289
- widget.unbind(binding)
2290
-
2291
- if self.edit_cell_enabled:
2292
- for w in (self, self.RI, self.CH):
2293
- w.bind("<Key>", self.open_cell)
2294
- else:
2295
- for w in (self, self.RI, self.CH):
2296
- w.unbind("<Key>")
2297
-
2298
2214
  def menu_add_command(self, menu: tk.Menu, **kwargs) -> None:
2299
2215
  if "label" not in kwargs:
2300
2216
  return
@@ -2528,35 +2444,33 @@ class MainTable(tk.Canvas):
2528
2444
 
2529
2445
  def enable_bindings(self, bindings):
2530
2446
  if not bindings:
2531
- self.enable_bindings_internal("all")
2447
+ self._enable_binding("all")
2532
2448
  elif isinstance(bindings, (list, tuple)):
2533
2449
  for binding in bindings:
2534
2450
  if isinstance(binding, (list, tuple)):
2535
2451
  for bind in binding:
2536
- self.enable_bindings_internal(bind.lower())
2452
+ self._enable_binding(bind.lower())
2537
2453
  elif isinstance(binding, str):
2538
- self.enable_bindings_internal(binding.lower())
2454
+ self._enable_binding(binding.lower())
2539
2455
  elif isinstance(bindings, str):
2540
- self.enable_bindings_internal(bindings.lower())
2456
+ self._enable_binding(bindings.lower())
2541
2457
  self.create_rc_menus()
2542
- self.key_bindings()
2543
2458
 
2544
2459
  def disable_bindings(self, bindings):
2545
2460
  if not bindings:
2546
- self.disable_bindings_internal("all")
2461
+ self._disable_binding("all")
2547
2462
  elif isinstance(bindings, (list, tuple)):
2548
2463
  for binding in bindings:
2549
2464
  if isinstance(binding, (list, tuple)):
2550
2465
  for bind in binding:
2551
- self.disable_bindings_internal(bind.lower())
2466
+ self._disable_binding(bind.lower())
2552
2467
  elif isinstance(binding, str):
2553
- self.disable_bindings_internal(binding.lower())
2468
+ self._disable_binding(binding.lower())
2554
2469
  elif isinstance(bindings, str):
2555
- self.disable_bindings_internal(bindings)
2470
+ self._disable_binding(bindings)
2556
2471
  self.create_rc_menus()
2557
- self.key_bindings()
2558
2472
 
2559
- def enable_bindings_internal(self, binding):
2473
+ def _enable_binding(self, binding):
2560
2474
  if binding == "enable_all":
2561
2475
  binding = "all"
2562
2476
  if binding in ("all", "single", "single_selection_mode", "single_select"):
@@ -2567,9 +2481,6 @@ class MainTable(tk.Canvas):
2567
2481
  self.single_selection_enabled = False
2568
2482
  if binding in ("all", "drag_select"):
2569
2483
  self.drag_selection_enabled = True
2570
- if binding in ("all", "select_all"):
2571
- self.select_all_enabled = True
2572
- self.TL.sa_state()
2573
2484
  if binding in ("all", "column_width_resize"):
2574
2485
  self.CH.width_resizing_enabled = True
2575
2486
  if binding in ("all", "column_select"):
@@ -2592,20 +2503,47 @@ class MainTable(tk.Canvas):
2592
2503
  self.RI.row_selection_enabled = True
2593
2504
  if binding in ("all", "row_drag_and_drop", "move_rows"):
2594
2505
  self.RI.drag_and_drop_enabled = True
2506
+ if binding in ("all", "select_all"):
2507
+ self.select_all_enabled = True
2508
+ self.TL.sa_state()
2509
+ self._tksheet_bind("select_all_bindings", self.select_all)
2595
2510
  if binding in ("all", "arrowkeys", "tab"):
2596
2511
  self.tab_enabled = True
2512
+ self._tksheet_bind("tab_bindings", self.tab_key)
2597
2513
  if binding in ("all", "arrowkeys", "up"):
2598
2514
  self.up_enabled = True
2515
+ self._tksheet_bind("up_bindings", self.arrowkey_UP)
2599
2516
  if binding in ("all", "arrowkeys", "right"):
2600
2517
  self.right_enabled = True
2518
+ self._tksheet_bind("right_bindings", self.arrowkey_RIGHT)
2601
2519
  if binding in ("all", "arrowkeys", "down"):
2602
2520
  self.down_enabled = True
2521
+ self._tksheet_bind("down_bindings", self.arrowkey_DOWN)
2603
2522
  if binding in ("all", "arrowkeys", "left"):
2604
2523
  self.left_enabled = True
2524
+ self._tksheet_bind("left_bindings", self.arrowkey_LEFT)
2605
2525
  if binding in ("all", "arrowkeys", "prior"):
2606
2526
  self.prior_enabled = True
2527
+ self._tksheet_bind("prior_bindings", self.page_UP)
2607
2528
  if binding in ("all", "arrowkeys", "next"):
2608
2529
  self.next_enabled = True
2530
+ self._tksheet_bind("next_bindings", self.page_DOWN)
2531
+ if binding in ("all", "copy", "edit_bindings", "edit"):
2532
+ self.copy_enabled = True
2533
+ self._tksheet_bind("copy_bindings", self.ctrl_c)
2534
+ if binding in ("all", "cut", "edit_bindings", "edit"):
2535
+ self.cut_enabled = True
2536
+ self._tksheet_bind("cut_bindings", self.ctrl_x)
2537
+ if binding in ("all", "paste", "edit_bindings", "edit"):
2538
+ self.paste_enabled = True
2539
+ self._tksheet_bind("paste_bindings", self.ctrl_v)
2540
+ if binding in ("all", "delete", "edit_bindings", "edit"):
2541
+ self.delete_key_enabled = True
2542
+ self._tksheet_bind("delete_bindings", self.delete_key)
2543
+ if binding in ("all", "undo", "redo", "edit_bindings", "edit"):
2544
+ self.undo_enabled = True
2545
+ self._tksheet_bind("undo_bindings", self.undo)
2546
+ self._tksheet_bind("redo_bindings", self.redo)
2609
2547
  if binding in ("all", "rc_delete_column"):
2610
2548
  self.rc_delete_column_enabled = True
2611
2549
  self.rc_popup_menus_enabled = True
@@ -2622,23 +2560,15 @@ class MainTable(tk.Canvas):
2622
2560
  self.rc_insert_row_enabled = True
2623
2561
  self.rc_popup_menus_enabled = True
2624
2562
  self.rc_select_enabled = True
2625
- if binding in ("all", "copy", "edit_bindings"):
2626
- self.copy_enabled = True
2627
- if binding in ("all", "cut", "edit_bindings"):
2628
- self.cut_enabled = True
2629
- if binding in ("all", "paste", "edit_bindings"):
2630
- self.paste_enabled = True
2631
- if binding in ("all", "delete", "edit_bindings"):
2632
- self.delete_key_enabled = True
2633
2563
  if binding in ("all", "right_click_popup_menu", "rc_popup_menu"):
2634
2564
  self.rc_popup_menus_enabled = True
2635
2565
  self.rc_select_enabled = True
2636
2566
  if binding in ("all", "right_click_select", "rc_select"):
2637
2567
  self.rc_select_enabled = True
2638
- if binding in ("all", "undo", "edit_bindings"):
2639
- self.undo_enabled = True
2640
- if binding in ("all", "edit_cell", "edit_bindings"):
2568
+ if binding in ("all", "edit_cell", "edit_bindings", "edit"):
2641
2569
  self.edit_cell_enabled = True
2570
+ for w in (self, self.RI, self.CH):
2571
+ w.bind("<Key>", self.open_cell)
2642
2572
  if binding in ("edit_header"):
2643
2573
  self.CH.edit_cell_enabled = True
2644
2574
  if binding in ("edit_index"):
@@ -2647,7 +2577,12 @@ class MainTable(tk.Canvas):
2647
2577
  if binding in ("ctrl_click_select", "ctrl_select"):
2648
2578
  self.ctrl_select_enabled = True
2649
2579
 
2650
- def disable_bindings_internal(self, binding):
2580
+ def _tksheet_bind(self, bindings_key: str, func: Callable) -> None:
2581
+ for widget in (self, self.RI, self.CH, self.TL):
2582
+ for binding in self.PAR.ops[bindings_key]:
2583
+ widget.bind(binding, func)
2584
+
2585
+ def _disable_binding(self, binding):
2651
2586
  if binding == "disable_all":
2652
2587
  binding = "all"
2653
2588
  if binding in ("all", "single", "single_selection_mode", "single_select"):
@@ -2658,9 +2593,6 @@ class MainTable(tk.Canvas):
2658
2593
  self.single_selection_enabled = False
2659
2594
  if binding in ("all", "drag_select"):
2660
2595
  self.drag_selection_enabled = False
2661
- if binding in ("all", "select_all"):
2662
- self.select_all_enabled = False
2663
- self.TL.sa_state("hidden")
2664
2596
  if binding in ("all", "column_width_resize"):
2665
2597
  self.CH.width_resizing_enabled = False
2666
2598
  if binding in ("all", "column_select"):
@@ -2683,20 +2615,6 @@ class MainTable(tk.Canvas):
2683
2615
  self.RI.row_selection_enabled = False
2684
2616
  if binding in ("all", "row_drag_and_drop", "move_rows"):
2685
2617
  self.RI.drag_and_drop_enabled = False
2686
- if binding in ("all", "arrowkeys", "tab"):
2687
- self.tab_enabled = False
2688
- if binding in ("all", "arrowkeys", "up"):
2689
- self.up_enabled = False
2690
- if binding in ("all", "arrowkeys", "right"):
2691
- self.right_enabled = False
2692
- if binding in ("all", "arrowkeys", "down"):
2693
- self.down_enabled = False
2694
- if binding in ("all", "arrowkeys", "left"):
2695
- self.left_enabled = False
2696
- if binding in ("all", "arrowkeys", "prior"):
2697
- self.prior_enabled = False
2698
- if binding in ("all", "arrowkeys", "next"):
2699
- self.next_enabled = False
2700
2618
  if binding in ("all", "rc_delete_column"):
2701
2619
  self.rc_delete_column_enabled = False
2702
2620
  self.rc_popup_menus_enabled = False
@@ -2713,29 +2631,67 @@ class MainTable(tk.Canvas):
2713
2631
  self.rc_insert_row_enabled = False
2714
2632
  self.rc_popup_menus_enabled = False
2715
2633
  self.rc_select_enabled = False
2716
- if binding in ("all", "copy", "edit_bindings"):
2717
- self.copy_enabled = False
2718
- if binding in ("all", "cut", "edit_bindings"):
2719
- self.cut_enabled = False
2720
- if binding in ("all", "paste", "edit_bindings"):
2721
- self.paste_enabled = False
2722
- if binding in ("all", "delete", "edit_bindings"):
2723
- self.delete_key_enabled = False
2724
2634
  if binding in ("all", "right_click_popup_menu", "rc_popup_menu"):
2725
2635
  self.rc_popup_menus_enabled = False
2726
2636
  self.rc_select_enabled = False
2727
2637
  if binding in ("all", "right_click_select", "rc_select"):
2728
2638
  self.rc_select_enabled = False
2729
- if binding in ("all", "undo", "edit_bindings"):
2730
- self.undo_enabled = False
2731
- if binding in ("all", "edit_cell", "edit_bindings"):
2639
+ if binding in ("all", "edit_cell", "edit_bindings", "edit"):
2732
2640
  self.edit_cell_enabled = False
2733
- if binding in ("all", "edit_header", "edit_bindings"):
2641
+ for w in (self, self.RI, self.CH):
2642
+ w.unbind("<Key>")
2643
+ if binding in ("all", "edit_header", "edit_bindings", "edit"):
2734
2644
  self.CH.edit_cell_enabled = False
2735
- if binding in ("all", "edit_index", "edit_bindings"):
2645
+ if binding in ("all", "edit_index", "edit_bindings", "edit"):
2736
2646
  self.RI.edit_cell_enabled = False
2737
2647
  if binding in ("all", "ctrl_click_select", "ctrl_select"):
2738
2648
  self.ctrl_select_enabled = False
2649
+ if binding in ("all", "select_all"):
2650
+ self.select_all_enabled = False
2651
+ self.TL.sa_state("hidden")
2652
+ self._tksheet_unbind("select_all_bindings")
2653
+ if binding in ("all", "copy", "edit_bindings", "edit"):
2654
+ self.copy_enabled = False
2655
+ self._tksheet_unbind("copy_bindings")
2656
+ if binding in ("all", "cut", "edit_bindings", "edit"):
2657
+ self.cut_enabled = False
2658
+ self._tksheet_unbind("cut_bindings")
2659
+ if binding in ("all", "paste", "edit_bindings", "edit"):
2660
+ self.paste_enabled = False
2661
+ self._tksheet_unbind("paste_bindings")
2662
+ if binding in ("all", "delete", "edit_bindings", "edit"):
2663
+ self.delete_key_enabled = False
2664
+ self._tksheet_unbind("delete_bindings")
2665
+ if binding in ("all", "arrowkeys", "tab"):
2666
+ self.tab_enabled = False
2667
+ self._tksheet_unbind("tab_bindings")
2668
+ if binding in ("all", "arrowkeys", "up"):
2669
+ self.up_enabled = False
2670
+ self._tksheet_unbind("up_bindings")
2671
+ if binding in ("all", "arrowkeys", "right"):
2672
+ self.right_enabled = False
2673
+ self._tksheet_unbind("right_bindings")
2674
+ if binding in ("all", "arrowkeys", "down"):
2675
+ self.down_enabled = False
2676
+ self._tksheet_unbind("down_bindings")
2677
+ if binding in ("all", "arrowkeys", "left"):
2678
+ self.left_enabled = False
2679
+ self._tksheet_unbind("left_bindings")
2680
+ if binding in ("all", "arrowkeys", "prior"):
2681
+ self.prior_enabled = False
2682
+ self._tksheet_unbind("prior_bindings")
2683
+ if binding in ("all", "arrowkeys", "next"):
2684
+ self.next_enabled = False
2685
+ self._tksheet_unbind("next_bindings")
2686
+ if binding in ("all", "undo", "redo", "edit_bindings", "edit"):
2687
+ self.undo_enabled = False
2688
+ self._tksheet_unbind("undo_bindings", "redo_bindings")
2689
+
2690
+ def _tksheet_unbind(self, *keys) -> None:
2691
+ for widget in (self, self.RI, self.CH, self.TL):
2692
+ for bindings_key in keys:
2693
+ for binding in self.PAR.ops[bindings_key]:
2694
+ widget.unbind(binding)
2739
2695
 
2740
2696
  def reset_mouse_motion_creations(self) -> None:
2741
2697
  if self.current_cursor != "":
@@ -3196,47 +3152,71 @@ class MainTable(tk.Canvas):
3196
3152
  self.y_move_synced_scrolls("moveto", self.yview()[0])
3197
3153
  return need_redraw
3198
3154
 
3199
- def x_move_synced_scrolls(self, *args, redraw: bool = True):
3155
+ def x_move_synced_scrolls(self, *args, redraw: bool = True, use_scrollbar: bool = False):
3200
3156
  for widget in self.synced_scrolls:
3201
3157
  # try:
3202
3158
  if hasattr(widget, "MT"):
3203
- widget.MT.set_xviews(*args, move_synced=False, redraw=redraw)
3159
+ if use_scrollbar:
3160
+ widget.MT._xscrollbar(*args, move_synced=False)
3161
+ else:
3162
+ widget.MT.set_xviews(*args, move_synced=False, redraw=redraw)
3204
3163
  else:
3205
3164
  widget.xview(*args)
3206
3165
  # except Exception:
3207
3166
  # continue
3208
3167
 
3209
- def y_move_synced_scrolls(self, *args, redraw: bool = True):
3168
+ def y_move_synced_scrolls(self, *args, redraw: bool = True, use_scrollbar: bool = False):
3210
3169
  for widget in self.synced_scrolls:
3211
3170
  # try:
3212
3171
  if hasattr(widget, "MT"):
3213
- widget.MT.set_yviews(*args, move_synced=False, redraw=redraw)
3172
+ if use_scrollbar:
3173
+ widget.MT._yscrollbar(*args, move_synced=False)
3174
+ else:
3175
+ widget.MT.set_yviews(*args, move_synced=False, redraw=redraw)
3214
3176
  else:
3215
3177
  widget.yview(*args)
3216
3178
  # except Exception:
3217
3179
  # continue
3218
3180
 
3181
+ def _xscrollbar(self, *args, move_synced: bool = True):
3182
+ self.xview(*args)
3183
+ if self.show_header:
3184
+ self.CH.xview(*args)
3185
+ self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
3186
+ if move_synced:
3187
+ self.x_move_synced_scrolls(*args, use_scrollbar=True)
3188
+
3189
+ def _yscrollbar(self, *args, move_synced: bool = True):
3190
+ self.yview(*args)
3191
+ if self.show_index:
3192
+ self.RI.yview(*args)
3193
+ self.main_table_redraw_grid_and_text(redraw_header=False, redraw_row_index=True)
3194
+ if move_synced:
3195
+ self.y_move_synced_scrolls(*args, use_scrollbar=True)
3196
+
3219
3197
  def set_xviews(self, *args, move_synced: bool = True, redraw: bool = True) -> None:
3220
3198
  self.main_table_redraw_grid_and_text(setting_views=True)
3221
3199
  self.update_idletasks()
3222
3200
  self.xview(*args)
3223
3201
  if self.show_header:
3202
+ self.CH.update_idletasks()
3224
3203
  self.CH.xview(*args)
3204
+ self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
3225
3205
  if move_synced:
3226
3206
  self.x_move_synced_scrolls(*args)
3227
3207
  self.fix_views()
3228
- self.PAR.set_refresh_timer(redraw)
3229
3208
 
3230
3209
  def set_yviews(self, *args, move_synced: bool = True, redraw: bool = True) -> None:
3231
3210
  self.main_table_redraw_grid_and_text(setting_views=True)
3232
3211
  self.update_idletasks()
3233
3212
  self.yview(*args)
3234
3213
  if self.show_index:
3214
+ self.RI.update_idletasks()
3235
3215
  self.RI.yview(*args)
3216
+ self.main_table_redraw_grid_and_text(redraw_header=False, redraw_row_index=True)
3236
3217
  if move_synced:
3237
3218
  self.y_move_synced_scrolls(*args)
3238
3219
  self.fix_views()
3239
- self.PAR.set_refresh_timer(redraw)
3240
3220
 
3241
3221
  def set_view(self, x_args: list[str, float], y_args: list[str, float]) -> None:
3242
3222
  self.set_xviews(*x_args)
@@ -5194,8 +5174,7 @@ class MainTable(tk.Canvas):
5194
5174
  resized_cols = False
5195
5175
  resized_rows = False
5196
5176
  if self.PAR.ops.auto_resize_columns and self.allow_auto_resize_columns and col_pos_exists:
5197
- max_w = int(can_width)
5198
- max_w -= self.PAR.ops.empty_horizontal
5177
+ max_w = can_width - self.PAR.ops.empty_horizontal
5199
5178
  if self.PAR.ops.auto_resize_columns < self.min_column_width:
5200
5179
  min_column_width = self.column_width
5201
5180
  else:
@@ -5219,8 +5198,7 @@ class MainTable(tk.Canvas):
5219
5198
  widths[i] -= change
5220
5199
  self.set_col_positions(itr=widths)
5221
5200
  if self.PAR.ops.auto_resize_rows and self.allow_auto_resize_rows and row_pos_exists:
5222
- max_h = int(can_height)
5223
- max_h -= self.PAR.ops.empty_vertical
5201
+ max_h = can_height - self.PAR.ops.empty_vertical
5224
5202
  if self.PAR.ops.auto_resize_rows < self.min_row_height:
5225
5203
  min_row_height = self.min_row_height
5226
5204
  else:
@@ -5273,11 +5251,13 @@ class MainTable(tk.Canvas):
5273
5251
  last_col_line_pos + self.PAR.ops.empty_horizontal + 2,
5274
5252
  last_row_line_pos + self.PAR.ops.empty_vertical + 2,
5275
5253
  )
5276
- if scrollregion != self.scrollregion:
5254
+ if setting_views or scrollregion != self.scrollregion:
5277
5255
  self.configure(scrollregion=scrollregion)
5278
5256
  self.scrollregion = scrollregion
5279
- if setting_views:
5280
- return False
5257
+ self.CH.configure_scrollregion(last_col_line_pos)
5258
+ self.RI.configure_scrollregion(last_row_line_pos)
5259
+ if setting_views:
5260
+ return False
5281
5261
  scrollpos_bot = self.canvasy(can_height)
5282
5262
  end_row = bisect_right(self.row_positions, scrollpos_bot)
5283
5263
  if not scrollpos_bot >= self.row_positions[-1]:
@@ -5685,7 +5665,7 @@ class MainTable(tk.Canvas):
5685
5665
  r = r1
5686
5666
  if c is None:
5687
5667
  c = c1
5688
- if r1 <= r and c1 <= c and r2 > r and c2 > c:
5668
+ if r1 <= r and c1 <= c and r2 >= r and c2 >= c:
5689
5669
  self.create_currently_selected_box(
5690
5670
  r,
5691
5671
  c,
@@ -5701,7 +5681,7 @@ class MainTable(tk.Canvas):
5701
5681
  c = box[1]
5702
5682
  for item, selection_box in self.get_selection_items(reverse=True):
5703
5683
  r1, c1, r2, c2 = selection_box.coords
5704
- if box == (r1, c1, r2, c2) and r1 <= r and c1 <= c and r2 > r and c2 > c:
5684
+ if box == (r1, c1, r2, c2) and r1 <= r and c1 <= c and r2 >= r and c2 >= c:
5705
5685
  self.create_currently_selected_box(
5706
5686
  r,
5707
5687
  c,
@@ -5714,7 +5694,7 @@ class MainTable(tk.Canvas):
5714
5694
  if r is not None and c is not None:
5715
5695
  for item, selection_box in self.get_selection_items(reverse=True):
5716
5696
  r1, c1, r2, c2 = selection_box.coords
5717
- if r1 <= r and c1 <= c and r2 > r and c2 > c:
5697
+ if r1 <= r and c1 <= c and r2 >= r and c2 >= c:
5718
5698
  self.create_currently_selected_box(
5719
5699
  r,
5720
5700
  c,
@@ -6085,9 +6065,16 @@ class MainTable(tk.Canvas):
6085
6065
  return
6086
6066
  for item, box in self.get_selection_items():
6087
6067
  r1, c1, r2, c2 = box.coords
6088
- if r1 >= len(self.row_positions) - 1 or c1 >= len(self.col_positions) - 1:
6089
- self.hide_selection_box(item)
6090
- continue
6068
+ if r1 >= len(self.row_positions) - 1:
6069
+ if len(self.row_positions) > 1:
6070
+ r1 = len(self.row_positions) - 2
6071
+ else:
6072
+ r1 = len(self.row_positions) - 1
6073
+ if c1 >= len(self.col_positions) - 1:
6074
+ if len(self.col_positions) > 1:
6075
+ c1 = len(self.col_positions) - 2
6076
+ else:
6077
+ c1 = len(self.col_positions) - 1
6091
6078
  if r2 > len(self.row_positions) - 1:
6092
6079
  r2 = len(self.row_positions) - 1
6093
6080
  if c2 > len(self.col_positions) - 1:
tksheet/row_index.py CHANGED
@@ -391,13 +391,15 @@ class RowIndex(tk.Canvas):
391
391
  )
392
392
  elif self.width_resizing_enabled and self.rsz_h is None and self.rsz_w is True:
393
393
  self.set_width_of_index_to_text()
394
- elif self.row_selection_enabled and self.rsz_h is None and self.rsz_w is None:
394
+ elif (self.row_selection_enabled or self.PAR.ops.treeview) and self.rsz_h is None and self.rsz_w is None:
395
395
  r = self.MT.identify_row(y=event.y)
396
396
  if r < len(self.MT.row_positions) - 1:
397
- if self.MT.single_selection_enabled:
398
- self.select_row(r, redraw=True)
399
- elif self.MT.toggle_selection_enabled:
400
- self.toggle_select_row(r, redraw=True)
397
+ iid = self.event_over_tree_arrow(r, self.canvasy(event.y), event.x)
398
+ if self.row_selection_enabled:
399
+ if self.MT.single_selection_enabled:
400
+ self.select_row(r, redraw=iid is None)
401
+ elif self.MT.toggle_selection_enabled:
402
+ self.toggle_select_row(r, redraw=iid is None)
401
403
  datarn = r if self.MT.all_rows_displayed else self.MT.displayed_rows[r]
402
404
  if (
403
405
  self.get_cell_kwargs(datarn, key="dropdown")
@@ -405,8 +407,8 @@ class RowIndex(tk.Canvas):
405
407
  or self.edit_cell_enabled
406
408
  ):
407
409
  self.open_cell(event)
408
- elif (iid := self.event_over_tree_arrow(r, self.canvasy(event.y), event.x)) is not None:
409
- self.PAR.item(iid, open_=iid not in self.tree_open_ids, redraw=False)
410
+ elif iid is not None:
411
+ self.PAR.item(iid, open_=iid not in self.tree_open_ids)
410
412
  self.rsz_h = None
411
413
  self.mouse_motion(event)
412
414
  try_binding(self.extra_double_b1_func, event)
@@ -870,7 +872,7 @@ class RowIndex(tk.Canvas):
870
872
  elif (iid := self.event_over_tree_arrow(r, canvasy, event.x)) is not None:
871
873
  if self.MT.selection_boxes:
872
874
  self.select_row(r, redraw=False)
873
- self.PAR.item(iid, open_=iid not in self.tree_open_ids, redraw=False)
875
+ self.PAR.item(iid, open_=iid not in self.tree_open_ids)
874
876
  else:
875
877
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
876
878
  self.b1_pressed_loc = None
@@ -1189,8 +1191,8 @@ class RowIndex(tk.Canvas):
1189
1191
  new_w = self.set_width_of_index_to_text(only_rows=only_rows, set_width=False)
1190
1192
  else:
1191
1193
  new_w = None
1192
- if new_w is not None and (sheet_w := floor(self.PAR.winfo_width() * 0.5)) < new_w:
1193
- new_w = sheet_w
1194
+ if new_w is not None and (sheet_w_x := floor(self.PAR.winfo_width() * 0.8)) < new_w:
1195
+ new_w = sheet_w_x
1194
1196
  if new_w and (self.current_width - new_w > 15 or new_w - self.current_width > 5):
1195
1197
  self.set_width(new_w, set_TL=True)
1196
1198
  return True
@@ -1392,9 +1394,19 @@ class RowIndex(tk.Canvas):
1392
1394
  t = self.create_polygon(points, fill=fill, outline=outline, tag=tag, smooth=True)
1393
1395
  self.disp_checkbox[t] = True
1394
1396
 
1397
+ def configure_scrollregion(self, last_row_line_pos: float) -> None:
1398
+ self.configure(
1399
+ scrollregion=(
1400
+ 0,
1401
+ 0,
1402
+ self.current_width,
1403
+ last_row_line_pos + self.PAR.ops.empty_vertical + 2,
1404
+ )
1405
+ )
1406
+
1395
1407
  def redraw_grid_and_text(
1396
1408
  self,
1397
- last_row_line_pos: int,
1409
+ last_row_line_pos: float,
1398
1410
  scrollpos_top: int,
1399
1411
  y_stop: int,
1400
1412
  start_row: int,
@@ -1403,14 +1415,7 @@ class RowIndex(tk.Canvas):
1403
1415
  row_pos_exists: bool,
1404
1416
  ) -> None:
1405
1417
  try:
1406
- self.configure(
1407
- scrollregion=(
1408
- 0,
1409
- 0,
1410
- self.current_width,
1411
- last_row_line_pos + self.PAR.ops.empty_vertical + 2,
1412
- )
1413
- )
1418
+ self.configure_scrollregion(last_row_line_pos=last_row_line_pos)
1414
1419
  except Exception:
1415
1420
  return
1416
1421
  self.hidd_text.update(self.disp_text)
tksheet/sheet.py CHANGED
@@ -402,13 +402,13 @@ class Sheet(tk.Frame):
402
402
  self.set_scrollbar_options()
403
403
  self.yscroll = ttk.Scrollbar(
404
404
  self,
405
- command=self.MT.set_yviews,
405
+ command=self.MT._yscrollbar,
406
406
  orient="vertical",
407
407
  style=f"Sheet{self.unique_id}.Vertical.TScrollbar",
408
408
  )
409
409
  self.xscroll = ttk.Scrollbar(
410
410
  self,
411
- command=self.MT.set_xviews,
411
+ command=self.MT._xscrollbar,
412
412
  orient="horizontal",
413
413
  style=f"Sheet{self.unique_id}.Horizontal.TScrollbar",
414
414
  )
@@ -593,9 +593,12 @@ class Sheet(tk.Frame):
593
593
 
594
594
  def extra_bindings(
595
595
  self,
596
- bindings: str | list | tuple,
596
+ bindings: str | list | tuple | None = None,
597
597
  func: Callable | None = None,
598
598
  ) -> Sheet:
599
+ # bindings is None, unbind all
600
+ if bindings is None:
601
+ bindings = "all"
599
602
  # bindings is str, func arg is None or Callable
600
603
  if isinstance(bindings, str):
601
604
  iterable = [(bindings, func)]
@@ -1935,6 +1938,7 @@ class Sheet(tk.Frame):
1935
1938
  undo: bool = False,
1936
1939
  emit_event: bool = False,
1937
1940
  create_selections: bool = True,
1941
+ add_column_widths: bool = True,
1938
1942
  redraw: bool = True,
1939
1943
  ) -> EventDataDict:
1940
1944
  total_cols = None
@@ -1993,6 +1997,7 @@ class Sheet(tk.Frame):
1993
1997
  heights=heights,
1994
1998
  row_index=row_index,
1995
1999
  ),
2000
+ add_col_positions=add_column_widths,
1996
2001
  event_data=event_dict(
1997
2002
  name="add_rows",
1998
2003
  sheet=self.name,
@@ -2018,6 +2023,7 @@ class Sheet(tk.Frame):
2018
2023
  undo: bool = False,
2019
2024
  emit_event: bool = False,
2020
2025
  create_selections: bool = True,
2026
+ add_row_heights: bool = True,
2021
2027
  redraw: bool = True,
2022
2028
  ) -> EventDataDict:
2023
2029
  old_total = self.MT.equalize_data_row_lengths()
@@ -2084,6 +2090,7 @@ class Sheet(tk.Frame):
2084
2090
  widths=widths,
2085
2091
  headers=headers,
2086
2092
  ),
2093
+ add_row_positions=add_row_heights,
2087
2094
  event_data=event_dict(
2088
2095
  name="add_columns",
2089
2096
  sheet=self.name,
@@ -4117,7 +4124,11 @@ class Sheet(tk.Frame):
4117
4124
  def set_options(self, redraw: bool = True, **kwargs) -> Sheet:
4118
4125
  for k, v in kwargs.items():
4119
4126
  if k in self.ops and v != self.ops[k]:
4127
+ if k.endswith("bindings"):
4128
+ self.MT._disable_binding(k.split("_")[0])
4120
4129
  self.ops[k] = v
4130
+ if k.endswith("bindings"):
4131
+ self.MT._enable_binding(k.split("_")[0])
4121
4132
  if "from_clipboard_delimiters" in kwargs:
4122
4133
  self.ops.from_clipboard_delimiters = (
4123
4134
  self.ops.from_clipboard_delimiters
@@ -4172,7 +4183,6 @@ class Sheet(tk.Frame):
4172
4183
  if any(k in kwargs for k in scrollbar_options_keys):
4173
4184
  self.set_scrollbar_options()
4174
4185
  self.MT.create_rc_menus()
4175
- self.MT.key_bindings()
4176
4186
  self.set_refresh_timer(redraw)
4177
4187
  return self
4178
4188
 
@@ -4480,7 +4490,9 @@ class Sheet(tk.Frame):
4480
4490
  x += 1
4481
4491
  tally_of_ids[iid] += 1
4482
4492
  row[iid_column] = new
4483
- if iid not in self.RI.tree:
4493
+ if iid in self.RI.tree:
4494
+ self.RI.tree[iid].text = row[text_column]
4495
+ else:
4484
4496
  self.RI.tree[iid] = Node(row[text_column], iid, "")
4485
4497
  if iid == pid or self.RI.pid_causes_recursive_loop(iid, pid):
4486
4498
  row[parent_column] = ""
@@ -4531,7 +4543,6 @@ class Sheet(tk.Frame):
4531
4543
  Accepts set[str] of iids that are open in the treeview
4532
4544
  Closes everything else
4533
4545
  """
4534
- self.RI.tree_open_ids = open_ids if isinstance(open_ids, set) else set(open_ids)
4535
4546
  self.hide_rows(
4536
4547
  set(self.MT.displayed_rows),
4537
4548
  redraw=False,
@@ -4543,16 +4554,18 @@ class Sheet(tk.Frame):
4543
4554
  redraw=False,
4544
4555
  deselect_all=True,
4545
4556
  )
4557
+ open_ids = set(filter(self.exists, map(str.lower, open_ids)))
4558
+ self.RI.tree_open_ids = open_ids
4546
4559
  if open_ids:
4547
- self.tree_open(*open_ids)
4560
+ self.tree_open(open_ids)
4548
4561
  return self
4549
4562
 
4550
4563
  def tree_open(self, *items) -> Sheet:
4551
4564
  """
4552
4565
  If used without args all items are opened
4553
4566
  """
4554
- if items:
4555
- for item in unpack(items):
4567
+ if items := set(unpack(items)):
4568
+ for item in filter(items.__contains__, self.get_children()):
4556
4569
  self.item(item, open_=True)
4557
4570
  else:
4558
4571
  for item in self.get_children():
@@ -4597,9 +4610,6 @@ class Sheet(tk.Frame):
4597
4610
  text = iid
4598
4611
  parent_node = self.RI.tree[pid] if parent else ""
4599
4612
  self.RI.tree[iid] = Node(text, iid, parent_node)
4600
- if self.RI.pid_causes_recursive_loop(iid, pid):
4601
- del self.RI.tree[iid]
4602
- raise ValueError(f"iid '{iid}' causes a recursive loop with parent '{parent}'.")
4603
4613
  if parent_node:
4604
4614
  if isinstance(index, int):
4605
4615
  idx = self.RI.tree_rns[pid] + index + 1
@@ -4666,24 +4676,25 @@ class Sheet(tk.Frame):
4666
4676
  if self.RI.tree[item].children:
4667
4677
  if open_:
4668
4678
  self.RI.tree_open_ids.add(item)
4669
- self.show_rows(
4670
- (self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)),
4671
- redraw=False,
4672
- deselect_all=False,
4673
- )
4679
+ if self.item_displayed(item):
4680
+ self.show_rows(
4681
+ rows=(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)),
4682
+ redraw=False,
4683
+ deselect_all=False,
4684
+ )
4674
4685
  else:
4675
4686
  self.RI.tree_open_ids.discard(item)
4676
- rows = {self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)}
4677
- self.hide_rows(
4678
- rows,
4679
- redraw=False,
4680
- deselect_all=False,
4681
- data_indexes=True,
4682
- )
4687
+ if self.item_displayed(item):
4688
+ self.hide_rows(
4689
+ rows={self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)},
4690
+ redraw=False,
4691
+ deselect_all=False,
4692
+ data_indexes=True,
4693
+ )
4683
4694
  else:
4684
4695
  self.RI.tree_open_ids.discard(item)
4685
4696
  get = not (isinstance(iid, str) or isinstance(text, str) or isinstance(values, list) or isinstance(open_, bool))
4686
- self.set_refresh_timer(redraw=not get or redraw)
4697
+ self.set_refresh_timer(redraw=not get and redraw)
4687
4698
  if get:
4688
4699
  return DotDict(
4689
4700
  text=self.RI.tree[item].text,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.9
3
+ Version: 7.1.11
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=w1YOGIZHF7gjLLEWIH-XLK-ftzuYgSiLTvMUg6ORTYM,2014
2
+ tksheet/colors.py,sha256=1k06VorynLmnC4FdJg8H4reIA6rXaeXBpdMwXLhN8oc,51594
3
+ tksheet/column_headers.py,sha256=6yYncfnKKKlSGTln35eP74e2Oom9A2XX85SrIsDeq9g,100452
4
+ tksheet/formatters.py,sha256=DXif00aq9DgFpXwkbiqD86KxtDg0Meop51hLY-KcGNQ,10037
5
+ tksheet/functions.py,sha256=ytmHQtSa8cN6dKYLFra5G0393-4sU7bivvT_U4wxksI,39697
6
+ tksheet/main_table.py,sha256=1K-JpLixwx_cnqp5IXeghRWyzaMdQiP6BPm6QVOtfzs,319012
7
+ tksheet/other_classes.py,sha256=P3FYUYreLhstATvHCNow8sDQoCsD_02KB6oXcca3ahE,13628
8
+ tksheet/row_index.py,sha256=BnQF-lxH50MfPWlXW94oYSEJXoPewoX29VS7j0X1Jwc,105895
9
+ tksheet/sheet.py,sha256=dvYtZpNJsu6WfjdUKt6RKcwKeDY5c7wZ-tQfL1rjglQ,259484
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.11.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
17
+ tksheet-7.1.11.dist-info/METADATA,sha256=SRDk-Is6G0UmdJ6PAMgPzkwumb4PLOFETNplec7bkbE,6014
18
+ tksheet-7.1.11.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
+ tksheet-7.1.11.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
20
+ tksheet-7.1.11.dist-info/RECORD,,
@@ -1,20 +0,0 @@
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,,