tksheet 7.5.5__py3-none-any.whl → 7.5.8__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 +230 -87
- tksheet/constants.py +1 -0
- tksheet/find_window.py +4 -4
- tksheet/formatters.py +4 -2
- tksheet/functions.py +91 -35
- tksheet/main_table.py +374 -643
- tksheet/menus.py +494 -0
- tksheet/other_classes.py +3 -0
- tksheet/row_index.py +235 -97
- tksheet/sheet.py +99 -39
- tksheet/sheet_options.py +5 -1
- tksheet/tksheet_types.py +1 -0
- tksheet/tooltip.py +335 -0
- {tksheet-7.5.5.dist-info → tksheet-7.5.8.dist-info}/METADATA +1 -1
- tksheet-7.5.8.dist-info/RECORD +24 -0
- {tksheet-7.5.5.dist-info → tksheet-7.5.8.dist-info}/WHEEL +1 -1
- tksheet-7.5.5.dist-info/RECORD +0 -22
- {tksheet-7.5.5.dist-info → tksheet-7.5.8.dist-info}/licenses/LICENSE.txt +0 -0
- {tksheet-7.5.5.dist-info → tksheet-7.5.8.dist-info}/top_level.txt +0 -0
tksheet/sheet.py
CHANGED
@@ -51,6 +51,7 @@ from .functions import (
|
|
51
51
|
is_iterable,
|
52
52
|
key_to_span,
|
53
53
|
mod_event_val,
|
54
|
+
mod_note,
|
54
55
|
new_tk_event,
|
55
56
|
num2alpha,
|
56
57
|
pop_positions,
|
@@ -181,7 +182,6 @@ class Sheet(tk.Frame):
|
|
181
182
|
row_drag_and_drop_perform: bool = True,
|
182
183
|
empty_horizontal: int = 50,
|
183
184
|
empty_vertical: int = 50,
|
184
|
-
selected_rows_to_end_of_window: bool = False,
|
185
185
|
horizontal_grid_to_end_of_window: bool = False,
|
186
186
|
vertical_grid_to_end_of_window: bool = False,
|
187
187
|
show_vertical_grid: bool = True,
|
@@ -201,6 +201,11 @@ class Sheet(tk.Frame):
|
|
201
201
|
index_wrap: Literal["", "w", "c"] = "c",
|
202
202
|
header_wrap: Literal["", "w", "c"] = "c",
|
203
203
|
sort_key: Callable = natural_sort_key,
|
204
|
+
tooltips: bool = False,
|
205
|
+
user_can_create_notes: bool = False,
|
206
|
+
note_corners: bool = False,
|
207
|
+
tooltip_width: int = 210,
|
208
|
+
tooltip_height: int = 210,
|
204
209
|
# colors
|
205
210
|
outline_thickness: int = 0,
|
206
211
|
theme: str = "light blue",
|
@@ -312,6 +317,7 @@ class Sheet(tk.Frame):
|
|
312
317
|
highlightbackground=outline_color,
|
313
318
|
highlightcolor=outline_color,
|
314
319
|
)
|
320
|
+
self.unique_id = f"{default_timer()}{self.winfo_id()}".replace(".", "")
|
315
321
|
self._startup_complete = False
|
316
322
|
self.ops = new_sheet_options()
|
317
323
|
if column_width is not None:
|
@@ -393,7 +399,6 @@ class Sheet(tk.Frame):
|
|
393
399
|
row_index_canvas=self.RI,
|
394
400
|
header_canvas=self.CH,
|
395
401
|
)
|
396
|
-
self.unique_id = f"{default_timer()}{self.winfo_id()}".replace(".", "")
|
397
402
|
style = ttk.Style()
|
398
403
|
for orientation in ("Vertical", "Horizontal"):
|
399
404
|
style.element_create(
|
@@ -505,6 +510,7 @@ class Sheet(tk.Frame):
|
|
505
510
|
self.refresh()
|
506
511
|
if startup_focus:
|
507
512
|
self.MT.focus_set()
|
513
|
+
self.MT.create_rc_menus()
|
508
514
|
self.after_idle(self.startup_complete)
|
509
515
|
|
510
516
|
def startup_complete(self, _mod: bool = True) -> bool:
|
@@ -800,7 +806,6 @@ class Sheet(tk.Frame):
|
|
800
806
|
self.MT.extra_header_rc_menu_funcs[label] = dct
|
801
807
|
if empty_space_menu:
|
802
808
|
self.MT.extra_empty_space_rc_menu_funcs[label] = dct
|
803
|
-
self.MT.create_rc_menus()
|
804
809
|
return self
|
805
810
|
|
806
811
|
def popup_menu_del_command(self, label: str | None = None) -> Sheet:
|
@@ -818,7 +823,6 @@ class Sheet(tk.Frame):
|
|
818
823
|
del self.MT.extra_header_rc_menu_funcs[label]
|
819
824
|
if label in self.MT.extra_empty_space_rc_menu_funcs:
|
820
825
|
del self.MT.extra_empty_space_rc_menu_funcs[label]
|
821
|
-
self.MT.create_rc_menus()
|
822
826
|
return self
|
823
827
|
|
824
828
|
def basic_bindings(self, enable: bool = False) -> Sheet:
|
@@ -904,7 +908,7 @@ class Sheet(tk.Frame):
|
|
904
908
|
hdisp: bool = True,
|
905
909
|
transposed: bool = False,
|
906
910
|
ndim: int = 0,
|
907
|
-
convert:
|
911
|
+
convert: Callable | None = None,
|
908
912
|
undo: bool = True,
|
909
913
|
emit_event: bool = False,
|
910
914
|
widget: Any = None,
|
@@ -2247,6 +2251,40 @@ class Sheet(tk.Frame):
|
|
2247
2251
|
self.MT.sheet_modified(event_data)
|
2248
2252
|
return event_data
|
2249
2253
|
|
2254
|
+
# Notes
|
2255
|
+
|
2256
|
+
def note(self, *key: CreateSpanTypes, note: str | None = None, readonly: bool = True) -> Span:
|
2257
|
+
"""
|
2258
|
+
note=None to delete notes for the span area.
|
2259
|
+
Or use a str to set notes for the span area.
|
2260
|
+
"""
|
2261
|
+
span = self.span_from_key(*key)
|
2262
|
+
rows, cols = self.ranges_from_span(span)
|
2263
|
+
table, index, header = span.table, span.index, span.header
|
2264
|
+
if span.kind == "cell":
|
2265
|
+
if header:
|
2266
|
+
for c in cols:
|
2267
|
+
mod_note(self.CH.cell_options, c, note, readonly)
|
2268
|
+
for r in rows:
|
2269
|
+
if index:
|
2270
|
+
mod_note(self.RI.cell_options, r, note, readonly)
|
2271
|
+
if table:
|
2272
|
+
for c in cols:
|
2273
|
+
mod_note(self.MT.cell_options, (r, c), note, readonly)
|
2274
|
+
elif span.kind == "row":
|
2275
|
+
for r in rows:
|
2276
|
+
if index:
|
2277
|
+
mod_note(self.RI.cell_options, r, note, readonly)
|
2278
|
+
if table:
|
2279
|
+
mod_note(self.MT.row_options, r, note, readonly)
|
2280
|
+
elif span.kind == "column":
|
2281
|
+
for c in cols:
|
2282
|
+
if header:
|
2283
|
+
mod_note(self.CH.cell_options, c, note, readonly)
|
2284
|
+
if table:
|
2285
|
+
mod_note(self.MT.col_options, c, note, readonly)
|
2286
|
+
return span
|
2287
|
+
|
2250
2288
|
# Highlighting Cells
|
2251
2289
|
|
2252
2290
|
def highlight(
|
@@ -2351,6 +2389,7 @@ class Sheet(tk.Frame):
|
|
2351
2389
|
"search_function": search_function,
|
2352
2390
|
"validate_input": validate_input,
|
2353
2391
|
"text": text,
|
2392
|
+
"default_value": set_value,
|
2354
2393
|
}
|
2355
2394
|
d = get_dropdown_dict(**kwargs)
|
2356
2395
|
span = self.span_from_key(*key)
|
@@ -4187,7 +4226,6 @@ class Sheet(tk.Frame):
|
|
4187
4226
|
if "treeview" in kwargs:
|
4188
4227
|
self.index_align("nw", redraw=False)
|
4189
4228
|
self.ops.paste_can_expand_y = False
|
4190
|
-
self.MT.create_rc_menus()
|
4191
4229
|
return self.set_refresh_timer(redraw)
|
4192
4230
|
|
4193
4231
|
def set_scrollbar_options(self) -> Sheet:
|
@@ -6003,6 +6041,8 @@ class Sheet(tk.Frame):
|
|
6003
6041
|
self._create_header_checkbox(c_, kwargs["checked"], d)
|
6004
6042
|
self.set_refresh_timer(kwargs["redraw"])
|
6005
6043
|
|
6044
|
+
checkbox_header = create_header_checkbox
|
6045
|
+
|
6006
6046
|
def _create_header_checkbox(self, c: int, v: bool, d: dict) -> None:
|
6007
6047
|
self.del_header_cell_options_dropdown_and_checkbox(c)
|
6008
6048
|
add_to_options(self.CH.cell_options, c, "checkbox", d)
|
@@ -6026,6 +6066,8 @@ class Sheet(tk.Frame):
|
|
6026
6066
|
self._create_index_checkbox(r_, kwargs["checked"], d)
|
6027
6067
|
self.set_refresh_timer(kwargs["redraw"])
|
6028
6068
|
|
6069
|
+
checkbox_index = create_index_checkbox
|
6070
|
+
|
6029
6071
|
def _create_index_checkbox(self, r: int, v: bool, d: dict) -> None:
|
6030
6072
|
self.del_index_cell_options_dropdown_and_checkbox(r)
|
6031
6073
|
add_to_options(self.RI.cell_options, r, "checkbox", d)
|
@@ -6159,25 +6201,27 @@ class Sheet(tk.Frame):
|
|
6159
6201
|
kwargs = get_dropdown_kwargs(*args, **kwargs)
|
6160
6202
|
d = get_dropdown_dict(**kwargs)
|
6161
6203
|
v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
|
6204
|
+
edit = kwargs["edit_data"]
|
6162
6205
|
if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
|
6163
6206
|
for r_ in range(self.MT.total_data_rows()):
|
6164
|
-
self._create_dropdown(r_, c, v, d)
|
6207
|
+
self._create_dropdown(r_, c, v, d, edit)
|
6165
6208
|
elif isinstance(c, str) and c.lower() == "all" and isinstance(r, int):
|
6166
6209
|
for c_ in range(self.MT.total_data_cols()):
|
6167
|
-
self._create_dropdown(r, c_, v, d)
|
6210
|
+
self._create_dropdown(r, c_, v, d, edit)
|
6168
6211
|
elif isinstance(r, str) and r.lower() == "all" and isinstance(c, str) and c.lower() == "all":
|
6169
6212
|
totalcols = self.MT.total_data_cols()
|
6170
6213
|
for r_ in range(self.MT.total_data_rows()):
|
6171
6214
|
for c_ in range(totalcols):
|
6172
|
-
self._create_dropdown(r_, c_, v, d)
|
6215
|
+
self._create_dropdown(r_, c_, v, d, edit)
|
6173
6216
|
elif isinstance(r, int) and isinstance(c, int):
|
6174
|
-
self._create_dropdown(r, c, v, d)
|
6217
|
+
self._create_dropdown(r, c, v, d, edit)
|
6175
6218
|
return self.set_refresh_timer(kwargs["redraw"])
|
6176
6219
|
|
6177
|
-
def _create_dropdown(self, r: int, c: int, v: Any, d: dict) -> None:
|
6220
|
+
def _create_dropdown(self, r: int, c: int, v: Any, d: dict, edit: bool = True) -> None:
|
6178
6221
|
self.del_cell_options_dropdown_and_checkbox(r, c)
|
6179
6222
|
add_to_options(self.MT.cell_options, (r, c), "dropdown", d)
|
6180
|
-
|
6223
|
+
if edit:
|
6224
|
+
self.MT.set_cell_data(r, c, v)
|
6181
6225
|
|
6182
6226
|
def dropdown_cell(
|
6183
6227
|
self,
|
@@ -6197,21 +6241,23 @@ class Sheet(tk.Frame):
|
|
6197
6241
|
kwargs = get_dropdown_kwargs(*args, **kwargs)
|
6198
6242
|
d = get_dropdown_dict(**kwargs)
|
6199
6243
|
v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
|
6244
|
+
edit = kwargs["edit_data"]
|
6200
6245
|
if isinstance(r, str) and r.lower() == "all":
|
6201
6246
|
for r_ in range(self.MT.total_data_rows()):
|
6202
|
-
self._dropdown_row(r_, v, d)
|
6247
|
+
self._dropdown_row(r_, v, d, edit)
|
6203
6248
|
elif isinstance(r, int):
|
6204
|
-
self._dropdown_row(r, v, d)
|
6249
|
+
self._dropdown_row(r, v, d, edit)
|
6205
6250
|
elif is_iterable(r):
|
6206
6251
|
for r_ in r:
|
6207
|
-
self._dropdown_row(r_, v, d)
|
6252
|
+
self._dropdown_row(r_, v, d, edit)
|
6208
6253
|
return self.set_refresh_timer(kwargs["redraw"])
|
6209
6254
|
|
6210
|
-
def _dropdown_row(self, r: int, v: Any, d: dict) -> None:
|
6255
|
+
def _dropdown_row(self, r: int, v: Any, d: dict, edit: bool = True) -> None:
|
6211
6256
|
self.del_row_options_dropdown_and_checkbox(r)
|
6212
6257
|
add_to_options(self.MT.row_options, r, "dropdown", d)
|
6213
|
-
|
6214
|
-
self.MT.
|
6258
|
+
if edit:
|
6259
|
+
for c in range(self.MT.total_data_cols()):
|
6260
|
+
self.MT.set_cell_data(r, c, v)
|
6215
6261
|
|
6216
6262
|
def dropdown_column(
|
6217
6263
|
self,
|
@@ -6222,21 +6268,23 @@ class Sheet(tk.Frame):
|
|
6222
6268
|
kwargs = get_dropdown_kwargs(*args, **kwargs)
|
6223
6269
|
d = get_dropdown_dict(**kwargs)
|
6224
6270
|
v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
|
6271
|
+
edit = kwargs["edit_data"]
|
6225
6272
|
if isinstance(c, str) and c.lower() == "all":
|
6226
6273
|
for c_ in range(self.MT.total_data_cols()):
|
6227
|
-
self._dropdown_column(c_, v, d)
|
6274
|
+
self._dropdown_column(c_, v, d, edit)
|
6228
6275
|
elif isinstance(c, int):
|
6229
|
-
self._dropdown_column(c, v, d)
|
6276
|
+
self._dropdown_column(c, v, d, edit)
|
6230
6277
|
elif is_iterable(c):
|
6231
6278
|
for c_ in c:
|
6232
|
-
self._dropdown_column(c_, v, d)
|
6279
|
+
self._dropdown_column(c_, v, d, edit)
|
6233
6280
|
return self.set_refresh_timer(kwargs["redraw"])
|
6234
6281
|
|
6235
|
-
def _dropdown_column(self, c: int, v: Any, d: dict) -> None:
|
6282
|
+
def _dropdown_column(self, c: int, v: Any, d: dict, edit: bool = True) -> None:
|
6236
6283
|
self.del_column_options_dropdown_and_checkbox(c)
|
6237
6284
|
add_to_options(self.MT.col_options, c, "dropdown", d)
|
6238
|
-
|
6239
|
-
self.MT.
|
6285
|
+
if edit:
|
6286
|
+
for r in range(self.MT.total_data_rows()):
|
6287
|
+
self.MT.set_cell_data(r, c, v)
|
6240
6288
|
|
6241
6289
|
def create_header_dropdown(
|
6242
6290
|
self,
|
@@ -6247,20 +6295,24 @@ class Sheet(tk.Frame):
|
|
6247
6295
|
kwargs = get_dropdown_kwargs(*args, **kwargs)
|
6248
6296
|
d = get_dropdown_dict(**kwargs)
|
6249
6297
|
v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
|
6298
|
+
edit = kwargs["edit_data"]
|
6250
6299
|
if isinstance(c, str) and c.lower() == "all":
|
6251
6300
|
for c_ in range(self.MT.total_data_cols()):
|
6252
|
-
self._create_header_dropdown(c_, v, d)
|
6301
|
+
self._create_header_dropdown(c_, v, d, edit)
|
6253
6302
|
elif isinstance(c, int):
|
6254
|
-
self._create_header_dropdown(c, v, d)
|
6303
|
+
self._create_header_dropdown(c, v, d, edit)
|
6255
6304
|
elif is_iterable(c):
|
6256
6305
|
for c_ in c:
|
6257
|
-
self._create_header_dropdown(c_, v, d)
|
6306
|
+
self._create_header_dropdown(c_, v, d, edit)
|
6258
6307
|
return self.set_refresh_timer(kwargs["redraw"])
|
6259
6308
|
|
6260
|
-
|
6309
|
+
dropdown_header = create_header_dropdown
|
6310
|
+
|
6311
|
+
def _create_header_dropdown(self, c: int, v: Any, d: dict, edit: bool = True) -> None:
|
6261
6312
|
self.del_header_cell_options_dropdown_and_checkbox(c)
|
6262
6313
|
add_to_options(self.CH.cell_options, c, "dropdown", d)
|
6263
|
-
|
6314
|
+
if edit:
|
6315
|
+
self.CH.set_cell_data(c, v)
|
6264
6316
|
|
6265
6317
|
def create_index_dropdown(
|
6266
6318
|
self,
|
@@ -6271,20 +6323,24 @@ class Sheet(tk.Frame):
|
|
6271
6323
|
kwargs = get_dropdown_kwargs(*args, **kwargs)
|
6272
6324
|
d = get_dropdown_dict(**kwargs)
|
6273
6325
|
v = kwargs["set_value"] if kwargs["set_value"] is not None else kwargs["values"][0] if kwargs["values"] else ""
|
6326
|
+
edit = kwargs["edit_data"]
|
6274
6327
|
if isinstance(r, str) and r.lower() == "all":
|
6275
6328
|
for r_ in range(self.MT.total_data_rows()):
|
6276
|
-
self._create_index_dropdown(r_, v, d)
|
6329
|
+
self._create_index_dropdown(r_, v, d, edit)
|
6277
6330
|
elif isinstance(r, int):
|
6278
|
-
self._create_index_dropdown(r, v, d)
|
6331
|
+
self._create_index_dropdown(r, v, d, edit)
|
6279
6332
|
elif is_iterable(r):
|
6280
6333
|
for r_ in r:
|
6281
|
-
self._create_index_dropdown(r_, v, d)
|
6334
|
+
self._create_index_dropdown(r_, v, d, edit)
|
6282
6335
|
return self.set_refresh_timer(kwargs["redraw"])
|
6283
6336
|
|
6284
|
-
|
6337
|
+
dropdown_index = create_index_dropdown
|
6338
|
+
|
6339
|
+
def _create_index_dropdown(self, r: int, v: Any, d: dict, edit: bool = True) -> None:
|
6285
6340
|
self.del_index_cell_options_dropdown_and_checkbox(r)
|
6286
6341
|
add_to_options(self.RI.cell_options, r, "dropdown", d)
|
6287
|
-
|
6342
|
+
if edit:
|
6343
|
+
self.RI.set_cell_data(r, v)
|
6288
6344
|
|
6289
6345
|
def delete_dropdown(
|
6290
6346
|
self,
|
@@ -6709,11 +6765,11 @@ class Dropdown(Sheet):
|
|
6709
6765
|
show_top_left=False,
|
6710
6766
|
empty_horizontal=0,
|
6711
6767
|
empty_vertical=0,
|
6712
|
-
selected_rows_to_end_of_window=True,
|
6713
6768
|
horizontal_grid_to_end_of_window=True,
|
6714
|
-
set_cell_sizes_on_zoom=True,
|
6715
6769
|
show_selected_cells_border=False,
|
6770
|
+
set_cell_sizes_on_zoom=True,
|
6716
6771
|
scrollbar_show_arrows=False,
|
6772
|
+
rounded_boxes=False,
|
6717
6773
|
)
|
6718
6774
|
self.parent = parent
|
6719
6775
|
self.close_dropdown_window = close_dropdown_window
|
@@ -6790,7 +6846,7 @@ class Dropdown(Sheet):
|
|
6790
6846
|
table_bg=bg,
|
6791
6847
|
**{k: ops[k] for k in scrollbar_options_keys},
|
6792
6848
|
)
|
6793
|
-
self.values(values, width=width
|
6849
|
+
self.values(values, width=width)
|
6794
6850
|
|
6795
6851
|
def arrowkey_UP(self, event: Any = None) -> None:
|
6796
6852
|
if self.row > 0:
|
@@ -6867,7 +6923,11 @@ class Dropdown(Sheet):
|
|
6867
6923
|
[[v] for v in values],
|
6868
6924
|
reset_col_positions=False,
|
6869
6925
|
reset_row_positions=False,
|
6870
|
-
redraw=
|
6926
|
+
redraw=True,
|
6871
6927
|
verify=False,
|
6872
6928
|
)
|
6873
|
-
self.
|
6929
|
+
self.MT.main_table_redraw_grid_and_text(True, True, True, True, True)
|
6930
|
+
if self.yscroll_showing:
|
6931
|
+
self.set_all_cell_sizes_to_text(redraw=redraw, width=width - self.yscroll.winfo_width() - 4, slim=True)
|
6932
|
+
else:
|
6933
|
+
self.set_all_cell_sizes_to_text(redraw=redraw, width=width - 4, slim=True)
|
tksheet/sheet_options.py
CHANGED
@@ -341,7 +341,6 @@ def new_sheet_options() -> DotDict:
|
|
341
341
|
"row_drag_and_drop_perform": True,
|
342
342
|
"empty_horizontal": 50,
|
343
343
|
"empty_vertical": 50,
|
344
|
-
"selected_rows_to_end_of_window": False,
|
345
344
|
"horizontal_grid_to_end_of_window": False,
|
346
345
|
"vertical_grid_to_end_of_window": False,
|
347
346
|
"show_vertical_grid": True,
|
@@ -366,5 +365,10 @@ def new_sheet_options() -> DotDict:
|
|
366
365
|
"max_index_width": float("inf"),
|
367
366
|
"show_top_left": None,
|
368
367
|
"sort_key": natural_sort_key,
|
368
|
+
"tooltips": False,
|
369
|
+
"user_can_create_notes": False,
|
370
|
+
"note_corners": False,
|
371
|
+
"tooltip_width": 210,
|
372
|
+
"tooltip_height": 210,
|
369
373
|
}
|
370
374
|
)
|