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 CHANGED
@@ -4,7 +4,7 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.4.0"
7
+ __version__ = "7.4.2"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
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("sort_rows", state=True)
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, "begin_sort_rows"):
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, "end_sort_rows")
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
- *self.get_args_for_add_columns(data_ins_col, displayed_ins_col, numcols),
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
- *self.get_args_for_add_rows(data_ins_row, displayed_ins_row, numrows),
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
- data_to_displayed_idxs(columns, self.MT.displayed_columns) if data_indexes else columns,
5356
+ disp_columns,
5351
5357
  event_data,
5352
5358
  )
5353
5359
  event_data = self.delete_columns_data(
5354
- columns if data_indexes or self.all_columns_displayed else [self.displayed_columns[c] for c in columns],
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 data_indexes or self.all_rows_displayed:
5434
+ if self.all_rows_displayed:
5429
5435
  data_rows = rows
5436
+ disp_rows = rows
5430
5437
  else:
5431
- data_rows = [self.displayed_rows[r] for r in rows]
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
- data_to_displayed_idxs(data_rows, self.displayed_rows) if self.PAR.ops.treeview or data_indexes else rows,
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("sort_columns", state=True)
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, "begin_sort_columns"):
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, "end_sort_columns")
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 re
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
- from .other_classes import Node
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(item: object) -> tuple[int, object]:
48
+ def natural_sort_key(
49
+ item: object,
50
+ ) -> tuple[int, ...]:
50
51
  """
51
- A key function for natural sorting that handles various Python types, including
52
- date-like strings in multiple formats.
53
-
54
- This function aims to sort elements in a human-readable order:
55
- - None values first
56
- - Booleans (False before True)
57
- - Numbers (integers, floats combined)
58
- - Datetime objects
59
- - Strings with natural sorting for embedded numbers and dates
60
- - Unknown types treated as strings or left at the end
61
-
62
- With love from Grok ❤️
63
-
64
- Args:
65
- item: Any Python object to be sorted.
66
-
67
- Returns:
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, (item,)) # Tuple to ensure float and int are sorted together
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
- # Check if the whole string is a date
84
- for date_format in date_formats:
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
- # Use the same sort order as for datetime objects
87
- return (3, datetime.strptime(item, date_format).timestamp())
88
- except ValueError:
89
- continue
97
+ return (2, float(item))
98
+ except Exception:
99
+ pass
90
100
 
91
- # Check if the whole string is a number
92
- try:
93
- return (4, float(item))
94
- except Exception:
95
- # Proceed with natural sorting
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 (6, f"{item}".lower())
112
+ return (7, f"{item}".lower())
102
113
  except Exception:
103
- return (7, item) # If conversion fails, place at the very end
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: Node,
237
- tree: dict[str, Node],
247
+ node: object,
248
+ tree: dict[str, object],
238
249
  reverse: bool,
239
250
  key: Callable,
240
- ) -> Generator[Node, None, None]:
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[Node],
264
+ _row_index: list[object],
254
265
  tree_rns: dict[str, int],
255
- tree: dict[str, Node],
266
+ tree: dict[str, object],
256
267
  key: Callable = natural_sort_key,
257
268
  reverse: bool = False,
258
- ) -> tuple[list[Node], dict[int, int]]:
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
- class TestNaturalSort(unittest.TestCase):
291
- def test_none_first(self):
292
- self.assertEqual(natural_sort_key(None), (0, ""))
293
-
294
- def test_booleans_order(self):
295
- self.assertLess(natural_sort_key(False), natural_sort_key(True))
296
-
297
- def test_numbers_order(self):
298
- self.assertLess(natural_sort_key(5), natural_sort_key(10))
299
- self.assertLess(natural_sort_key(5.5), natural_sort_key(6))
300
-
301
- def test_datetime_order(self):
302
- dt1 = datetime(2023, 1, 1)
303
- dt2 = datetime(2023, 1, 2)
304
- self.assertLess(natural_sort_key(dt1), natural_sort_key(dt2))
305
-
306
- def test_string_natural_sort(self):
307
- items = ["item2", "item10", "item1"]
308
- sorted_items = sorted(items, key=natural_sort_key)
309
- self.assertEqual(sorted_items, ["item1", "item2", "item10"])
310
-
311
- def test_date_string_recognition(self):
312
- # Test various date formats
313
- date_str1 = "01/01/2023"
314
- date_str2 = "2023-01-01"
315
- date_str3 = "Jan 1, 2023"
316
-
317
- dt = datetime(2023, 1, 1)
318
-
319
- self.assertEqual(natural_sort_key(date_str1)[0], 3)
320
- self.assertEqual(natural_sort_key(date_str2)[0], 3)
321
- self.assertEqual(natural_sort_key(date_str3)[0], 3)
322
- self.assertEqual(natural_sort_key(date_str1)[1], natural_sort_key(dt)[1]) # Timestamps should match
323
-
324
- def test_unknown_types(self):
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.0
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=cz7KFN4KnaMiO7QT74IP09ovReyBmHQwhSbnMAofV70,2241
1
+ tksheet/__init__.py,sha256=BuxXbfmHJXeezYFzX9NIu-OAj8cCTE8KGSuIo2uJUXY,2241
2
2
  tksheet/colors.py,sha256=dHhmdFuQDlwohDHsAfT9VdrKoSl_R33L72a3HCin5zo,51591
3
- tksheet/column_headers.py,sha256=kWCK1fTf0poj5vilqxh99r6gJ4-bBaIJfB-oNbH7oE8,103245
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=s7d3q8x35dSWuMcviGkn0g4c2PsJqGLhD319tbaW-yc,357255
8
+ tksheet/main_table.py,sha256=mK74o6VlN8EdM6iJt3XyLlJc4DvNGENyjmDJcNEIcX0,357780
9
9
  tksheet/other_classes.py,sha256=ADybikLipEG4NABXx8bGVAovJJhWcomQOWTorzS1CPU,16581
10
- tksheet/row_index.py,sha256=F64DrvSBmq89JVhYomSRzyQtS4nWAeWDcqnPL8cgsGI,133222
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=SMspUgdcmzUOFjhck8brcVhDTwDK2Uw_du9TWkGXJMI,12295
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.0.dist-info/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
19
- tksheet-7.4.0.dist-info/METADATA,sha256=5vqJyNyD80FP4mSSpaU1osuXCm2GOIahE6vYz8p99-8,7966
20
- tksheet-7.4.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
21
- tksheet-7.4.0.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
22
- tksheet-7.4.0.dist-info/RECORD,,
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,,