tksheet 7.2.11__tar.gz → 7.2.13__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.2.11/tksheet.egg-info → tksheet-7.2.13}/PKG-INFO +1 -1
- {tksheet-7.2.11 → tksheet-7.2.13}/pyproject.toml +1 -1
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/__init__.py +2 -1
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/column_headers.py +12 -4
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/functions.py +24 -3
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/main_table.py +21 -2
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/row_index.py +58 -40
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/sheet.py +29 -15
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/sheet_options.py +2 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/text_editor.py +1 -1
- {tksheet-7.2.11 → tksheet-7.2.13/tksheet.egg-info}/PKG-INFO +1 -1
- {tksheet-7.2.11 → tksheet-7.2.13}/LICENSE.txt +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/README.md +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/setup.cfg +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/colors.py +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/formatters.py +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/other_classes.py +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/themes.py +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/top_left_rectangle.py +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/types.py +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet/vars.py +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/tksheet.egg-info/dependency_links.txt +0 -0
- {tksheet-7.2.11 → tksheet-7.2.13}/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.2.
|
9
|
+
version = "7.2.13"
|
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.2.
|
7
|
+
__version__ = "7.2.12"
|
8
8
|
|
9
9
|
from .colors import (
|
10
10
|
color_map,
|
@@ -37,6 +37,7 @@ from .functions import (
|
|
37
37
|
alpha2num,
|
38
38
|
consecutive_chunks,
|
39
39
|
consecutive_ranges,
|
40
|
+
convert_align,
|
40
41
|
data_to_displayed_idxs,
|
41
42
|
displayed_to_data_idxs,
|
42
43
|
dropdown_search_function,
|
@@ -128,7 +128,6 @@ class ColumnHeaders(tk.Canvas):
|
|
128
128
|
self.hidd_checkbox = {}
|
129
129
|
self.hidd_boxes = set()
|
130
130
|
|
131
|
-
self.default_header = kwargs["default_header"].lower()
|
132
131
|
self.align = kwargs["header_align"]
|
133
132
|
self.basic_bindings()
|
134
133
|
|
@@ -599,7 +598,7 @@ class ColumnHeaders(tk.Canvas):
|
|
599
598
|
if need_redraw:
|
600
599
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
|
601
600
|
try_binding(self.extra_b1_motion_func, event)
|
602
|
-
|
601
|
+
|
603
602
|
def drag_height_resize(self) -> None:
|
604
603
|
self.set_height(self.new_col_height, set_TL=True)
|
605
604
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
@@ -2176,7 +2175,16 @@ class ColumnHeaders(tk.Canvas):
|
|
2176
2175
|
)
|
2177
2176
|
edited = False
|
2178
2177
|
if isinstance(self.MT._headers, int):
|
2179
|
-
|
2178
|
+
disprn = self.MT.try_disprn(self.MT._headers)
|
2179
|
+
edited = self.MT.set_cell_data_undo(
|
2180
|
+
r=disprn if isinstance(disprn, int) else 0,
|
2181
|
+
c=c,
|
2182
|
+
datarn=self.MT._headers,
|
2183
|
+
datacn=datacn,
|
2184
|
+
value=value,
|
2185
|
+
undo=True,
|
2186
|
+
cell_resize=isinstance(disprn, int),
|
2187
|
+
)
|
2180
2188
|
else:
|
2181
2189
|
self.fix_header(datacn)
|
2182
2190
|
if not check_input_valid or self.input_valid_for_cell(datacn, value):
|
@@ -2261,7 +2269,7 @@ class ColumnHeaders(tk.Canvas):
|
|
2261
2269
|
except Exception:
|
2262
2270
|
value = ""
|
2263
2271
|
if not value and self.PAR.ops.show_default_header_for_empty:
|
2264
|
-
value = get_n2a(datacn, self.default_header)
|
2272
|
+
value = get_n2a(datacn, self.PAR.ops.default_header)
|
2265
2273
|
return value
|
2266
2274
|
|
2267
2275
|
def get_value_for_empty_cell(self, datacn: int, c_ops: bool = True) -> object:
|
@@ -1,12 +1,14 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
import bisect
|
4
3
|
import csv
|
5
4
|
import io
|
6
5
|
import pickle
|
7
6
|
import re
|
8
7
|
import tkinter as tk
|
9
8
|
import zlib
|
9
|
+
from bisect import (
|
10
|
+
bisect_left,
|
11
|
+
)
|
10
12
|
from collections import deque
|
11
13
|
from collections.abc import (
|
12
14
|
Callable,
|
@@ -35,8 +37,17 @@ unpickle_obj = pickle.loads
|
|
35
37
|
|
36
38
|
|
37
39
|
def get_csv_str_dialect(s: str, delimiters: str) -> csv.Dialect:
|
40
|
+
if len(s) > 6000:
|
41
|
+
try:
|
42
|
+
_upto = next(
|
43
|
+
match.start() + 1 for i, match in enumerate(re.finditer("\n", s), 1) if i == 300 or match.start() > 6000
|
44
|
+
)
|
45
|
+
except Exception:
|
46
|
+
_upto = len(s)
|
47
|
+
else:
|
48
|
+
_upto = len(s)
|
38
49
|
try:
|
39
|
-
return csv.Sniffer().sniff(s[:
|
50
|
+
return csv.Sniffer().sniff(s[:_upto] if len(s) > 6000 else s, delimiters=delimiters)
|
40
51
|
except Exception:
|
41
52
|
return csv.excel_tab
|
42
53
|
|
@@ -208,6 +219,16 @@ def len_to_idx(n: int) -> int:
|
|
208
219
|
return n - 1
|
209
220
|
|
210
221
|
|
222
|
+
def b_index(sorted_seq: Sequence[int], num_to_index: int) -> int:
|
223
|
+
"""
|
224
|
+
Designed to be a faster way of finding the index of an int
|
225
|
+
in a sorted list of ints than list.index()
|
226
|
+
"""
|
227
|
+
if (idx := bisect_left(sorted_seq, num_to_index)) == len(sorted_seq) or sorted_seq[idx] != num_to_index:
|
228
|
+
raise ValueError(f"{num_to_index} is not in Sequence")
|
229
|
+
return idx
|
230
|
+
|
231
|
+
|
211
232
|
def get_dropdown_kwargs(
|
212
233
|
values: list = [],
|
213
234
|
set_value: object = None,
|
@@ -379,7 +400,7 @@ def get_seq_without_gaps_at_index(
|
|
379
400
|
position: int,
|
380
401
|
get_st_end: bool = False,
|
381
402
|
) -> tuple[int, int] | list[int]:
|
382
|
-
start_idx =
|
403
|
+
start_idx = bisect_left(seq, position)
|
383
404
|
forward_gap = get_index_of_gap_in_sorted_integer_seq_forward(seq, start_idx)
|
384
405
|
reverse_gap = get_index_of_gap_in_sorted_integer_seq_reverse(seq, start_idx)
|
385
406
|
if forward_gap is not None:
|
@@ -49,6 +49,7 @@ from .formatters import (
|
|
49
49
|
try_to_bool,
|
50
50
|
)
|
51
51
|
from .functions import (
|
52
|
+
b_index,
|
52
53
|
consecutive_ranges,
|
53
54
|
decompress_load,
|
54
55
|
diff_gen,
|
@@ -6344,7 +6345,7 @@ class MainTable(tk.Canvas):
|
|
6344
6345
|
for r in range(box.coords.from_r, box.coords.upto_r)
|
6345
6346
|
}
|
6346
6347
|
if get_cells_as_rows:
|
6347
|
-
return s | set(
|
6348
|
+
return s | set(map(itemgetter(0), self.gen_selected_cells()))
|
6348
6349
|
return s
|
6349
6350
|
|
6350
6351
|
def get_selected_cols(
|
@@ -6368,7 +6369,7 @@ class MainTable(tk.Canvas):
|
|
6368
6369
|
for c in range(box.coords.from_c, box.coords.upto_c)
|
6369
6370
|
}
|
6370
6371
|
if get_cells_as_cols:
|
6371
|
-
return s | set(
|
6372
|
+
return s | set(map(itemgetter(1), self.gen_selected_cells()))
|
6372
6373
|
return s
|
6373
6374
|
|
6374
6375
|
def get_selected_cells(
|
@@ -7460,3 +7461,21 @@ class MainTable(tk.Canvas):
|
|
7460
7461
|
|
7461
7462
|
def datarn(self, r: int) -> int:
|
7462
7463
|
return r if self.all_rows_displayed else self.displayed_rows[r]
|
7464
|
+
|
7465
|
+
def dispcn(self, datacn: int) -> int:
|
7466
|
+
return datacn if self.all_columns_displayed else b_index(self.displayed_columns, datacn)
|
7467
|
+
|
7468
|
+
def try_dispcn(self, datacn: int) -> int | None:
|
7469
|
+
try:
|
7470
|
+
return self.dispcn(datacn)
|
7471
|
+
except Exception:
|
7472
|
+
return None
|
7473
|
+
|
7474
|
+
def disprn(self, datarn: int) -> int:
|
7475
|
+
return datarn if self.all_rows_displayed else b_index(self.displayed_rows, datarn)
|
7476
|
+
|
7477
|
+
def try_disprn(self, datarn: int) -> int | None:
|
7478
|
+
try:
|
7479
|
+
return self.disprn(datarn)
|
7480
|
+
except Exception:
|
7481
|
+
return None
|
@@ -140,7 +140,6 @@ class RowIndex(tk.Canvas):
|
|
140
140
|
self.hidd_boxes = set()
|
141
141
|
|
142
142
|
self.align = kwargs["row_index_align"]
|
143
|
-
self.default_index = kwargs["default_row_index"].lower()
|
144
143
|
|
145
144
|
self.tree_reset()
|
146
145
|
self.basic_bindings()
|
@@ -780,7 +779,7 @@ class RowIndex(tk.Canvas):
|
|
780
779
|
and self.get_cell_kwargs(datarn, key="checkbox")
|
781
780
|
and event.x < self.MT.index_txt_height + 4
|
782
781
|
)
|
783
|
-
|
782
|
+
|
784
783
|
def drag_width_resize(self) -> None:
|
785
784
|
self.set_width(self.new_row_width, set_TL=True)
|
786
785
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
@@ -1200,11 +1199,11 @@ class RowIndex(tk.Canvas):
|
|
1200
1199
|
|
1201
1200
|
def auto_set_index_width(self, end_row: int, only_rows: list) -> bool:
|
1202
1201
|
if not isinstance(self.MT._row_index, int) and not self.MT._row_index:
|
1203
|
-
if self.
|
1202
|
+
if self.PAR.ops.default_row_index == "letters":
|
1204
1203
|
new_w = self.MT.get_txt_w(f"{num2alpha(end_row)}") + 20
|
1205
|
-
elif self.
|
1204
|
+
elif self.PAR.ops.default_row_index == "numbers":
|
1206
1205
|
new_w = self.MT.get_txt_w(f"{end_row}") + 20
|
1207
|
-
elif self.
|
1206
|
+
elif self.PAR.ops.default_row_index == "both":
|
1208
1207
|
new_w = self.MT.get_txt_w(f"{end_row + 1} {num2alpha(end_row)}") + 20
|
1209
1208
|
elif self.PAR.ops.auto_resize_row_index is True:
|
1210
1209
|
new_w = self.get_index_text_width(only_rows=only_rows)
|
@@ -1336,33 +1335,44 @@ class RowIndex(tk.Canvas):
|
|
1336
1335
|
fill: str,
|
1337
1336
|
tag: str | tuple[str],
|
1338
1337
|
indent: float,
|
1338
|
+
has_children: bool = False,
|
1339
1339
|
open_: bool = False,
|
1340
1340
|
) -> None:
|
1341
1341
|
mod = (self.MT.index_txt_height - 1) if self.MT.index_txt_height % 2 else self.MT.index_txt_height
|
1342
1342
|
small_mod = int(mod / 5)
|
1343
1343
|
mid_y = floor(self.MT.min_row_height / 2)
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1344
|
+
if has_children:
|
1345
|
+
# up arrow
|
1346
|
+
if open_:
|
1347
|
+
points = (
|
1348
|
+
# the left hand downward point
|
1349
|
+
x1 + 5 + indent,
|
1350
|
+
y1 + mid_y + small_mod,
|
1351
|
+
# the middle upward point
|
1352
|
+
x1 + 5 + indent + small_mod + small_mod,
|
1353
|
+
y1 + mid_y - small_mod,
|
1354
|
+
# the right hand downward point
|
1355
|
+
x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
|
1356
|
+
y1 + mid_y + small_mod,
|
1357
|
+
)
|
1358
|
+
# right pointing arrow
|
1359
|
+
else:
|
1360
|
+
points = (
|
1361
|
+
# the upper point
|
1362
|
+
x1 + 5 + indent + small_mod + small_mod,
|
1363
|
+
y1 + mid_y - small_mod - small_mod,
|
1364
|
+
# the middle point
|
1365
|
+
x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
|
1366
|
+
y1 + mid_y,
|
1367
|
+
# the bottom point
|
1368
|
+
x1 + 5 + indent + small_mod + small_mod,
|
1369
|
+
y1 + mid_y + small_mod + small_mod,
|
1370
|
+
)
|
1358
1371
|
else:
|
1359
1372
|
points = (
|
1360
1373
|
# the upper point
|
1361
1374
|
x1 + 5 + indent + small_mod + small_mod,
|
1362
1375
|
y1 + mid_y - small_mod - small_mod,
|
1363
|
-
# the middle point
|
1364
|
-
x1 + 5 + indent + small_mod + small_mod + small_mod + small_mod,
|
1365
|
-
y1 + mid_y,
|
1366
1376
|
# the bottom point
|
1367
1377
|
x1 + 5 + indent + small_mod + small_mod,
|
1368
1378
|
y1 + mid_y + small_mod + small_mod,
|
@@ -1371,14 +1381,14 @@ class RowIndex(tk.Canvas):
|
|
1371
1381
|
t, sh = self.hidd_tree_arrow.popitem()
|
1372
1382
|
self.coords(t, points)
|
1373
1383
|
if sh:
|
1374
|
-
self.itemconfig(t, fill=fill)
|
1384
|
+
self.itemconfig(t, fill=fill if has_children else self.PAR.ops.index_grid_fg)
|
1375
1385
|
else:
|
1376
|
-
self.itemconfig(t, fill=fill, tag=tag, state="normal")
|
1386
|
+
self.itemconfig(t, fill=fill if has_children else self.PAR.ops.index_grid_fg, tag=tag, state="normal")
|
1377
1387
|
self.lift(t)
|
1378
1388
|
else:
|
1379
1389
|
t = self.create_line(
|
1380
1390
|
points,
|
1381
|
-
fill=fill,
|
1391
|
+
fill=fill if has_children else self.PAR.ops.index_grid_fg,
|
1382
1392
|
tag=tag,
|
1383
1393
|
width=2,
|
1384
1394
|
capstyle=tk.ROUND,
|
@@ -1689,16 +1699,16 @@ class RowIndex(tk.Canvas):
|
|
1689
1699
|
draw_x += self.MT.index_txt_height + 3
|
1690
1700
|
indent = self.get_treeview_indent(iid)
|
1691
1701
|
draw_x += indent + 5
|
1692
|
-
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
1701
|
-
|
1702
|
+
self.redraw_tree_arrow(
|
1703
|
+
2,
|
1704
|
+
rtopgridln,
|
1705
|
+
r=r,
|
1706
|
+
fill=tree_arrow_fg,
|
1707
|
+
tag="ta",
|
1708
|
+
indent=indent,
|
1709
|
+
has_children=bool(self.tree[iid].children),
|
1710
|
+
open_=self.MT._row_index[datarn].iid in self.tree_open_ids,
|
1711
|
+
)
|
1702
1712
|
lns = self.get_valid_cell_data_as_str(datarn, fix=False)
|
1703
1713
|
if not lns:
|
1704
1714
|
continue
|
@@ -2296,7 +2306,16 @@ class RowIndex(tk.Canvas):
|
|
2296
2306
|
)
|
2297
2307
|
edited = False
|
2298
2308
|
if isinstance(self.MT._row_index, int):
|
2299
|
-
|
2309
|
+
dispcn = self.MT.try_dispcn(self.MT._row_index)
|
2310
|
+
edited = self.MT.set_cell_data_undo(
|
2311
|
+
r=r,
|
2312
|
+
c=dispcn if isinstance(dispcn, int) else 0,
|
2313
|
+
datarn=datarn,
|
2314
|
+
datacn=self.MT._row_index,
|
2315
|
+
value=value,
|
2316
|
+
undo=True,
|
2317
|
+
cell_resize=isinstance(dispcn, int),
|
2318
|
+
)
|
2300
2319
|
else:
|
2301
2320
|
self.fix_index(datarn)
|
2302
2321
|
if not check_input_valid or self.input_valid_for_cell(datarn, value):
|
@@ -2379,7 +2398,7 @@ class RowIndex(tk.Canvas):
|
|
2379
2398
|
except Exception:
|
2380
2399
|
value = ""
|
2381
2400
|
if not value and self.PAR.ops.show_default_index_for_empty:
|
2382
|
-
value = get_n2a(datarn, self.
|
2401
|
+
value = get_n2a(datarn, self.PAR.ops.default_row_index)
|
2383
2402
|
return value
|
2384
2403
|
|
2385
2404
|
def get_value_for_empty_cell(self, datarn: int, r_ops: bool = True) -> object:
|
@@ -2431,7 +2450,7 @@ class RowIndex(tk.Canvas):
|
|
2431
2450
|
elif isinstance(self.MT._row_index, int):
|
2432
2451
|
value = (
|
2433
2452
|
not self.MT.data[datarn][self.MT._row_index]
|
2434
|
-
if
|
2453
|
+
if isinstance(self.MT.data[datarn][self.MT._row_index], bool)
|
2435
2454
|
else False
|
2436
2455
|
)
|
2437
2456
|
else:
|
@@ -2476,8 +2495,7 @@ class RowIndex(tk.Canvas):
|
|
2476
2495
|
if iid not in self.tree_open_ids:
|
2477
2496
|
return False
|
2478
2497
|
return True
|
2479
|
-
|
2480
|
-
return all(iid in self.tree_open_ids for iid in self.get_iid_ancestors(iid))
|
2498
|
+
return all(map(self.tree_open_ids.__contains__, self.get_iid_ancestors(iid)))
|
2481
2499
|
|
2482
2500
|
def get_iid_ancestors(self, iid: str) -> Generator[str]:
|
2483
2501
|
if self.tree[iid].parent:
|
@@ -339,11 +339,9 @@ class Sheet(tk.Frame):
|
|
339
339
|
row_index_align=(
|
340
340
|
convert_align(row_index_align) if row_index_align is not None else convert_align(index_align)
|
341
341
|
),
|
342
|
-
default_row_index=default_row_index,
|
343
342
|
)
|
344
343
|
self.CH = ColumnHeaders(
|
345
344
|
parent=self,
|
346
|
-
default_header=default_header,
|
347
345
|
header_align=convert_align(header_align),
|
348
346
|
)
|
349
347
|
self.MT = MainTable(
|
@@ -1502,6 +1500,8 @@ class Sheet(tk.Frame):
|
|
1502
1500
|
if displayed_rows:
|
1503
1501
|
self.MT.displayed_rows = []
|
1504
1502
|
self.MT.all_rows_displayed = True
|
1503
|
+
if selections:
|
1504
|
+
self.MT.deselect(redraw=False)
|
1505
1505
|
if row_heights:
|
1506
1506
|
self.MT.saved_row_heights = {}
|
1507
1507
|
self.MT.set_row_positions([])
|
@@ -1514,8 +1514,6 @@ class Sheet(tk.Frame):
|
|
1514
1514
|
self.MT.reset_tags()
|
1515
1515
|
if undo_stack:
|
1516
1516
|
self.reset_undos()
|
1517
|
-
if selections:
|
1518
|
-
self.MT.deselect(redraw=False)
|
1519
1517
|
if sheet_options:
|
1520
1518
|
self.ops = new_sheet_options()
|
1521
1519
|
self.change_theme(redraw=False)
|
@@ -1556,7 +1554,7 @@ class Sheet(tk.Frame):
|
|
1556
1554
|
@data.setter
|
1557
1555
|
def data(self, value: list[list[object]]) -> None:
|
1558
1556
|
self.data_reference(value)
|
1559
|
-
|
1557
|
+
|
1560
1558
|
def new_tksheet_event(self) -> EventDataDict:
|
1561
1559
|
return event_dict(
|
1562
1560
|
name="",
|
@@ -2924,7 +2922,7 @@ class Sheet(tk.Frame):
|
|
2924
2922
|
|
2925
2923
|
def table_align(
|
2926
2924
|
self,
|
2927
|
-
align: str = None,
|
2925
|
+
align: str | None = None,
|
2928
2926
|
redraw: bool = True,
|
2929
2927
|
) -> str | Sheet:
|
2930
2928
|
if align is None:
|
@@ -2937,7 +2935,7 @@ class Sheet(tk.Frame):
|
|
2937
2935
|
|
2938
2936
|
def header_align(
|
2939
2937
|
self,
|
2940
|
-
align: str = None,
|
2938
|
+
align: str | None = None,
|
2941
2939
|
redraw: bool = True,
|
2942
2940
|
) -> str | Sheet:
|
2943
2941
|
if align is None:
|
@@ -2950,7 +2948,7 @@ class Sheet(tk.Frame):
|
|
2950
2948
|
|
2951
2949
|
def row_index_align(
|
2952
2950
|
self,
|
2953
|
-
align: str = None,
|
2951
|
+
align: str | None = None,
|
2954
2952
|
redraw: bool = True,
|
2955
2953
|
) -> str | Sheet:
|
2956
2954
|
if align is None:
|
@@ -3461,6 +3459,17 @@ class Sheet(tk.Frame):
|
|
3461
3459
|
return self.MT.row_positions
|
3462
3460
|
return self.MT.get_row_heights()
|
3463
3461
|
|
3462
|
+
def get_safe_row_heights(self) -> list[int]:
|
3463
|
+
default_h = self.MT.get_default_row_height()
|
3464
|
+
return [0 if e == default_h else e for e in self.MT.gen_row_heights()]
|
3465
|
+
|
3466
|
+
def set_safe_row_heights(self, heights: list[int]) -> Sheet:
|
3467
|
+
default_h = self.MT.get_default_row_height()
|
3468
|
+
self.MT.row_positions = list(
|
3469
|
+
accumulate(chain([0], (self.valid_row_height(e) if e else default_h for e in heights)))
|
3470
|
+
)
|
3471
|
+
return self
|
3472
|
+
|
3464
3473
|
def get_row_text_height(
|
3465
3474
|
self,
|
3466
3475
|
row: int,
|
@@ -3823,8 +3832,14 @@ class Sheet(tk.Frame):
|
|
3823
3832
|
return c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
|
3824
3833
|
|
3825
3834
|
data_c = displayed_column_to_data
|
3835
|
+
datacn = displayed_column_to_data
|
3826
3836
|
dcol = displayed_column_to_data
|
3827
3837
|
|
3838
|
+
def data_column_to_displayed(self, c: int) -> int:
|
3839
|
+
return self.MT.dispcn(c)
|
3840
|
+
|
3841
|
+
dispcn = data_column_to_displayed
|
3842
|
+
|
3828
3843
|
def display_columns(
|
3829
3844
|
self,
|
3830
3845
|
columns: None | Literal["all"] | Iterator[int] = None,
|
@@ -3951,8 +3966,14 @@ class Sheet(tk.Frame):
|
|
3951
3966
|
return r if self.MT.all_rows_displayed else self.MT.displayed_rows[r]
|
3952
3967
|
|
3953
3968
|
data_r = displayed_row_to_data
|
3969
|
+
datarn = displayed_row_to_data
|
3954
3970
|
drow = displayed_row_to_data
|
3955
3971
|
|
3972
|
+
def data_row_to_displayed(self, r: int) -> int:
|
3973
|
+
return self.MT.disprn(r)
|
3974
|
+
|
3975
|
+
disprn = data_row_to_displayed
|
3976
|
+
|
3956
3977
|
def display_rows(
|
3957
3978
|
self,
|
3958
3979
|
rows: None | Literal["all"] | Iterator[int] = None,
|
@@ -4297,10 +4318,6 @@ class Sheet(tk.Frame):
|
|
4297
4318
|
)
|
4298
4319
|
if "default_row_height" in kwargs:
|
4299
4320
|
self.default_row_height(kwargs["default_row_height"])
|
4300
|
-
if "default_header" in kwargs:
|
4301
|
-
self.CH.default_header = kwargs["default_header"].lower()
|
4302
|
-
if "default_row_index" in kwargs:
|
4303
|
-
self.RI.default_index = kwargs["default_row_index"].lower()
|
4304
4321
|
if "max_column_width" in kwargs:
|
4305
4322
|
self.MT.max_column_width = float(kwargs["max_column_width"])
|
4306
4323
|
if "max_row_height" in kwargs:
|
@@ -6675,9 +6692,6 @@ class Sheet(tk.Frame):
|
|
6675
6692
|
if self.RI.get_cell_kwargs(r, key="dropdown"):
|
6676
6693
|
return self.MT._row_index[r]
|
6677
6694
|
|
6678
|
-
def delete_all_formatting(self, clear_values: bool = False) -> None:
|
6679
|
-
self.MT.delete_all_formatting(clear_values=clear_values)
|
6680
|
-
|
6681
6695
|
def format_cell(
|
6682
6696
|
self,
|
6683
6697
|
r: int | Literal["all"],
|
@@ -217,6 +217,8 @@ def new_sheet_options() -> DotDict:
|
|
217
217
|
"default_row_height": "1",
|
218
218
|
"default_column_width": 120,
|
219
219
|
"default_row_index_width": 70,
|
220
|
+
"default_row_index": "numbers",
|
221
|
+
"default_header": "letters",
|
220
222
|
"page_up_down_select_row": True,
|
221
223
|
"paste_can_expand_x": False,
|
222
224
|
"paste_can_expand_y": False,
|
@@ -63,7 +63,7 @@ class TextEditorTkText(tk.Text):
|
|
63
63
|
state=state,
|
64
64
|
)
|
65
65
|
self.align = align
|
66
|
-
self.rc_popup_menu.delete(0,
|
66
|
+
self.rc_popup_menu.delete(0, "end")
|
67
67
|
self.rc_popup_menu.add_command(
|
68
68
|
label=sheet_ops.select_all_label,
|
69
69
|
accelerator=sheet_ops.select_all_accelerator,
|
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
|