tksheet 7.1.9__tar.gz → 7.1.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {tksheet-7.1.9/tksheet.egg-info → tksheet-7.1.10}/PKG-INFO +1 -1
  2. {tksheet-7.1.9 → tksheet-7.1.10}/pyproject.toml +1 -1
  3. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/__init__.py +2 -1
  4. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/column_headers.py +11 -8
  5. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/main_table.py +133 -161
  6. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/row_index.py +24 -19
  7. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/sheet.py +36 -25
  8. {tksheet-7.1.9 → tksheet-7.1.10/tksheet.egg-info}/PKG-INFO +1 -1
  9. {tksheet-7.1.9 → tksheet-7.1.10}/LICENSE.txt +0 -0
  10. {tksheet-7.1.9 → tksheet-7.1.10}/README.md +0 -0
  11. {tksheet-7.1.9 → tksheet-7.1.10}/setup.cfg +0 -0
  12. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/colors.py +0 -0
  13. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/formatters.py +0 -0
  14. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/functions.py +0 -0
  15. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/other_classes.py +0 -0
  16. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/sheet_options.py +0 -0
  17. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/text_editor.py +0 -0
  18. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/themes.py +0 -0
  19. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/top_left_rectangle.py +0 -0
  20. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/types.py +0 -0
  21. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet/vars.py +0 -0
  22. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet.egg-info/SOURCES.txt +0 -0
  23. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet.egg-info/dependency_links.txt +0 -0
  24. {tksheet-7.1.9 → tksheet-7.1.10}/tksheet.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tksheet
3
- Version: 7.1.9
3
+ Version: 7.1.10
4
4
  Summary: Tkinter table / sheet widget
5
5
  Author-email: ragardner <github@ragardner.simplelogin.com>
6
6
  License: Copyright (c) 2019 ragardner and open source contributors
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
  name = "tksheet"
7
7
  description = "Tkinter table / sheet widget"
8
8
  readme = "README.md"
9
- version = "7.1.9"
9
+ version = "7.1.10"
10
10
  authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
11
11
  requires-python = ">=3.8"
12
12
  license = {file = "LICENSE.txt"}
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.1.9"
7
+ __version__ = "7.1.10"
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,
@@ -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)
@@ -2203,98 +2203,6 @@ class MainTable(tk.Canvas):
2203
2203
  check_cell_visibility=False,
2204
2204
  )
2205
2205
 
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
2206
  def menu_add_command(self, menu: tk.Menu, **kwargs) -> None:
2299
2207
  if "label" not in kwargs:
2300
2208
  return
@@ -2528,35 +2436,33 @@ class MainTable(tk.Canvas):
2528
2436
 
2529
2437
  def enable_bindings(self, bindings):
2530
2438
  if not bindings:
2531
- self.enable_bindings_internal("all")
2439
+ self._enable_binding("all")
2532
2440
  elif isinstance(bindings, (list, tuple)):
2533
2441
  for binding in bindings:
2534
2442
  if isinstance(binding, (list, tuple)):
2535
2443
  for bind in binding:
2536
- self.enable_bindings_internal(bind.lower())
2444
+ self._enable_binding(bind.lower())
2537
2445
  elif isinstance(binding, str):
2538
- self.enable_bindings_internal(binding.lower())
2446
+ self._enable_binding(binding.lower())
2539
2447
  elif isinstance(bindings, str):
2540
- self.enable_bindings_internal(bindings.lower())
2448
+ self._enable_binding(bindings.lower())
2541
2449
  self.create_rc_menus()
2542
- self.key_bindings()
2543
2450
 
2544
2451
  def disable_bindings(self, bindings):
2545
2452
  if not bindings:
2546
- self.disable_bindings_internal("all")
2453
+ self._disable_binding("all")
2547
2454
  elif isinstance(bindings, (list, tuple)):
2548
2455
  for binding in bindings:
2549
2456
  if isinstance(binding, (list, tuple)):
2550
2457
  for bind in binding:
2551
- self.disable_bindings_internal(bind.lower())
2458
+ self._disable_binding(bind.lower())
2552
2459
  elif isinstance(binding, str):
2553
- self.disable_bindings_internal(binding.lower())
2460
+ self._disable_binding(binding.lower())
2554
2461
  elif isinstance(bindings, str):
2555
- self.disable_bindings_internal(bindings)
2462
+ self._disable_binding(bindings)
2556
2463
  self.create_rc_menus()
2557
- self.key_bindings()
2558
2464
 
2559
- def enable_bindings_internal(self, binding):
2465
+ def _enable_binding(self, binding):
2560
2466
  if binding == "enable_all":
2561
2467
  binding = "all"
2562
2468
  if binding in ("all", "single", "single_selection_mode", "single_select"):
@@ -2567,9 +2473,6 @@ class MainTable(tk.Canvas):
2567
2473
  self.single_selection_enabled = False
2568
2474
  if binding in ("all", "drag_select"):
2569
2475
  self.drag_selection_enabled = True
2570
- if binding in ("all", "select_all"):
2571
- self.select_all_enabled = True
2572
- self.TL.sa_state()
2573
2476
  if binding in ("all", "column_width_resize"):
2574
2477
  self.CH.width_resizing_enabled = True
2575
2478
  if binding in ("all", "column_select"):
@@ -2592,20 +2495,47 @@ class MainTable(tk.Canvas):
2592
2495
  self.RI.row_selection_enabled = True
2593
2496
  if binding in ("all", "row_drag_and_drop", "move_rows"):
2594
2497
  self.RI.drag_and_drop_enabled = True
2498
+ if binding in ("all", "select_all"):
2499
+ self.select_all_enabled = True
2500
+ self.TL.sa_state()
2501
+ self._tksheet_bind("select_all_bindings", self.select_all)
2595
2502
  if binding in ("all", "arrowkeys", "tab"):
2596
2503
  self.tab_enabled = True
2504
+ self._tksheet_bind("tab_bindings", self.tab_key)
2597
2505
  if binding in ("all", "arrowkeys", "up"):
2598
2506
  self.up_enabled = True
2507
+ self._tksheet_bind("up_bindings", self.arrowkey_UP)
2599
2508
  if binding in ("all", "arrowkeys", "right"):
2600
2509
  self.right_enabled = True
2510
+ self._tksheet_bind("right_bindings", self.arrowkey_RIGHT)
2601
2511
  if binding in ("all", "arrowkeys", "down"):
2602
2512
  self.down_enabled = True
2513
+ self._tksheet_bind("down_bindings", self.arrowkey_DOWN)
2603
2514
  if binding in ("all", "arrowkeys", "left"):
2604
2515
  self.left_enabled = True
2516
+ self._tksheet_bind("left_bindings", self.arrowkey_LEFT)
2605
2517
  if binding in ("all", "arrowkeys", "prior"):
2606
2518
  self.prior_enabled = True
2519
+ self._tksheet_bind("prior_bindings", self.page_UP)
2607
2520
  if binding in ("all", "arrowkeys", "next"):
2608
2521
  self.next_enabled = True
2522
+ self._tksheet_bind("next_bindings", self.page_DOWN)
2523
+ if binding in ("all", "copy", "edit_bindings", "edit"):
2524
+ self.copy_enabled = True
2525
+ self._tksheet_bind("copy_bindings", self.ctrl_c)
2526
+ if binding in ("all", "cut", "edit_bindings", "edit"):
2527
+ self.cut_enabled = True
2528
+ self._tksheet_bind("cut_bindings", self.ctrl_x)
2529
+ if binding in ("all", "paste", "edit_bindings", "edit"):
2530
+ self.paste_enabled = True
2531
+ self._tksheet_bind("paste_bindings", self.ctrl_v)
2532
+ if binding in ("all", "delete", "edit_bindings", "edit"):
2533
+ self.delete_key_enabled = True
2534
+ self._tksheet_bind("delete_bindings", self.delete_key)
2535
+ if binding in ("all", "undo", "redo", "edit_bindings", "edit"):
2536
+ self.undo_enabled = True
2537
+ self._tksheet_bind("undo_bindings", self.undo)
2538
+ self._tksheet_bind("redo_bindings", self.redo)
2609
2539
  if binding in ("all", "rc_delete_column"):
2610
2540
  self.rc_delete_column_enabled = True
2611
2541
  self.rc_popup_menus_enabled = True
@@ -2622,23 +2552,15 @@ class MainTable(tk.Canvas):
2622
2552
  self.rc_insert_row_enabled = True
2623
2553
  self.rc_popup_menus_enabled = True
2624
2554
  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
2555
  if binding in ("all", "right_click_popup_menu", "rc_popup_menu"):
2634
2556
  self.rc_popup_menus_enabled = True
2635
2557
  self.rc_select_enabled = True
2636
2558
  if binding in ("all", "right_click_select", "rc_select"):
2637
2559
  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"):
2560
+ if binding in ("all", "edit_cell", "edit_bindings", "edit"):
2641
2561
  self.edit_cell_enabled = True
2562
+ for w in (self, self.RI, self.CH):
2563
+ w.bind("<Key>", self.open_cell)
2642
2564
  if binding in ("edit_header"):
2643
2565
  self.CH.edit_cell_enabled = True
2644
2566
  if binding in ("edit_index"):
@@ -2647,7 +2569,12 @@ class MainTable(tk.Canvas):
2647
2569
  if binding in ("ctrl_click_select", "ctrl_select"):
2648
2570
  self.ctrl_select_enabled = True
2649
2571
 
2650
- def disable_bindings_internal(self, binding):
2572
+ def _tksheet_bind(self, bindings_key: str, func: Callable) -> None:
2573
+ for widget in (self, self.RI, self.CH, self.TL):
2574
+ for binding in self.PAR.ops[bindings_key]:
2575
+ widget.bind(binding, func)
2576
+
2577
+ def _disable_binding(self, binding):
2651
2578
  if binding == "disable_all":
2652
2579
  binding = "all"
2653
2580
  if binding in ("all", "single", "single_selection_mode", "single_select"):
@@ -2658,9 +2585,6 @@ class MainTable(tk.Canvas):
2658
2585
  self.single_selection_enabled = False
2659
2586
  if binding in ("all", "drag_select"):
2660
2587
  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
2588
  if binding in ("all", "column_width_resize"):
2665
2589
  self.CH.width_resizing_enabled = False
2666
2590
  if binding in ("all", "column_select"):
@@ -2683,20 +2607,6 @@ class MainTable(tk.Canvas):
2683
2607
  self.RI.row_selection_enabled = False
2684
2608
  if binding in ("all", "row_drag_and_drop", "move_rows"):
2685
2609
  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
2610
  if binding in ("all", "rc_delete_column"):
2701
2611
  self.rc_delete_column_enabled = False
2702
2612
  self.rc_popup_menus_enabled = False
@@ -2713,29 +2623,67 @@ class MainTable(tk.Canvas):
2713
2623
  self.rc_insert_row_enabled = False
2714
2624
  self.rc_popup_menus_enabled = False
2715
2625
  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
2626
  if binding in ("all", "right_click_popup_menu", "rc_popup_menu"):
2725
2627
  self.rc_popup_menus_enabled = False
2726
2628
  self.rc_select_enabled = False
2727
2629
  if binding in ("all", "right_click_select", "rc_select"):
2728
2630
  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"):
2631
+ if binding in ("all", "edit_cell", "edit_bindings", "edit"):
2732
2632
  self.edit_cell_enabled = False
2733
- if binding in ("all", "edit_header", "edit_bindings"):
2633
+ for w in (self, self.RI, self.CH):
2634
+ w.unbind("<Key>")
2635
+ if binding in ("all", "edit_header", "edit_bindings", "edit"):
2734
2636
  self.CH.edit_cell_enabled = False
2735
- if binding in ("all", "edit_index", "edit_bindings"):
2637
+ if binding in ("all", "edit_index", "edit_bindings", "edit"):
2736
2638
  self.RI.edit_cell_enabled = False
2737
2639
  if binding in ("all", "ctrl_click_select", "ctrl_select"):
2738
2640
  self.ctrl_select_enabled = False
2641
+ if binding in ("all", "select_all"):
2642
+ self.select_all_enabled = False
2643
+ self.TL.sa_state("hidden")
2644
+ self._tksheet_unbind("select_all_bindings")
2645
+ if binding in ("all", "copy", "edit_bindings", "edit"):
2646
+ self.copy_enabled = False
2647
+ self._tksheet_unbind("copy_bindings")
2648
+ if binding in ("all", "cut", "edit_bindings", "edit"):
2649
+ self.cut_enabled = False
2650
+ self._tksheet_unbind("cut_bindings")
2651
+ if binding in ("all", "paste", "edit_bindings", "edit"):
2652
+ self.paste_enabled = False
2653
+ self._tksheet_unbind("paste_bindings")
2654
+ if binding in ("all", "delete", "edit_bindings", "edit"):
2655
+ self.delete_key_enabled = False
2656
+ self._tksheet_unbind("delete_bindings")
2657
+ if binding in ("all", "arrowkeys", "tab"):
2658
+ self.tab_enabled = False
2659
+ self._tksheet_unbind("tab_bindings")
2660
+ if binding in ("all", "arrowkeys", "up"):
2661
+ self.up_enabled = False
2662
+ self._tksheet_unbind("up_bindings")
2663
+ if binding in ("all", "arrowkeys", "right"):
2664
+ self.right_enabled = False
2665
+ self._tksheet_unbind("right_bindings")
2666
+ if binding in ("all", "arrowkeys", "down"):
2667
+ self.down_enabled = False
2668
+ self._tksheet_unbind("down_bindings")
2669
+ if binding in ("all", "arrowkeys", "left"):
2670
+ self.left_enabled = False
2671
+ self._tksheet_unbind("left_bindings")
2672
+ if binding in ("all", "arrowkeys", "prior"):
2673
+ self.prior_enabled = False
2674
+ self._tksheet_unbind("prior_bindings")
2675
+ if binding in ("all", "arrowkeys", "next"):
2676
+ self.next_enabled = False
2677
+ self._tksheet_unbind("next_bindings")
2678
+ if binding in ("all", "undo", "redo", "edit_bindings", "edit"):
2679
+ self.undo_enabled = False
2680
+ self._tksheet_unbind("undo_bindings", "redo_bindings")
2681
+
2682
+ def _tksheet_unbind(self, *keys) -> None:
2683
+ for widget in (self, self.RI, self.CH, self.TL):
2684
+ for bindings_key in keys:
2685
+ for binding in self.PAR.ops[bindings_key]:
2686
+ widget.unbind(binding)
2739
2687
 
2740
2688
  def reset_mouse_motion_creations(self) -> None:
2741
2689
  if self.current_cursor != "":
@@ -3196,47 +3144,71 @@ class MainTable(tk.Canvas):
3196
3144
  self.y_move_synced_scrolls("moveto", self.yview()[0])
3197
3145
  return need_redraw
3198
3146
 
3199
- def x_move_synced_scrolls(self, *args, redraw: bool = True):
3147
+ def x_move_synced_scrolls(self, *args, redraw: bool = True, use_scrollbar: bool = False):
3200
3148
  for widget in self.synced_scrolls:
3201
3149
  # try:
3202
3150
  if hasattr(widget, "MT"):
3203
- widget.MT.set_xviews(*args, move_synced=False, redraw=redraw)
3151
+ if use_scrollbar:
3152
+ widget.MT._xscrollbar(*args, move_synced=False)
3153
+ else:
3154
+ widget.MT.set_xviews(*args, move_synced=False, redraw=redraw)
3204
3155
  else:
3205
3156
  widget.xview(*args)
3206
3157
  # except Exception:
3207
3158
  # continue
3208
3159
 
3209
- def y_move_synced_scrolls(self, *args, redraw: bool = True):
3160
+ def y_move_synced_scrolls(self, *args, redraw: bool = True, use_scrollbar: bool = False):
3210
3161
  for widget in self.synced_scrolls:
3211
3162
  # try:
3212
3163
  if hasattr(widget, "MT"):
3213
- widget.MT.set_yviews(*args, move_synced=False, redraw=redraw)
3164
+ if use_scrollbar:
3165
+ widget.MT._yscrollbar(*args, move_synced=False)
3166
+ else:
3167
+ widget.MT.set_yviews(*args, move_synced=False, redraw=redraw)
3214
3168
  else:
3215
3169
  widget.yview(*args)
3216
3170
  # except Exception:
3217
3171
  # continue
3218
3172
 
3173
+ def _xscrollbar(self, *args, move_synced: bool = True):
3174
+ self.xview(*args)
3175
+ if self.show_header:
3176
+ self.CH.xview(*args)
3177
+ self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
3178
+ if move_synced:
3179
+ self.x_move_synced_scrolls(*args, use_scrollbar=True)
3180
+
3181
+ def _yscrollbar(self, *args, move_synced: bool = True):
3182
+ self.yview(*args)
3183
+ if self.show_index:
3184
+ self.RI.yview(*args)
3185
+ self.main_table_redraw_grid_and_text(redraw_header=False, redraw_row_index=True)
3186
+ if move_synced:
3187
+ self.y_move_synced_scrolls(*args, use_scrollbar=True)
3188
+
3219
3189
  def set_xviews(self, *args, move_synced: bool = True, redraw: bool = True) -> None:
3220
3190
  self.main_table_redraw_grid_and_text(setting_views=True)
3221
3191
  self.update_idletasks()
3222
3192
  self.xview(*args)
3223
3193
  if self.show_header:
3194
+ self.CH.update_idletasks()
3224
3195
  self.CH.xview(*args)
3196
+ self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
3225
3197
  if move_synced:
3226
3198
  self.x_move_synced_scrolls(*args)
3227
3199
  self.fix_views()
3228
- self.PAR.set_refresh_timer(redraw)
3229
3200
 
3230
3201
  def set_yviews(self, *args, move_synced: bool = True, redraw: bool = True) -> None:
3231
3202
  self.main_table_redraw_grid_and_text(setting_views=True)
3232
3203
  self.update_idletasks()
3233
3204
  self.yview(*args)
3234
3205
  if self.show_index:
3206
+ self.RI.update_idletasks()
3235
3207
  self.RI.yview(*args)
3208
+ self.main_table_redraw_grid_and_text(redraw_header=False, redraw_row_index=True)
3236
3209
  if move_synced:
3237
3210
  self.y_move_synced_scrolls(*args)
3238
3211
  self.fix_views()
3239
- self.PAR.set_refresh_timer(redraw)
3240
3212
 
3241
3213
  def set_view(self, x_args: list[str, float], y_args: list[str, float]) -> None:
3242
3214
  self.set_xviews(*x_args)
@@ -5194,8 +5166,7 @@ class MainTable(tk.Canvas):
5194
5166
  resized_cols = False
5195
5167
  resized_rows = False
5196
5168
  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
5169
+ max_w = can_width - self.PAR.ops.empty_horizontal
5199
5170
  if self.PAR.ops.auto_resize_columns < self.min_column_width:
5200
5171
  min_column_width = self.column_width
5201
5172
  else:
@@ -5219,8 +5190,7 @@ class MainTable(tk.Canvas):
5219
5190
  widths[i] -= change
5220
5191
  self.set_col_positions(itr=widths)
5221
5192
  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
5193
+ max_h = can_height - self.PAR.ops.empty_vertical
5224
5194
  if self.PAR.ops.auto_resize_rows < self.min_row_height:
5225
5195
  min_row_height = self.min_row_height
5226
5196
  else:
@@ -5273,11 +5243,13 @@ class MainTable(tk.Canvas):
5273
5243
  last_col_line_pos + self.PAR.ops.empty_horizontal + 2,
5274
5244
  last_row_line_pos + self.PAR.ops.empty_vertical + 2,
5275
5245
  )
5276
- if scrollregion != self.scrollregion:
5246
+ if setting_views or scrollregion != self.scrollregion:
5277
5247
  self.configure(scrollregion=scrollregion)
5278
5248
  self.scrollregion = scrollregion
5279
- if setting_views:
5280
- return False
5249
+ self.CH.configure_scrollregion(last_col_line_pos)
5250
+ self.RI.configure_scrollregion(last_row_line_pos)
5251
+ if setting_views:
5252
+ return False
5281
5253
  scrollpos_bot = self.canvasy(can_height)
5282
5254
  end_row = bisect_right(self.row_positions, scrollpos_bot)
5283
5255
  if not scrollpos_bot >= self.row_positions[-1]:
@@ -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)
@@ -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.10
4
4
  Summary: Tkinter table / sheet widget
5
5
  Author-email: ragardner <github@ragardner.simplelogin.com>
6
6
  License: Copyright (c) 2019 ragardner and open source contributors
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes