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/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: Any = None,
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
- self.MT.set_cell_data(r, c, v)
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
- for c in range(self.MT.total_data_cols()):
6214
- self.MT.set_cell_data(r, c, v)
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
- for r in range(self.MT.total_data_rows()):
6239
- self.MT.set_cell_data(r, c, v)
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
- def _create_header_dropdown(self, c: int, v: Any, d: dict) -> None:
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
- self.CH.set_cell_data(c, v)
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
- def _create_index_dropdown(self, r: int, v: Any, d: dict) -> None:
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
- self.RI.set_cell_data(r, v)
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 - self.yscroll.winfo_width() - 4)
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=False,
6926
+ redraw=True,
6871
6927
  verify=False,
6872
6928
  )
6873
- self.set_all_cell_sizes_to_text(redraw=redraw, width=width, slim=True)
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
  )
tksheet/tksheet_types.py CHANGED
@@ -23,6 +23,7 @@ CellPropertyKey = Literal[
23
23
  "checkbox",
24
24
  "readonly",
25
25
  "align",
26
+ "note",
26
27
  ]
27
28
 
28
29
  Binding = Literal[