tksheet 7.1.1__tar.gz → 7.1.3__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.
- {tksheet-7.1.1/tksheet.egg-info → tksheet-7.1.3}/PKG-INFO +1 -1
- {tksheet-7.1.1 → tksheet-7.1.3}/pyproject.toml +1 -1
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/__init__.py +1 -1
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/functions.py +2 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/main_table.py +34 -79
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/row_index.py +2 -2
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/sheet.py +106 -41
- {tksheet-7.1.1 → tksheet-7.1.3/tksheet.egg-info}/PKG-INFO +1 -1
- {tksheet-7.1.1 → tksheet-7.1.3}/LICENSE.txt +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/README.md +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/setup.cfg +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/colors.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/column_headers.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/formatters.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/other_classes.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/sheet_options.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/text_editor.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/themes.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/top_left_rectangle.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/types.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet/vars.py +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet.egg-info/dependency_links.txt +0 -0
- {tksheet-7.1.1 → tksheet-7.1.3}/tksheet.egg-info/top_level.txt +0 -0
@@ -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
|
+
version = "7.1.3"
|
10
10
|
authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
|
11
11
|
requires-python = ">=3.8"
|
12
12
|
license = {file = "LICENSE.txt"}
|
@@ -628,6 +628,7 @@ def span_dict(
|
|
628
628
|
ndim: int | None = None,
|
629
629
|
convert: Callable | None = None,
|
630
630
|
undo: bool = False,
|
631
|
+
emit_event: bool = False,
|
631
632
|
widget: object = None,
|
632
633
|
) -> Span:
|
633
634
|
d: Span = Span(
|
@@ -648,6 +649,7 @@ def span_dict(
|
|
648
649
|
ndim=ndim,
|
649
650
|
convert=convert,
|
650
651
|
undo=undo,
|
652
|
+
emit_event=emit_event,
|
651
653
|
widget=widget,
|
652
654
|
)
|
653
655
|
return d
|
@@ -1099,29 +1099,16 @@ class MainTable(tk.Canvas):
|
|
1099
1099
|
def get_max_column_idx(self, maxidx: int | None = None) -> int:
|
1100
1100
|
if maxidx is None:
|
1101
1101
|
maxidx = len_to_idx(self.total_data_cols())
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1112
|
-
(d["from_c"] for d in self.named_spans.values() if isinstance(d["from_c"], int)),
|
1113
|
-
default=0,
|
1114
|
-
)
|
1115
|
-
):
|
1116
|
-
maxidx = maxk
|
1117
|
-
if maxidx < (
|
1118
|
-
maxk := max(
|
1119
|
-
(d["upto_c"] for d in self.named_spans.values() if isinstance(d["upto_c"], int)),
|
1120
|
-
default=0,
|
1121
|
-
)
|
1122
|
-
):
|
1123
|
-
maxidx = maxk
|
1124
|
-
return maxidx
|
1102
|
+
maxiget = partial(max, key=itemgetter(1))
|
1103
|
+
return max(
|
1104
|
+
max(self.cell_options, key=itemgetter(1), default=(0, maxidx))[1],
|
1105
|
+
max(self.col_options, default=maxidx),
|
1106
|
+
max(self.CH.cell_options, default=maxidx),
|
1107
|
+
maxiget(map(maxiget, self.tagged_cells.values()), default=(0, maxidx))[1],
|
1108
|
+
max(map(max, self.tagged_columns.values()), default=maxidx),
|
1109
|
+
max((d.from_c for d in self.named_spans.values() if isinstance(d.from_c, int)), default=maxidx),
|
1110
|
+
max((d.upto_c for d in self.named_spans.values() if isinstance(d.upto_c, int)), default=maxidx),
|
1111
|
+
)
|
1125
1112
|
|
1126
1113
|
def get_args_for_move_rows(
|
1127
1114
|
self,
|
@@ -1329,28 +1316,16 @@ class MainTable(tk.Canvas):
|
|
1329
1316
|
def get_max_row_idx(self, maxidx: int | None = None) -> int:
|
1330
1317
|
if maxidx is None:
|
1331
1318
|
maxidx = len_to_idx(self.total_data_rows())
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
default=0,
|
1343
|
-
)
|
1344
|
-
):
|
1345
|
-
maxidx = maxk
|
1346
|
-
if maxidx < (
|
1347
|
-
maxk := max(
|
1348
|
-
(d["upto_r"] for d in self.named_spans.values() if isinstance(d["upto_r"], int)),
|
1349
|
-
default=0,
|
1350
|
-
)
|
1351
|
-
):
|
1352
|
-
maxidx = maxk
|
1353
|
-
return maxidx
|
1319
|
+
maxiget = partial(max, key=itemgetter(0))
|
1320
|
+
return max(
|
1321
|
+
max(self.cell_options, key=itemgetter(0), default=(maxidx, 0))[0],
|
1322
|
+
max(self.row_options, default=maxidx),
|
1323
|
+
max(self.RI.cell_options, default=maxidx),
|
1324
|
+
maxiget(map(maxiget, self.tagged_cells.values()), default=(maxidx, 0))[0],
|
1325
|
+
max(map(max, self.tagged_rows.values()), default=maxidx),
|
1326
|
+
max((d.from_r for d in self.named_spans.values() if isinstance(d.from_r, int)), default=maxidx),
|
1327
|
+
max((d.upto_r for d in self.named_spans.values() if isinstance(d.upto_r, int)), default=maxidx),
|
1328
|
+
)
|
1354
1329
|
|
1355
1330
|
def get_full_new_idxs(
|
1356
1331
|
self,
|
@@ -2724,42 +2699,22 @@ class MainTable(tk.Canvas):
|
|
2724
2699
|
self.mouseclick_outside_editor_or_dropdown_all_canvases()
|
2725
2700
|
self.focus_set()
|
2726
2701
|
popup_menu = None
|
2727
|
-
if self.single_selection_enabled and self.not_currently_resizing():
|
2728
|
-
r = self.identify_row(y=event.y)
|
2729
|
-
c = self.identify_col(x=event.x)
|
2730
|
-
if r < len(self.row_positions) - 1 and c < len(self.col_positions) - 1:
|
2731
|
-
if self.col_selected(c):
|
2732
|
-
if self.rc_popup_menus_enabled:
|
2733
|
-
popup_menu = self.CH.ch_rc_popup_menu
|
2734
|
-
elif self.row_selected(r):
|
2735
|
-
if self.rc_popup_menus_enabled:
|
2736
|
-
popup_menu = self.RI.ri_rc_popup_menu
|
2737
|
-
elif self.cell_selected(r, c):
|
2738
|
-
if self.rc_popup_menus_enabled:
|
2739
|
-
popup_menu = self.rc_popup_menu
|
2740
|
-
else:
|
2741
|
-
if self.rc_select_enabled:
|
2742
|
-
self.select_cell(r, c, redraw=True)
|
2743
|
-
if self.rc_popup_menus_enabled:
|
2744
|
-
popup_menu = self.rc_popup_menu
|
2745
|
-
else:
|
2746
|
-
popup_menu = self.empty_rc_popup_menu
|
2747
|
-
elif self.toggle_selection_enabled and self.not_currently_resizing():
|
2702
|
+
if (self.single_selection_enabled or self.toggle_selection_enabled) and self.not_currently_resizing():
|
2748
2703
|
r = self.identify_row(y=event.y)
|
2749
2704
|
c = self.identify_col(x=event.x)
|
2750
2705
|
if r < len(self.row_positions) - 1 and c < len(self.col_positions) - 1:
|
2751
|
-
if self.col_selected(c):
|
2752
|
-
|
2753
|
-
|
2754
|
-
|
2755
|
-
|
2756
|
-
|
2757
|
-
elif self.cell_selected(r, c):
|
2758
|
-
if self.rc_popup_menus_enabled:
|
2759
|
-
popup_menu = self.rc_popup_menu
|
2706
|
+
if self.col_selected(c) and self.rc_popup_menus_enabled:
|
2707
|
+
popup_menu = self.CH.ch_rc_popup_menu
|
2708
|
+
elif self.row_selected(r) and self.rc_popup_menus_enabled:
|
2709
|
+
popup_menu = self.RI.ri_rc_popup_menu
|
2710
|
+
elif self.cell_selected(r, c) and self.rc_popup_menus_enabled:
|
2711
|
+
popup_menu = self.rc_popup_menu
|
2760
2712
|
else:
|
2761
2713
|
if self.rc_select_enabled:
|
2762
|
-
self.
|
2714
|
+
if self.single_selection_enabled:
|
2715
|
+
self.select_cell(r, c, redraw=True)
|
2716
|
+
elif self.toggle_selection_enabled:
|
2717
|
+
self.toggle_select_cell(r, c, redraw=True)
|
2763
2718
|
if self.rc_popup_menus_enabled:
|
2764
2719
|
popup_menu = self.rc_popup_menu
|
2765
2720
|
else:
|
@@ -3982,7 +3937,7 @@ class MainTable(tk.Canvas):
|
|
3982
3937
|
# if to_add then it's an undo/redo and don't
|
3983
3938
|
# need to create fresh options
|
3984
3939
|
if create_ops:
|
3985
|
-
# if
|
3940
|
+
# if cols are none it's a row options span
|
3986
3941
|
if span["from_c"] is None:
|
3987
3942
|
new_ops(
|
3988
3943
|
mod_span(
|
@@ -6261,7 +6216,7 @@ class MainTable(tk.Canvas):
|
|
6261
6216
|
return tuple(box.coords for item, box in self.get_selection_items())
|
6262
6217
|
|
6263
6218
|
def get_all_selection_boxes_with_types(self) -> list[tuple[tuple[int, int, int, int], str]]:
|
6264
|
-
return [(box.coords, box.
|
6219
|
+
return [(box.coords, box.type_) for item, box in self.get_selection_items()]
|
6265
6220
|
|
6266
6221
|
def all_selected(self) -> bool:
|
6267
6222
|
return any(
|
@@ -6293,7 +6248,7 @@ class MainTable(tk.Canvas):
|
|
6293
6248
|
box.coords.from_c <= c and box.coords.upto_c > c
|
6294
6249
|
for item, box in self.get_selection_items(
|
6295
6250
|
cells=False,
|
6296
|
-
|
6251
|
+
rows=False,
|
6297
6252
|
)
|
6298
6253
|
)
|
6299
6254
|
|
@@ -129,7 +129,7 @@ class RowIndex(tk.Canvas):
|
|
129
129
|
self.align = kwargs["row_index_align"]
|
130
130
|
self.default_index = kwargs["default_row_index"].lower()
|
131
131
|
|
132
|
-
self.
|
132
|
+
self.tree_reset()
|
133
133
|
self.basic_bindings()
|
134
134
|
|
135
135
|
def basic_bindings(self, enable: bool = True) -> None:
|
@@ -148,7 +148,7 @@ class RowIndex(tk.Canvas):
|
|
148
148
|
self.unbind("<Double-Button-1>")
|
149
149
|
self.unbind(rc_binding)
|
150
150
|
|
151
|
-
def
|
151
|
+
def tree_reset(self) -> None:
|
152
152
|
# treeview mode
|
153
153
|
self.tree = {}
|
154
154
|
self.tree_open_ids = set()
|
@@ -1476,7 +1476,7 @@ class Sheet(tk.Frame):
|
|
1476
1476
|
if sheet_options:
|
1477
1477
|
self.ops = new_sheet_options()
|
1478
1478
|
if tree:
|
1479
|
-
self.RI.
|
1479
|
+
self.RI.tree_reset()
|
1480
1480
|
self.set_refresh_timer(redraw)
|
1481
1481
|
return self
|
1482
1482
|
|
@@ -2998,9 +2998,10 @@ class Sheet(tk.Frame):
|
|
2998
2998
|
|
2999
2999
|
def get_selected_min_max(
|
3000
3000
|
self,
|
3001
|
-
) ->
|
3002
|
-
|
3003
|
-
|
3001
|
+
) -> tuple[int, int, int, int] | tuple[None, None, None, None]:
|
3002
|
+
"""
|
3003
|
+
Returns (min_y, min_x, max_y, max_x) of all selection boxes
|
3004
|
+
"""
|
3004
3005
|
return self.MT.get_selected_min_max()
|
3005
3006
|
|
3006
3007
|
# Modifying Selected Cells
|
@@ -3286,12 +3287,12 @@ class Sheet(tk.Frame):
|
|
3286
3287
|
|
3287
3288
|
def get_column_widths(self, canvas_positions: bool = False) -> list[float]:
|
3288
3289
|
if canvas_positions:
|
3289
|
-
return
|
3290
|
+
return self.MT.col_positions
|
3290
3291
|
return self.MT.get_column_widths()
|
3291
3292
|
|
3292
3293
|
def get_row_heights(self, canvas_positions: bool = False) -> list[float]:
|
3293
3294
|
if canvas_positions:
|
3294
|
-
return
|
3295
|
+
return self.MT.row_positions
|
3295
3296
|
return self.MT.get_row_heights()
|
3296
3297
|
|
3297
3298
|
def set_column_widths(
|
@@ -4391,6 +4392,62 @@ class Sheet(tk.Frame):
|
|
4391
4392
|
)
|
4392
4393
|
return self
|
4393
4394
|
|
4395
|
+
def tree_reset(self) -> Sheet:
|
4396
|
+
self.deselect()
|
4397
|
+
self.RI.tree_reset()
|
4398
|
+
return self
|
4399
|
+
|
4400
|
+
def tree_get_open(self) -> set[str]:
|
4401
|
+
"""
|
4402
|
+
Returns the set[str] of iids that are open in the treeview
|
4403
|
+
"""
|
4404
|
+
return self.RI.tree_open_ids
|
4405
|
+
|
4406
|
+
def tree_set_open(self, open_ids: set[str]) -> Sheet:
|
4407
|
+
"""
|
4408
|
+
Accepts set[str] of iids that are open in the treeview
|
4409
|
+
Closes everything else
|
4410
|
+
"""
|
4411
|
+
self.RI.tree_open_ids = open_ids
|
4412
|
+
self.hide_rows(
|
4413
|
+
set(self.MT.displayed_rows),
|
4414
|
+
redraw=False,
|
4415
|
+
deselect_all=False,
|
4416
|
+
data_indexes=True,
|
4417
|
+
)
|
4418
|
+
self.show_rows(
|
4419
|
+
(self.RI.tree_rns[iid] for iid in self.get_children("")),
|
4420
|
+
redraw=False,
|
4421
|
+
deselect_all=True,
|
4422
|
+
)
|
4423
|
+
if open_ids:
|
4424
|
+
self.tree_open(*open_ids)
|
4425
|
+
return self
|
4426
|
+
|
4427
|
+
def tree_open(self, *items) -> Sheet:
|
4428
|
+
"""
|
4429
|
+
If used without args all items are opened
|
4430
|
+
"""
|
4431
|
+
if items:
|
4432
|
+
for item in unpack(items):
|
4433
|
+
self.item(item, open_=True)
|
4434
|
+
else:
|
4435
|
+
for item in self.get_children():
|
4436
|
+
self.item(item, open_=True)
|
4437
|
+
return self
|
4438
|
+
|
4439
|
+
def tree_close(self, *items) -> Sheet:
|
4440
|
+
"""
|
4441
|
+
If used without args all items are closed
|
4442
|
+
"""
|
4443
|
+
if items:
|
4444
|
+
for item in unpack(items):
|
4445
|
+
self.item(item, open_=False)
|
4446
|
+
else:
|
4447
|
+
for item in self.get_children():
|
4448
|
+
self.item(item, open_=False)
|
4449
|
+
return self
|
4450
|
+
|
4394
4451
|
def insert(
|
4395
4452
|
self,
|
4396
4453
|
parent: str = "",
|
@@ -4460,12 +4517,15 @@ class Sheet(tk.Frame):
|
|
4460
4517
|
text: str | None = None,
|
4461
4518
|
values: list | None = None,
|
4462
4519
|
open_: bool | None = None,
|
4463
|
-
) -> DotDict:
|
4520
|
+
) -> DotDict | Sheet:
|
4521
|
+
"""
|
4522
|
+
Modify options for item
|
4523
|
+
If no options are set then returns DotDict of options for item
|
4524
|
+
Else returns Sheet
|
4525
|
+
"""
|
4464
4526
|
if not (item := item.lower()) or item not in self.RI.tree:
|
4465
4527
|
raise ValueError(f"Item '{item}' does not exist.")
|
4466
4528
|
if isinstance(iid, str):
|
4467
|
-
if not (iid := iid.lower()):
|
4468
|
-
raise ValueError(f"iid '{iid}' does not exist.")
|
4469
4529
|
if iid in self.RI.tree:
|
4470
4530
|
raise ValueError(f"Cannot rename '{iid}', it already exists.")
|
4471
4531
|
iid = iid.lower()
|
@@ -4477,36 +4537,46 @@ class Sheet(tk.Frame):
|
|
4477
4537
|
if isinstance(text, str):
|
4478
4538
|
self.RI.tree[item].text = text
|
4479
4539
|
if isinstance(values, list):
|
4480
|
-
self.set_data(self.RI.tree_rns[item], values)
|
4540
|
+
self.set_data(self.RI.tree_rns[item], data=values)
|
4481
4541
|
if isinstance(open_, bool):
|
4482
|
-
if
|
4542
|
+
if self.RI.tree[item].children:
|
4543
|
+
if open_:
|
4544
|
+
self.RI.tree_open_ids.add(item)
|
4545
|
+
self.show_rows(
|
4546
|
+
(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item, check_open=True)),
|
4547
|
+
redraw=False,
|
4548
|
+
deselect_all=False,
|
4549
|
+
)
|
4550
|
+
else:
|
4551
|
+
self.RI.tree_open_ids.discard(item)
|
4552
|
+
self.hide_rows(
|
4553
|
+
(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item)),
|
4554
|
+
redraw=False,
|
4555
|
+
deselect_all=False,
|
4556
|
+
data_indexes=True,
|
4557
|
+
)
|
4558
|
+
else:
|
4483
4559
|
self.RI.tree_open_ids.discard(item)
|
4484
|
-
|
4485
|
-
|
4486
|
-
|
4487
|
-
|
4488
|
-
|
4489
|
-
|
4490
|
-
|
4491
|
-
|
4492
|
-
|
4493
|
-
(self.RI.tree_rns[did] for did in self.RI.get_iid_descendants(item)),
|
4494
|
-
redraw=False,
|
4495
|
-
deselect_all=False,
|
4496
|
-
data_indexes=True,
|
4497
|
-
)
|
4498
|
-
self.set_refresh_timer(isinstance(text, str) or isinstance(values, list) or isinstance(open_, bool))
|
4499
|
-
return DotDict(
|
4500
|
-
text=self.RI.tree[item].text,
|
4501
|
-
values=self[self.RI.tree_rns[item]].options(ndim=1).data,
|
4502
|
-
open_=item in self.RI.tree_open_ids,
|
4503
|
-
)
|
4560
|
+
get = not (isinstance(iid, str) or isinstance(text, str) or isinstance(values, list) or isinstance(open_, bool))
|
4561
|
+
self.set_refresh_timer(redraw=not get)
|
4562
|
+
if get:
|
4563
|
+
return DotDict(
|
4564
|
+
text=self.RI.tree[item].text,
|
4565
|
+
values=self[self.RI.tree_rns[item]].options(ndim=1).data,
|
4566
|
+
open_=item in self.RI.tree_open_ids,
|
4567
|
+
)
|
4568
|
+
return self
|
4504
4569
|
|
4505
4570
|
def itemrow(self, item: str) -> int:
|
4506
|
-
|
4571
|
+
try:
|
4572
|
+
return self.RI.tree_rns[item.lower()]
|
4573
|
+
except Exception:
|
4574
|
+
raise ValueError(f"item '{item.lower()}' does not exist.")
|
4507
4575
|
|
4508
|
-
def rowitem(self, row: int) -> str | None:
|
4509
|
-
if
|
4576
|
+
def rowitem(self, row: int, data_index: bool = False) -> str | None:
|
4577
|
+
if not data_index:
|
4578
|
+
row = self.data_r(row)
|
4579
|
+
if isinstance(row, int) and len(self.MT._row_index) > row:
|
4510
4580
|
return self.MT._row_index[row].iid
|
4511
4581
|
return None
|
4512
4582
|
|
@@ -4522,11 +4592,6 @@ class Sheet(tk.Frame):
|
|
4522
4592
|
else:
|
4523
4593
|
yield from (n.iid for n in self.RI.tree[item].children)
|
4524
4594
|
|
4525
|
-
def reset_tree(self) -> Sheet:
|
4526
|
-
self.deselect()
|
4527
|
-
self.RI.reset_tree()
|
4528
|
-
return self
|
4529
|
-
|
4530
4595
|
def del_items(self, *items) -> Sheet:
|
4531
4596
|
"""
|
4532
4597
|
Also deletes all descendants of items
|
@@ -4736,7 +4801,7 @@ class Sheet(tk.Frame):
|
|
4736
4801
|
def selection_add(self, *items) -> Sheet:
|
4737
4802
|
for item in unpack(items):
|
4738
4803
|
if (item := item.lower()) not in self.RI.tree:
|
4739
|
-
|
4804
|
+
continue
|
4740
4805
|
if not self.item_displayed(item):
|
4741
4806
|
self.display_item(item)
|
4742
4807
|
self.add_row_selection(bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]))
|
@@ -4745,7 +4810,7 @@ class Sheet(tk.Frame):
|
|
4745
4810
|
def selection_remove(self, *items) -> Sheet:
|
4746
4811
|
for item in unpack(items):
|
4747
4812
|
if (item := item.lower()) not in self.RI.tree:
|
4748
|
-
|
4813
|
+
continue
|
4749
4814
|
try:
|
4750
4815
|
self.deselect(bisect_left(self.MT.displayed_rows, self.RI.tree_rns[item]))
|
4751
4816
|
except Exception:
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|