tksheet 7.4.0__py3-none-any.whl → 7.4.2__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 +1 -1
- tksheet/column_headers.py +3 -3
- tksheet/main_table.py +40 -28
- tksheet/row_index.py +3 -3
- tksheet/sorting.py +93 -127
- {tksheet-7.4.0.dist-info → tksheet-7.4.2.dist-info}/METADATA +2 -5
- {tksheet-7.4.0.dist-info → tksheet-7.4.2.dist-info}/RECORD +10 -10
- {tksheet-7.4.0.dist-info → tksheet-7.4.2.dist-info}/LICENSE.txt +0 -0
- {tksheet-7.4.0.dist-info → tksheet-7.4.2.dist-info}/WHEEL +0 -0
- {tksheet-7.4.0.dist-info → tksheet-7.4.2.dist-info}/top_level.txt +0 -0
tksheet/__init__.py
CHANGED
tksheet/column_headers.py
CHANGED
@@ -915,14 +915,14 @@ class ColumnHeaders(tk.Canvas):
|
|
915
915
|
key: Callable | None = None,
|
916
916
|
undo: bool = True,
|
917
917
|
) -> EventDataDict:
|
918
|
-
event_data = self.MT.new_event_dict("
|
918
|
+
event_data = self.MT.new_event_dict("move_rows", state=True)
|
919
919
|
if not self.MT.data:
|
920
920
|
return event_data
|
921
921
|
if column is None:
|
922
922
|
if not self.MT.selected:
|
923
923
|
return event_data
|
924
924
|
column = self.MT.selected.column
|
925
|
-
if try_binding(self.ch_extra_begin_sort_rows_func, event_data, "
|
925
|
+
if try_binding(self.ch_extra_begin_sort_rows_func, event_data, "begin_move_rows"):
|
926
926
|
disp_new_idxs, disp_row_ctr = {}, 0
|
927
927
|
if self.ops.treeview:
|
928
928
|
new_nodes_order, data_new_idxs = sort_tree_view(
|
@@ -973,7 +973,7 @@ class ColumnHeaders(tk.Canvas):
|
|
973
973
|
}
|
974
974
|
if undo and self.MT.undo_enabled:
|
975
975
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
976
|
-
try_binding(self.ch_extra_end_sort_rows_func, event_data, "
|
976
|
+
try_binding(self.ch_extra_end_sort_rows_func, event_data, "end_move_rows")
|
977
977
|
self.MT.sheet_modified(event_data)
|
978
978
|
self.PAR.emit_event("<<SheetModified>>", event_data)
|
979
979
|
self.MT.refresh()
|
tksheet/main_table.py
CHANGED
@@ -275,31 +275,21 @@ class MainTable(tk.Canvas):
|
|
275
275
|
self.all_columns_displayed = True
|
276
276
|
self.all_rows_displayed = True
|
277
277
|
self.align = kwargs["align"]
|
278
|
-
|
279
|
-
self.PAR.ops.table_font = [
|
278
|
+
self.PAR.ops.table_font = FontTuple(
|
280
279
|
self.PAR.ops.table_font[0],
|
281
|
-
int(self.PAR.ops.table_font[1] * kwargs["zoom"] / 100),
|
280
|
+
max(1, int(self.PAR.ops.table_font[1] * kwargs["zoom"] / 100)),
|
282
281
|
self.PAR.ops.table_font[2],
|
283
|
-
|
284
|
-
|
285
|
-
self.PAR.ops.index_font = [
|
282
|
+
)
|
283
|
+
self.PAR.ops.index_font = FontTuple(
|
286
284
|
self.PAR.ops.index_font[0],
|
287
|
-
int(self.PAR.ops.index_font[1] * kwargs["zoom"] / 100),
|
285
|
+
max(1, int(self.PAR.ops.index_font[1] * kwargs["zoom"] / 100)),
|
288
286
|
self.PAR.ops.index_font[2],
|
289
|
-
|
290
|
-
|
291
|
-
self.PAR.ops.header_font = [
|
287
|
+
)
|
288
|
+
self.PAR.ops.header_font = FontTuple(
|
292
289
|
self.PAR.ops.header_font[0],
|
293
|
-
int(self.PAR.ops.header_font[1] * kwargs["zoom"] / 100),
|
290
|
+
max(1, int(self.PAR.ops.header_font[1] * kwargs["zoom"] / 100)),
|
294
291
|
self.PAR.ops.header_font[2],
|
295
|
-
|
296
|
-
for fnt in (self.PAR.ops.table_font, self.PAR.ops.index_font, self.PAR.ops.header_font):
|
297
|
-
if fnt[1] < 1:
|
298
|
-
fnt[1] = 1
|
299
|
-
self.PAR.ops.table_font = FontTuple(*self.PAR.ops.table_font)
|
300
|
-
self.PAR.ops.index_font = FontTuple(*self.PAR.ops.index_font)
|
301
|
-
self.PAR.ops.header_font = FontTuple(*self.PAR.ops.header_font)
|
302
|
-
|
292
|
+
)
|
303
293
|
self.txt_measure_canvas = tk.Canvas(self)
|
304
294
|
self.txt_measure_canvas_text = self.txt_measure_canvas.create_text(0, 0, text="", font=self.PAR.ops.table_font)
|
305
295
|
|
@@ -1155,7 +1145,7 @@ class MainTable(tk.Canvas):
|
|
1155
1145
|
if ctr:
|
1156
1146
|
event_data = self.add_rows(
|
1157
1147
|
rows=rows,
|
1158
|
-
index=index,
|
1148
|
+
index=index if isinstance(self._row_index, list) and self._row_index else {},
|
1159
1149
|
row_heights=row_heights,
|
1160
1150
|
event_data=event_data,
|
1161
1151
|
mod_event_boxes=False,
|
@@ -1205,7 +1195,7 @@ class MainTable(tk.Canvas):
|
|
1205
1195
|
if ctr:
|
1206
1196
|
event_data = self.add_columns(
|
1207
1197
|
columns=columns,
|
1208
|
-
header=headers,
|
1198
|
+
header=headers if isinstance(self._headers, list) and self._headers else {},
|
1209
1199
|
column_widths=column_widths,
|
1210
1200
|
event_data=event_data,
|
1211
1201
|
mod_event_boxes=False,
|
@@ -5009,8 +4999,11 @@ class MainTable(tk.Canvas):
|
|
5009
4999
|
event_data = self.new_event_dict("add_columns", state=True)
|
5010
5000
|
if not try_binding(self.extra_begin_insert_cols_rc_func, event_data, "begin_add_columns"):
|
5011
5001
|
return
|
5002
|
+
columns, headers, widths = self.get_args_for_add_columns(data_ins_col, displayed_ins_col, numcols)
|
5012
5003
|
event_data = self.add_columns(
|
5013
|
-
|
5004
|
+
columns=columns,
|
5005
|
+
header=headers if isinstance(self._headers, list) and self._headers else {},
|
5006
|
+
column_widths=widths,
|
5014
5007
|
event_data=event_data,
|
5015
5008
|
)
|
5016
5009
|
if self.undo_enabled:
|
@@ -5138,8 +5131,11 @@ class MainTable(tk.Canvas):
|
|
5138
5131
|
event_data = self.new_event_dict("add_rows", state=True)
|
5139
5132
|
if not try_binding(self.extra_begin_insert_rows_rc_func, event_data, "begin_add_rows"):
|
5140
5133
|
return
|
5134
|
+
rows, index, heights = self.get_args_for_add_rows(data_ins_row, displayed_ins_row, numrows)
|
5141
5135
|
event_data = self.add_rows(
|
5142
|
-
|
5136
|
+
rows=rows,
|
5137
|
+
index=index if isinstance(self._row_index, list) and self._row_index else {},
|
5138
|
+
row_heights=heights,
|
5143
5139
|
event_data=event_data,
|
5144
5140
|
)
|
5145
5141
|
if self.undo_enabled:
|
@@ -5346,12 +5342,22 @@ class MainTable(tk.Canvas):
|
|
5346
5342
|
return event_data
|
5347
5343
|
if not ext and not try_binding(self.extra_begin_del_cols_rc_func, event_data, "begin_delete_columns"):
|
5348
5344
|
return
|
5345
|
+
if self.all_columns_displayed:
|
5346
|
+
data_columns = columns
|
5347
|
+
disp_columns = columns
|
5348
|
+
else:
|
5349
|
+
if data_indexes:
|
5350
|
+
data_columns = columns
|
5351
|
+
disp_columns = data_to_displayed_idxs(data_columns, self.displayed_columns)
|
5352
|
+
else:
|
5353
|
+
data_columns = [self.displayed_columns[c] for c in columns]
|
5354
|
+
disp_columns = columns
|
5349
5355
|
event_data = self.delete_columns_displayed(
|
5350
|
-
|
5356
|
+
disp_columns,
|
5351
5357
|
event_data,
|
5352
5358
|
)
|
5353
5359
|
event_data = self.delete_columns_data(
|
5354
|
-
|
5360
|
+
data_columns,
|
5355
5361
|
event_data,
|
5356
5362
|
)
|
5357
5363
|
if undo and self.undo_enabled:
|
@@ -5425,10 +5431,16 @@ class MainTable(tk.Canvas):
|
|
5425
5431
|
return
|
5426
5432
|
if not ext and not try_binding(self.extra_begin_del_rows_rc_func, event_data, "begin_delete_rows"):
|
5427
5433
|
return
|
5428
|
-
if
|
5434
|
+
if self.all_rows_displayed:
|
5429
5435
|
data_rows = rows
|
5436
|
+
disp_rows = rows
|
5430
5437
|
else:
|
5431
|
-
|
5438
|
+
if data_indexes:
|
5439
|
+
data_rows = rows
|
5440
|
+
disp_rows = data_to_displayed_idxs(data_rows, self.displayed_rows)
|
5441
|
+
else:
|
5442
|
+
data_rows = [self.displayed_rows[r] for r in rows]
|
5443
|
+
disp_rows = rows
|
5432
5444
|
if self.PAR.ops.treeview:
|
5433
5445
|
data_rows = sorted(
|
5434
5446
|
chain(
|
@@ -5441,7 +5453,7 @@ class MainTable(tk.Canvas):
|
|
5441
5453
|
)
|
5442
5454
|
)
|
5443
5455
|
event_data = self.delete_rows_displayed(
|
5444
|
-
|
5456
|
+
disp_rows,
|
5445
5457
|
event_data,
|
5446
5458
|
)
|
5447
5459
|
event_data = self.delete_rows_data(
|
tksheet/row_index.py
CHANGED
@@ -936,14 +936,14 @@ class RowIndex(tk.Canvas):
|
|
936
936
|
key: Callable | None = None,
|
937
937
|
undo: bool = True,
|
938
938
|
) -> EventDataDict:
|
939
|
-
event_data = self.MT.new_event_dict("
|
939
|
+
event_data = self.MT.new_event_dict("move_columns", state=True)
|
940
940
|
if not self.MT.data:
|
941
941
|
return event_data
|
942
942
|
if row is None:
|
943
943
|
if not self.MT.selected:
|
944
944
|
return event_data
|
945
945
|
row = self.MT.selected.row
|
946
|
-
if try_binding(self.ri_extra_begin_sort_cols_func, event_data, "
|
946
|
+
if try_binding(self.ri_extra_begin_sort_cols_func, event_data, "begin_move_columns"):
|
947
947
|
sorted_indices, data_new_idxs = sort_columns_by_row(self.MT.data, row=row, reverse=reverse, key=key)
|
948
948
|
disp_new_idxs = {}
|
949
949
|
if self.MT.all_columns_displayed:
|
@@ -970,7 +970,7 @@ class RowIndex(tk.Canvas):
|
|
970
970
|
}
|
971
971
|
if undo and self.MT.undo_enabled:
|
972
972
|
self.MT.undo_stack.append(stored_event_dict(event_data))
|
973
|
-
try_binding(self.ri_extra_end_sort_cols_func, event_data, "
|
973
|
+
try_binding(self.ri_extra_end_sort_cols_func, event_data, "end_move_columns")
|
974
974
|
self.MT.sheet_modified(event_data)
|
975
975
|
self.PAR.emit_event("<<SheetModified>>", event_data)
|
976
976
|
self.MT.refresh()
|
tksheet/sorting.py
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
import
|
4
|
-
import unittest
|
5
|
-
from collections.abc import Callable, Generator
|
3
|
+
from collections.abc import Callable, Generator, Iterable, Iterator
|
6
4
|
from datetime import datetime
|
5
|
+
from pathlib import Path
|
6
|
+
from re import finditer
|
7
7
|
|
8
|
-
|
9
|
-
from .tksheet_types import AnyIter
|
8
|
+
AnyIter = Iterable | Iterator
|
10
9
|
|
11
10
|
# Possible date formats to try for the entire string
|
12
11
|
date_formats = [
|
@@ -46,61 +45,73 @@ date_formats = [
|
|
46
45
|
]
|
47
46
|
|
48
47
|
|
49
|
-
def natural_sort_key(
|
48
|
+
def natural_sort_key(
|
49
|
+
item: object,
|
50
|
+
) -> tuple[int, ...]:
|
50
51
|
"""
|
51
|
-
A key
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
A tuple or value that can be used for sorting.
|
52
|
+
A key for natural sorting of various Python types.
|
53
|
+
|
54
|
+
This function returns a tuple where the first element is an integer
|
55
|
+
ranking the type, followed by type-specific comparison values.
|
56
|
+
|
57
|
+
1. None
|
58
|
+
2. bool
|
59
|
+
3. int, float
|
60
|
+
4. datetime
|
61
|
+
5. filepaths
|
62
|
+
6. empty strings
|
63
|
+
7. strings
|
64
|
+
8. unknown objects with __str__ method
|
65
|
+
9. unknown objects
|
66
|
+
|
67
|
+
:param item: Any Python object to be sorted.
|
68
|
+
:return: A tuple for sorting, with type indicator and comparison values.
|
69
69
|
"""
|
70
70
|
if item is None:
|
71
|
-
return (0,
|
71
|
+
return (0,)
|
72
72
|
|
73
73
|
elif isinstance(item, bool):
|
74
74
|
return (1, item)
|
75
75
|
|
76
76
|
elif isinstance(item, (int, float)):
|
77
|
-
return (2,
|
77
|
+
return (2, item)
|
78
78
|
|
79
79
|
elif isinstance(item, datetime):
|
80
80
|
return (3, item.timestamp())
|
81
81
|
|
82
|
+
elif isinstance(item, Path):
|
83
|
+
return (4, item.as_posix())
|
84
|
+
|
82
85
|
elif isinstance(item, str):
|
83
|
-
|
84
|
-
|
86
|
+
if not item:
|
87
|
+
return (5, item)
|
88
|
+
|
89
|
+
else:
|
90
|
+
for date_format in date_formats:
|
91
|
+
try:
|
92
|
+
return (3, datetime.strptime(item, date_format).timestamp())
|
93
|
+
except ValueError:
|
94
|
+
continue
|
95
|
+
|
85
96
|
try:
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
continue
|
97
|
+
return (2, float(item))
|
98
|
+
except Exception:
|
99
|
+
pass
|
90
100
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
return (5, tuple(int(text) if text.isdigit() else text.lower() for text in re.split(r"(\d+)", item)))
|
101
|
+
if "/" in item or "\\" in item:
|
102
|
+
try:
|
103
|
+
return (4, Path(item).as_posix())
|
104
|
+
except Exception:
|
105
|
+
pass
|
97
106
|
|
107
|
+
return (6, item.lower(), tuple(int(match.group()) for match in finditer(r"\d+", item)))
|
108
|
+
|
109
|
+
# For unknown types, attempt to convert to string, or place at end
|
98
110
|
else:
|
99
|
-
# For unknown types, attempt to convert to string, or place at end
|
100
111
|
try:
|
101
|
-
return (
|
112
|
+
return (7, f"{item}".lower())
|
102
113
|
except Exception:
|
103
|
-
return (
|
114
|
+
return (8, item)
|
104
115
|
|
105
116
|
|
106
117
|
def sort_selection(
|
@@ -233,11 +244,11 @@ def sort_columns_by_row(
|
|
233
244
|
|
234
245
|
|
235
246
|
def _sort_node_children(
|
236
|
-
node:
|
237
|
-
tree: dict[str,
|
247
|
+
node: object,
|
248
|
+
tree: dict[str, object],
|
238
249
|
reverse: bool,
|
239
250
|
key: Callable,
|
240
|
-
) -> Generator[
|
251
|
+
) -> Generator[object, None, None]:
|
241
252
|
sorted_children = sorted(
|
242
253
|
(tree[child_iid] for child_iid in node.children if child_iid in tree),
|
243
254
|
key=lambda child: key(child.text),
|
@@ -250,12 +261,12 @@ def _sort_node_children(
|
|
250
261
|
|
251
262
|
|
252
263
|
def sort_tree_view(
|
253
|
-
_row_index: list[
|
264
|
+
_row_index: list[object],
|
254
265
|
tree_rns: dict[str, int],
|
255
|
-
tree: dict[str,
|
266
|
+
tree: dict[str, object],
|
256
267
|
key: Callable = natural_sort_key,
|
257
268
|
reverse: bool = False,
|
258
|
-
) -> tuple[list[
|
269
|
+
) -> tuple[list[object], dict[int, int]]:
|
259
270
|
if not _row_index or not tree_rns or not tree:
|
260
271
|
return [], {}
|
261
272
|
|
@@ -287,83 +298,38 @@ def sort_tree_view(
|
|
287
298
|
return sorted_nodes, mapping
|
288
299
|
|
289
300
|
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
# Here we use a custom class for testing unknown types
|
326
|
-
class Unknown:
|
327
|
-
pass
|
328
|
-
|
329
|
-
unknown = Unknown()
|
330
|
-
self.assertEqual(natural_sort_key(unknown)[0], 5) # Success case, string conversion works
|
331
|
-
|
332
|
-
def test_unknown_types_failure(self):
|
333
|
-
# Create an object where string conversion fails
|
334
|
-
class Unconvertible:
|
335
|
-
def __str__(self):
|
336
|
-
raise Exception("String conversion fails")
|
337
|
-
|
338
|
-
def __repr__(self):
|
339
|
-
raise Exception("String conversion fails")
|
340
|
-
|
341
|
-
unconvertible = Unconvertible()
|
342
|
-
self.assertEqual(natural_sort_key(unconvertible)[0], 6) # Failure case, string conversion fails
|
343
|
-
|
344
|
-
|
345
|
-
def test_sort_selection():
|
346
|
-
# Test case 1: Mixed types, no reverse
|
347
|
-
data1 = [[1, "b"], [3, "a"]]
|
348
|
-
sorted_data1 = sort_selection(data1)
|
349
|
-
print(f"Test 1 - No reverse: {data1} -> {sorted_data1}")
|
350
|
-
|
351
|
-
# Test case 2: Mixed types, with reverse
|
352
|
-
data2 = [[1, "b"], [3, "a"]]
|
353
|
-
sorted_data2 = sort_selection(data2, reverse=True)
|
354
|
-
print(f"Test 2 - With reverse: {data2} -> {sorted_data2}")
|
355
|
-
|
356
|
-
# Test case 3: All numbers
|
357
|
-
data3 = [[2, 1], [4, 3]]
|
358
|
-
sorted_data3 = sort_selection(data3)
|
359
|
-
print(f"Test 3 - All numbers: {data3} -> {sorted_data3}")
|
360
|
-
|
361
|
-
# Test case 4: With None values
|
362
|
-
data4 = [[None, "b"], ["a", None]]
|
363
|
-
sorted_data4 = sort_selection(data4)
|
364
|
-
print(f"Test 4 - With None: {data4} -> {sorted_data4}")
|
365
|
-
|
366
|
-
|
367
|
-
if __name__ == "__main__":
|
368
|
-
test_sort_selection()
|
369
|
-
unittest.main()
|
301
|
+
# def test_natural_sort_key():
|
302
|
+
# test_items = [
|
303
|
+
# None,
|
304
|
+
# False,
|
305
|
+
# True,
|
306
|
+
# 5,
|
307
|
+
# 3.14,
|
308
|
+
# datetime(2023, 1, 1),
|
309
|
+
# "abc123",
|
310
|
+
# "123abc",
|
311
|
+
# "abc123def",
|
312
|
+
# "998zzz",
|
313
|
+
# "10-01-2023",
|
314
|
+
# "01-10-2023",
|
315
|
+
# "fi1le_0.txt",
|
316
|
+
# "file_2.txt",
|
317
|
+
# "file_10.txt",
|
318
|
+
# "file_1.txt",
|
319
|
+
# "path/to/file_2.txt",
|
320
|
+
# "path/to/file_10.txt",
|
321
|
+
# "path/to/file_1.txt",
|
322
|
+
# "/another/path/file_2.log",
|
323
|
+
# "/another/path/file_10.log",
|
324
|
+
# "/another/path/file_1.log",
|
325
|
+
# "C:\\Windows\\System32\\file_2.dll",
|
326
|
+
# "C:\\Windows\\System32\\file_10.dll",
|
327
|
+
# "C:\\Windows\\System32\\file_1.dll",
|
328
|
+
# ]
|
329
|
+
# print("Sort objects:", [natural_sort_key(e) for e in test_items])
|
330
|
+
# sorted_items = sorted(test_items, key=natural_sort_key)
|
331
|
+
# print("\nNatural Sort Order:", sorted_items)
|
332
|
+
|
333
|
+
|
334
|
+
# if __name__ == "__main__":
|
335
|
+
# test_natural_sort_key()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: tksheet
|
3
|
-
Version: 7.4.
|
3
|
+
Version: 7.4.2
|
4
4
|
Summary: Tkinter table / sheet and treeview widget
|
5
5
|
Author-email: ragardner <github@ragardner.simplelogin.com>
|
6
6
|
License: Copyright (c) 2019 ragardner and open source contributors
|
@@ -77,13 +77,11 @@ License-File: LICENSE.txt
|
|
77
77
|
<td align="right" colspan="2"><a href="https://github.com/ragardner/tksheet/wiki/Version-7#issues">Issues</a></td>
|
78
78
|
</tr>
|
79
79
|
<tr>
|
80
|
-
<td align="right" colspan="2"><a href="https://github.com/ragardner/tksheet/wiki/Version-7#enhancements-or-suggestions">Suggestions</a></td>
|
80
|
+
<td align="right" colspan="2"><a href="https://github.com/ragardner/tksheet/wiki/Version-7#enhancements-or-suggestions">Suggestions and Contributors</a></td>
|
81
81
|
</tr>
|
82
82
|
</tbody>
|
83
83
|
</table>
|
84
84
|
|
85
|
-
This library is maintained with the help of **[others](https://github.com/ragardner/tksheet/graphs/contributors)**. If you would like to contribute please read this [help section](https://github.com/ragardner/tksheet/wiki/Version-7#contributing).
|
86
|
-
|
87
85
|
## **Features**
|
88
86
|
|
89
87
|
- Smoothly display and modify tabular data
|
@@ -95,7 +93,6 @@ This library is maintained with the help of **[others](https://github.com/ragard
|
|
95
93
|
- [Expand row heights and column widths](https://github.com/ragardner/tksheet/wiki/Version-7#table-functionality-and-bindings)
|
96
94
|
- [Change fonts and font size (not for individual cells)](https://github.com/ragardner/tksheet/wiki/Version-7#text-font-and-alignment)
|
97
95
|
- [Change any colors in the sheet](https://github.com/ragardner/tksheet/wiki/Version-7#sheet-appearance)
|
98
|
-
|
99
96
|
- [Dropdown boxes](https://github.com/ragardner/tksheet/wiki/Version-7#dropdown-boxes)
|
100
97
|
- [Check boxes](https://github.com/ragardner/tksheet/wiki/Version-7#check-boxes)
|
101
98
|
- [Progress bars](https://github.com/ragardner/tksheet/wiki/Version-7#progress-bars)
|
@@ -1,22 +1,22 @@
|
|
1
|
-
tksheet/__init__.py,sha256=
|
1
|
+
tksheet/__init__.py,sha256=BuxXbfmHJXeezYFzX9NIu-OAj8cCTE8KGSuIo2uJUXY,2241
|
2
2
|
tksheet/colors.py,sha256=dHhmdFuQDlwohDHsAfT9VdrKoSl_R33L72a3HCin5zo,51591
|
3
|
-
tksheet/column_headers.py,sha256=
|
3
|
+
tksheet/column_headers.py,sha256=ZfHLhXEKe8M9ggf3nzg252DBVH_NRtQichtTF7pisIc,103245
|
4
4
|
tksheet/constants.py,sha256=PkvAtdYXSOiOO5zuxqrObvGIVV2sEE0enN8YLhI8zCc,3922
|
5
5
|
tksheet/find_window.py,sha256=JfkgpGluSng3bKMBneDNQg-AJmBcmCW7JIhtYbSUZaE,8036
|
6
6
|
tksheet/formatters.py,sha256=21ZkMaDIJNUtjvtlAbPl8Y19I9nDxue-JJegw6hblz8,10551
|
7
7
|
tksheet/functions.py,sha256=tVwMLWsW4n5M-RCL8DrLMOXygDhBP26wz4nEQq1gkUo,52734
|
8
|
-
tksheet/main_table.py,sha256=
|
8
|
+
tksheet/main_table.py,sha256=mK74o6VlN8EdM6iJt3XyLlJc4DvNGENyjmDJcNEIcX0,357780
|
9
9
|
tksheet/other_classes.py,sha256=ADybikLipEG4NABXx8bGVAovJJhWcomQOWTorzS1CPU,16581
|
10
|
-
tksheet/row_index.py,sha256=
|
10
|
+
tksheet/row_index.py,sha256=66AZdMHiP85cqSYe01sSOVdue-DDEIlpLH2NRSeH5Fw,133222
|
11
11
|
tksheet/sheet.py,sha256=2_fMNnJqwvEkYsrDuyxFC68l6XZROzZVjG2FrSZc7IU,284689
|
12
12
|
tksheet/sheet_options.py,sha256=RAQX9NF8Bvauj4fHW-8TGtZG6cRVSzwGxSUKplg3c28,9625
|
13
|
-
tksheet/sorting.py,sha256=
|
13
|
+
tksheet/sorting.py,sha256=Lh2jrbh6fGXxA7FuosiBFKj7etJe3IYJ33cVhE6g8qU,10374
|
14
14
|
tksheet/text_editor.py,sha256=ZLVF-0WxDin5qUAJ5r7dmsdwvhyEoxw0PlPvi_AGNPE,7328
|
15
15
|
tksheet/themes.py,sha256=AoNAxibnQi04MN0Zpbn9-kyDnkiiV8TDNWP9FYjpuf0,18473
|
16
16
|
tksheet/tksheet_types.py,sha256=8JQVlA6N9jEZTEAytbcyuhOGuNE4fUPxYhTqoidxEE0,588
|
17
17
|
tksheet/top_left_rectangle.py,sha256=KhTT-rBUwQTgaHjSwL83cL5_71k2L1B7gxkSxZlTSK8,8598
|
18
|
-
tksheet-7.4.
|
19
|
-
tksheet-7.4.
|
20
|
-
tksheet-7.4.
|
21
|
-
tksheet-7.4.
|
22
|
-
tksheet-7.4.
|
18
|
+
tksheet-7.4.2.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
|
19
|
+
tksheet-7.4.2.dist-info/METADATA,sha256=QeRPqI62tWbTBzRkMxe-mIhXNHB8xLP44SWDfGglYr0,7734
|
20
|
+
tksheet-7.4.2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
21
|
+
tksheet-7.4.2.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
|
22
|
+
tksheet-7.4.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|