tksheet 7.5.4__py3-none-any.whl → 7.5.7__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:
@@ -4746,24 +4784,29 @@ class Sheet(tk.Frame):
4746
4784
 
4747
4785
  def _get_id_insert_row(self, index: int | None, parent: str) -> int:
4748
4786
  if parent:
4787
+ chn = self.RI.iid_children(parent)
4749
4788
  if isinstance(index, int):
4750
- index = min(index, len(self.RI.iid_children(parent)))
4751
- datarn = (
4752
- self.RI.rns[parent]
4753
- + index
4754
- + 1
4755
- + sum(self.RI.num_descendants(cid) for cid in islice(self.get_children(parent), index))
4756
- )
4789
+ index = min(index, len(chn))
4790
+ if index == 0:
4791
+ return self.RI.rns[parent] + 1
4792
+ else:
4793
+ prev_chld = chn[index - 1]
4794
+ return self.RI.rns[prev_chld] + self.RI.num_descendants(prev_chld) + 1
4757
4795
  else:
4758
- datarn = self.RI.rns[parent] + self.RI.num_descendants(parent) + 1
4796
+ if chn:
4797
+ last_chld = chn[-1]
4798
+ last_chld_rn = self.RI.rns[last_chld]
4799
+ return last_chld_rn + self.RI.num_descendants(last_chld) + 1
4800
+ else:
4801
+ return self.RI.rns[parent] + 1
4759
4802
  else:
4760
4803
  if isinstance(index, int):
4761
- datarn = index
4762
- if index and (datarn := self.top_index_row(index)) is None:
4763
- datarn = len(self.MT._row_index)
4804
+ if index == 0:
4805
+ return 0
4806
+ datarn = self.top_index_row(index)
4807
+ return len(self.MT._row_index) if datarn is None else datarn
4764
4808
  else:
4765
- datarn = len(self.MT._row_index)
4766
- return datarn
4809
+ return len(self.MT._row_index)
4767
4810
 
4768
4811
  def bulk_insert(
4769
4812
  self,
@@ -5998,6 +6041,8 @@ class Sheet(tk.Frame):
5998
6041
  self._create_header_checkbox(c_, kwargs["checked"], d)
5999
6042
  self.set_refresh_timer(kwargs["redraw"])
6000
6043
 
6044
+ checkbox_header = create_header_checkbox
6045
+
6001
6046
  def _create_header_checkbox(self, c: int, v: bool, d: dict) -> None:
6002
6047
  self.del_header_cell_options_dropdown_and_checkbox(c)
6003
6048
  add_to_options(self.CH.cell_options, c, "checkbox", d)
@@ -6021,6 +6066,8 @@ class Sheet(tk.Frame):
6021
6066
  self._create_index_checkbox(r_, kwargs["checked"], d)
6022
6067
  self.set_refresh_timer(kwargs["redraw"])
6023
6068
 
6069
+ checkbox_index = create_index_checkbox
6070
+
6024
6071
  def _create_index_checkbox(self, r: int, v: bool, d: dict) -> None:
6025
6072
  self.del_index_cell_options_dropdown_and_checkbox(r)
6026
6073
  add_to_options(self.RI.cell_options, r, "checkbox", d)
@@ -6154,25 +6201,27 @@ class Sheet(tk.Frame):
6154
6201
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6155
6202
  d = get_dropdown_dict(**kwargs)
6156
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"]
6157
6205
  if isinstance(r, str) and r.lower() == "all" and isinstance(c, int):
6158
6206
  for r_ in range(self.MT.total_data_rows()):
6159
- self._create_dropdown(r_, c, v, d)
6207
+ self._create_dropdown(r_, c, v, d, edit)
6160
6208
  elif isinstance(c, str) and c.lower() == "all" and isinstance(r, int):
6161
6209
  for c_ in range(self.MT.total_data_cols()):
6162
- self._create_dropdown(r, c_, v, d)
6210
+ self._create_dropdown(r, c_, v, d, edit)
6163
6211
  elif isinstance(r, str) and r.lower() == "all" and isinstance(c, str) and c.lower() == "all":
6164
6212
  totalcols = self.MT.total_data_cols()
6165
6213
  for r_ in range(self.MT.total_data_rows()):
6166
6214
  for c_ in range(totalcols):
6167
- self._create_dropdown(r_, c_, v, d)
6215
+ self._create_dropdown(r_, c_, v, d, edit)
6168
6216
  elif isinstance(r, int) and isinstance(c, int):
6169
- self._create_dropdown(r, c, v, d)
6217
+ self._create_dropdown(r, c, v, d, edit)
6170
6218
  return self.set_refresh_timer(kwargs["redraw"])
6171
6219
 
6172
- 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:
6173
6221
  self.del_cell_options_dropdown_and_checkbox(r, c)
6174
6222
  add_to_options(self.MT.cell_options, (r, c), "dropdown", d)
6175
- self.MT.set_cell_data(r, c, v)
6223
+ if edit:
6224
+ self.MT.set_cell_data(r, c, v)
6176
6225
 
6177
6226
  def dropdown_cell(
6178
6227
  self,
@@ -6192,21 +6241,23 @@ class Sheet(tk.Frame):
6192
6241
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6193
6242
  d = get_dropdown_dict(**kwargs)
6194
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"]
6195
6245
  if isinstance(r, str) and r.lower() == "all":
6196
6246
  for r_ in range(self.MT.total_data_rows()):
6197
- self._dropdown_row(r_, v, d)
6247
+ self._dropdown_row(r_, v, d, edit)
6198
6248
  elif isinstance(r, int):
6199
- self._dropdown_row(r, v, d)
6249
+ self._dropdown_row(r, v, d, edit)
6200
6250
  elif is_iterable(r):
6201
6251
  for r_ in r:
6202
- self._dropdown_row(r_, v, d)
6252
+ self._dropdown_row(r_, v, d, edit)
6203
6253
  return self.set_refresh_timer(kwargs["redraw"])
6204
6254
 
6205
- 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:
6206
6256
  self.del_row_options_dropdown_and_checkbox(r)
6207
6257
  add_to_options(self.MT.row_options, r, "dropdown", d)
6208
- for c in range(self.MT.total_data_cols()):
6209
- 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)
6210
6261
 
6211
6262
  def dropdown_column(
6212
6263
  self,
@@ -6217,21 +6268,23 @@ class Sheet(tk.Frame):
6217
6268
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6218
6269
  d = get_dropdown_dict(**kwargs)
6219
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"]
6220
6272
  if isinstance(c, str) and c.lower() == "all":
6221
6273
  for c_ in range(self.MT.total_data_cols()):
6222
- self._dropdown_column(c_, v, d)
6274
+ self._dropdown_column(c_, v, d, edit)
6223
6275
  elif isinstance(c, int):
6224
- self._dropdown_column(c, v, d)
6276
+ self._dropdown_column(c, v, d, edit)
6225
6277
  elif is_iterable(c):
6226
6278
  for c_ in c:
6227
- self._dropdown_column(c_, v, d)
6279
+ self._dropdown_column(c_, v, d, edit)
6228
6280
  return self.set_refresh_timer(kwargs["redraw"])
6229
6281
 
6230
- 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:
6231
6283
  self.del_column_options_dropdown_and_checkbox(c)
6232
6284
  add_to_options(self.MT.col_options, c, "dropdown", d)
6233
- for r in range(self.MT.total_data_rows()):
6234
- 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)
6235
6288
 
6236
6289
  def create_header_dropdown(
6237
6290
  self,
@@ -6242,20 +6295,24 @@ class Sheet(tk.Frame):
6242
6295
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6243
6296
  d = get_dropdown_dict(**kwargs)
6244
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"]
6245
6299
  if isinstance(c, str) and c.lower() == "all":
6246
6300
  for c_ in range(self.MT.total_data_cols()):
6247
- self._create_header_dropdown(c_, v, d)
6301
+ self._create_header_dropdown(c_, v, d, edit)
6248
6302
  elif isinstance(c, int):
6249
- self._create_header_dropdown(c, v, d)
6303
+ self._create_header_dropdown(c, v, d, edit)
6250
6304
  elif is_iterable(c):
6251
6305
  for c_ in c:
6252
- self._create_header_dropdown(c_, v, d)
6306
+ self._create_header_dropdown(c_, v, d, edit)
6253
6307
  return self.set_refresh_timer(kwargs["redraw"])
6254
6308
 
6255
- 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:
6256
6312
  self.del_header_cell_options_dropdown_and_checkbox(c)
6257
6313
  add_to_options(self.CH.cell_options, c, "dropdown", d)
6258
- self.CH.set_cell_data(c, v)
6314
+ if edit:
6315
+ self.CH.set_cell_data(c, v)
6259
6316
 
6260
6317
  def create_index_dropdown(
6261
6318
  self,
@@ -6266,20 +6323,24 @@ class Sheet(tk.Frame):
6266
6323
  kwargs = get_dropdown_kwargs(*args, **kwargs)
6267
6324
  d = get_dropdown_dict(**kwargs)
6268
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"]
6269
6327
  if isinstance(r, str) and r.lower() == "all":
6270
6328
  for r_ in range(self.MT.total_data_rows()):
6271
- self._create_index_dropdown(r_, v, d)
6329
+ self._create_index_dropdown(r_, v, d, edit)
6272
6330
  elif isinstance(r, int):
6273
- self._create_index_dropdown(r, v, d)
6331
+ self._create_index_dropdown(r, v, d, edit)
6274
6332
  elif is_iterable(r):
6275
6333
  for r_ in r:
6276
- self._create_index_dropdown(r_, v, d)
6334
+ self._create_index_dropdown(r_, v, d, edit)
6277
6335
  return self.set_refresh_timer(kwargs["redraw"])
6278
6336
 
6279
- 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:
6280
6340
  self.del_index_cell_options_dropdown_and_checkbox(r)
6281
6341
  add_to_options(self.RI.cell_options, r, "dropdown", d)
6282
- self.RI.set_cell_data(r, v)
6342
+ if edit:
6343
+ self.RI.set_cell_data(r, v)
6283
6344
 
6284
6345
  def delete_dropdown(
6285
6346
  self,
@@ -6704,11 +6765,11 @@ class Dropdown(Sheet):
6704
6765
  show_top_left=False,
6705
6766
  empty_horizontal=0,
6706
6767
  empty_vertical=0,
6707
- selected_rows_to_end_of_window=True,
6708
6768
  horizontal_grid_to_end_of_window=True,
6709
- set_cell_sizes_on_zoom=True,
6710
6769
  show_selected_cells_border=False,
6770
+ set_cell_sizes_on_zoom=True,
6711
6771
  scrollbar_show_arrows=False,
6772
+ rounded_boxes=False,
6712
6773
  )
6713
6774
  self.parent = parent
6714
6775
  self.close_dropdown_window = close_dropdown_window
@@ -6785,7 +6846,7 @@ class Dropdown(Sheet):
6785
6846
  table_bg=bg,
6786
6847
  **{k: ops[k] for k in scrollbar_options_keys},
6787
6848
  )
6788
- self.values(values, width=width - self.yscroll.winfo_width() - 4)
6849
+ self.values(values, width=width)
6789
6850
 
6790
6851
  def arrowkey_UP(self, event: Any = None) -> None:
6791
6852
  if self.row > 0:
@@ -6862,7 +6923,11 @@ class Dropdown(Sheet):
6862
6923
  [[v] for v in values],
6863
6924
  reset_col_positions=False,
6864
6925
  reset_row_positions=False,
6865
- redraw=False,
6926
+ redraw=True,
6866
6927
  verify=False,
6867
6928
  )
6868
- 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[