tksheet 7.4.4__py3-none-any.whl → 7.4.6__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/main_table.py CHANGED
@@ -11,7 +11,7 @@ from itertools import accumulate, chain, cycle, filterfalse, islice, repeat
11
11
  from math import ceil, floor
12
12
  from operator import itemgetter
13
13
  from tkinter import TclError
14
- from typing import Literal
14
+ from typing import Any, Literal
15
15
 
16
16
  from .colors import color_map
17
17
  from .column_headers import ColumnHeaders
@@ -101,7 +101,7 @@ from .other_classes import (
101
101
  from .row_index import RowIndex
102
102
  from .sorting import sort_selection
103
103
  from .text_editor import TextEditor
104
- from .tksheet_types import AnyIter
104
+ from .tksheet_types import AnyIter, Binding
105
105
 
106
106
 
107
107
  class MainTable(tk.Canvas):
@@ -122,7 +122,7 @@ class MainTable(tk.Canvas):
122
122
  self.PAR_height = 0
123
123
  self.cells_cache = None
124
124
  self.table_txt_height, self.index_txt_height, self.header_txt_height = 0, 0, 0
125
- self.scrollregion = tuple()
125
+ self.scrollregion = ()
126
126
  self.current_cursor = ""
127
127
  self.ctrl_b1_pressed = False
128
128
  self.b1_pressed_loc = None
@@ -164,7 +164,7 @@ class MainTable(tk.Canvas):
164
164
  self.hidd_boxes = set()
165
165
 
166
166
  self.selection_boxes = {}
167
- self.selected = tuple()
167
+ self.selected = ()
168
168
  self.named_spans = {}
169
169
  self.reset_tags()
170
170
  self.cell_options = {}
@@ -305,14 +305,13 @@ class MainTable(tk.Canvas):
305
305
  self.data = kwargs["data_reference"]
306
306
  else:
307
307
  self.data = []
308
- if not self.data:
309
- if (
310
- isinstance(kwargs["total_rows"], int)
311
- and isinstance(kwargs["total_cols"], int)
312
- and kwargs["total_rows"] > 0
313
- and kwargs["total_cols"] > 0
314
- ):
315
- self.data = [list(repeat("", kwargs["total_cols"])) for i in range(kwargs["total_rows"])]
308
+ if not self.data and (
309
+ isinstance(kwargs["total_rows"], int)
310
+ and isinstance(kwargs["total_cols"], int)
311
+ and kwargs["total_rows"] > 0
312
+ and kwargs["total_cols"] > 0
313
+ ):
314
+ self.data = [list(repeat("", kwargs["total_cols"])) for i in range(kwargs["total_rows"])]
316
315
  _header = kwargs["header"] if kwargs["header"] is not None else kwargs["headers"]
317
316
  if isinstance(_header, int):
318
317
  self._headers = _header
@@ -336,14 +335,14 @@ class MainTable(tk.Canvas):
336
335
  self.set_col_positions(itr=[])
337
336
  self.set_row_positions(itr=[])
338
337
  self.display_rows(
339
- rows=kwargs["displayed_rows"],
338
+ rows=kwargs["displayed_rows"] if isinstance(kwargs["displayed_rows"], list) else [],
340
339
  all_rows_displayed=kwargs["all_rows_displayed"],
341
340
  reset_row_positions=False,
342
341
  deselect_all=False,
343
342
  )
344
343
  self.reset_row_positions()
345
344
  self.display_columns(
346
- columns=kwargs["displayed_columns"],
345
+ columns=kwargs["displayed_columns"] if isinstance(kwargs["displayed_columns"], list) else [],
347
346
  all_columns_displayed=kwargs["all_columns_displayed"],
348
347
  reset_col_positions=False,
349
348
  deselect_all=False,
@@ -360,10 +359,10 @@ class MainTable(tk.Canvas):
360
359
  else:
361
360
  super().event_generate(*args, **kwargs)
362
361
 
363
- def refresh(self, event: object = None) -> None:
362
+ def refresh(self, event: Any = None) -> None:
364
363
  self.PAR.set_refresh_timer()
365
364
 
366
- def window_configured(self, event: object) -> None:
365
+ def window_configured(self, event: Any) -> None:
367
366
  w = self.PAR.winfo_width()
368
367
  if w != self.PAR_width:
369
368
  self.PAR_width = w
@@ -551,15 +550,7 @@ class MainTable(tk.Canvas):
551
550
  self.set_currently_selected(row, column, item=item)
552
551
  else:
553
552
  self.select_cell(row, column, redraw=False)
554
- if not self.see(
555
- row,
556
- column,
557
- keep_yscroll=False,
558
- keep_xscroll=False,
559
- bottom_right_corner=False,
560
- check_cell_visibility=True,
561
- redraw=True,
562
- ):
553
+ if not self.see(row, column):
563
554
  self.refresh()
564
555
  return coords
565
556
 
@@ -817,7 +808,7 @@ class MainTable(tk.Canvas):
817
808
  if self.selected.type_ in ("cells", "columns"):
818
809
  for rn in range(maxrows):
819
810
  row = []
820
- for r1, c1, r2, c2 in boxes:
811
+ for r1, c1, _, c2 in boxes:
821
812
  datarn = (r1 + rn) if self.all_rows_displayed else self.displayed_rows[r1 + rn]
822
813
  for c in range(c1, c2):
823
814
  datacn = self.datacn(c)
@@ -983,7 +974,7 @@ class MainTable(tk.Canvas):
983
974
  self.refresh()
984
975
  return event_data
985
976
 
986
- def ctrl_v(self, event: object = None, validation: bool = True) -> None | EventDataDict:
977
+ def ctrl_v(self, event: Any = None, validation: bool = True) -> None | EventDataDict:
987
978
  if not self.PAR.ops.paste_can_expand_x and len(self.col_positions) == 1:
988
979
  return
989
980
  if not self.PAR.ops.paste_can_expand_y and len(self.row_positions) == 1:
@@ -1043,23 +1034,21 @@ class MainTable(tk.Canvas):
1043
1034
  added_rows = 0
1044
1035
  added_cols = 0
1045
1036
  total_data_cols = None
1046
- if self.PAR.ops.paste_can_expand_x:
1047
- if selected_c + new_data_numcols > len(self.col_positions) - 1:
1048
- total_data_cols = self.equalize_data_row_lengths()
1049
- added_cols = selected_c + new_data_numcols - len(self.col_positions) + 1
1050
- if (
1051
- isinstance(self.PAR.ops.paste_insert_column_limit, int)
1052
- and self.PAR.ops.paste_insert_column_limit < len(self.col_positions) - 1 + added_cols
1053
- ):
1054
- added_cols = self.PAR.ops.paste_insert_column_limit - len(self.col_positions) - 1
1055
- if self.PAR.ops.paste_can_expand_y:
1056
- if selected_r + new_data_numrows > len(self.row_positions) - 1:
1057
- added_rows = selected_r + new_data_numrows - len(self.row_positions) + 1
1058
- if (
1059
- isinstance(self.PAR.ops.paste_insert_row_limit, int)
1060
- and self.PAR.ops.paste_insert_row_limit < len(self.row_positions) - 1 + added_rows
1061
- ):
1062
- added_rows = self.PAR.ops.paste_insert_row_limit - len(self.row_positions) - 1
1037
+ if self.PAR.ops.paste_can_expand_x and selected_c + new_data_numcols > len(self.col_positions) - 1:
1038
+ total_data_cols = self.equalize_data_row_lengths()
1039
+ added_cols = selected_c + new_data_numcols - len(self.col_positions) + 1
1040
+ if (
1041
+ isinstance(self.PAR.ops.paste_insert_column_limit, int)
1042
+ and self.PAR.ops.paste_insert_column_limit < len(self.col_positions) - 1 + added_cols
1043
+ ):
1044
+ added_cols = self.PAR.ops.paste_insert_column_limit - len(self.col_positions) - 1
1045
+ if self.PAR.ops.paste_can_expand_y and selected_r + new_data_numrows > len(self.row_positions) - 1:
1046
+ added_rows = selected_r + new_data_numrows - len(self.row_positions) + 1
1047
+ if (
1048
+ isinstance(self.PAR.ops.paste_insert_row_limit, int)
1049
+ and self.PAR.ops.paste_insert_row_limit < len(self.row_positions) - 1 + added_rows
1050
+ ):
1051
+ added_rows = self.PAR.ops.paste_insert_row_limit - len(self.row_positions) - 1
1063
1052
  if selected_c + new_data_numcols > len(self.col_positions) - 1:
1064
1053
  adjusted_new_data_numcols = len(self.col_positions) - 1 - selected_c
1065
1054
  else:
@@ -1202,14 +1191,8 @@ class MainTable(tk.Canvas):
1202
1191
  event_data=event_data,
1203
1192
  mod_event_boxes=False,
1204
1193
  )
1205
- if added_rows:
1206
- selboxr = selected_r + new_data_numrows
1207
- else:
1208
- selboxr = selected_r_adjusted_new_data_numrows
1209
- if added_cols:
1210
- selboxc = selected_c + new_data_numcols
1211
- else:
1212
- selboxc = selected_c_adjusted_new_data_numcols
1194
+ selboxr = selected_r + new_data_numrows if added_rows else selected_r_adjusted_new_data_numrows
1195
+ selboxc = selected_c + new_data_numcols if added_cols else selected_c_adjusted_new_data_numcols
1213
1196
  self.deselect("all", redraw=False)
1214
1197
  self.set_currently_selected(
1215
1198
  *curr_coords,
@@ -1225,15 +1208,7 @@ class MainTable(tk.Canvas):
1225
1208
  )
1226
1209
  event_data["selection_boxes"] = self.get_boxes()
1227
1210
  event_data["selected"] = self.selected
1228
- self.see(
1229
- r=selected_r,
1230
- c=selected_c,
1231
- keep_yscroll=False,
1232
- keep_xscroll=False,
1233
- bottom_right_corner=False,
1234
- check_cell_visibility=True,
1235
- redraw=False,
1236
- )
1211
+ self.see(selected_r, selected_c, redraw=False)
1237
1212
  self.refresh()
1238
1213
  if event_data["cells"]["table"] or event_data["added"]["rows"] or event_data["added"]["columns"]:
1239
1214
  self.undo_stack.append(stored_event_dict(event_data))
@@ -1242,7 +1217,7 @@ class MainTable(tk.Canvas):
1242
1217
  self.PAR.emit_event("<<Paste>>", event_data)
1243
1218
  return event_data
1244
1219
 
1245
- def delete_key(self, event: object = None, validation: bool = True) -> None | EventDataDict:
1220
+ def delete_key(self, event: Any = None, validation: bool = True) -> None | EventDataDict:
1246
1221
  if not self.selected:
1247
1222
  return
1248
1223
  event_data = self.new_event_dict("edit_table")
@@ -1276,7 +1251,7 @@ class MainTable(tk.Canvas):
1276
1251
  self.PAR.emit_event("<<Delete>>", event_data)
1277
1252
  return event_data
1278
1253
 
1279
- def event_data_set_cell(self, datarn: int, datacn: int, value: object, event_data: dict) -> EventDataDict:
1254
+ def event_data_set_cell(self, datarn: int, datacn: int, value: Any, event_data: dict) -> EventDataDict:
1280
1255
  if self.input_valid_for_cell(datarn, datacn, value):
1281
1256
  event_data["cells"]["table"][(datarn, datacn)] = self.get_cell_data(datarn, datacn)
1282
1257
  self.set_cell_data(datarn, datacn, value)
@@ -1421,7 +1396,7 @@ class MainTable(tk.Canvas):
1421
1396
  "c",
1422
1397
  )
1423
1398
  # add cell/col kwargs for columns that are new to the span
1424
- old_span_idxs = set(full_new_idxs[k] for k in range(span["from_c"], oldupto_colrange))
1399
+ old_span_idxs = {full_new_idxs[k] for k in range(span["from_c"], oldupto_colrange)}
1425
1400
  for k in range(newfrom, newupto_colrange):
1426
1401
  if k not in old_span_idxs:
1427
1402
  oldidx = full_old_idxs[k]
@@ -1659,7 +1634,7 @@ class MainTable(tk.Canvas):
1659
1634
  "r",
1660
1635
  )
1661
1636
  # add cell/row kwargs for rows that are new to the span
1662
- old_span_idxs = set(full_new_idxs[k] for k in range(span["from_r"], oldupto_rowrange))
1637
+ old_span_idxs = {full_new_idxs[k] for k in range(span["from_r"], oldupto_rowrange)}
1663
1638
  for k in range(newfrom, newupto_rowrange):
1664
1639
  if k not in old_span_idxs:
1665
1640
  oldidx = full_old_idxs[k]
@@ -1742,7 +1717,7 @@ class MainTable(tk.Canvas):
1742
1717
  # finally, change the span coords
1743
1718
  span["from_r"], span["upto_r"] = newfrom, newupto
1744
1719
 
1745
- if move_heights and disp_new_idxs:
1720
+ if (not self.PAR.ops.treeview or not undo_modification) and (move_heights and disp_new_idxs):
1746
1721
  self.set_row_positions(
1747
1722
  itr=move_elements_by_mapping_gen(
1748
1723
  self.get_row_heights(),
@@ -1805,7 +1780,7 @@ class MainTable(tk.Canvas):
1805
1780
  )
1806
1781
  )
1807
1782
 
1808
- def undo(self, event: object = None) -> None | EventDataDict:
1783
+ def undo(self, event: Any = None) -> None | EventDataDict:
1809
1784
  if not self.undo_stack:
1810
1785
  return
1811
1786
  modification = self.undo_stack[-1]["data"]
@@ -1819,7 +1794,7 @@ class MainTable(tk.Canvas):
1819
1794
  self.PAR.emit_event("<<Undo>>", event_data)
1820
1795
  return event_data
1821
1796
 
1822
- def redo(self, event: object = None) -> None | EventDataDict:
1797
+ def redo(self, event: Any = None) -> None | EventDataDict:
1823
1798
  if not self.redo_stack:
1824
1799
  return
1825
1800
  modification = self.redo_stack[-1]["data"]
@@ -2048,15 +2023,7 @@ class MainTable(tk.Canvas):
2048
2023
  )
2049
2024
 
2050
2025
  if self.selected:
2051
- self.see(
2052
- r=self.selected.row,
2053
- c=self.selected.column,
2054
- keep_yscroll=False,
2055
- keep_xscroll=False,
2056
- bottom_right_corner=False,
2057
- check_cell_visibility=True,
2058
- redraw=False,
2059
- )
2026
+ self.see(self.selected.row, self.selected.column, redraw=False)
2060
2027
 
2061
2028
  self.refresh()
2062
2029
  return event_data
@@ -2067,18 +2034,27 @@ class MainTable(tk.Canvas):
2067
2034
  c: int | None = None,
2068
2035
  keep_yscroll: bool = False,
2069
2036
  keep_xscroll: bool = False,
2070
- bottom_right_corner: bool = False,
2037
+ bottom_right_corner: bool | None = None,
2071
2038
  check_cell_visibility: bool = True,
2072
2039
  redraw: bool = True,
2073
2040
  r_pc: float = 0.0,
2074
2041
  c_pc: float = 0.0,
2075
2042
  ) -> bool:
2076
2043
  need_redraw = False
2077
- yvis, xvis = False, False
2078
- if check_cell_visibility:
2079
- yvis, xvis = self.cell_completely_visible(r=r, c=c, separate_axes=True)
2080
- if not yvis and len(self.row_positions) > 1:
2081
- if bottom_right_corner:
2044
+ vis_info = self.cell_visibility_info(r, c)
2045
+ yvis, xvis = vis_info["yvis"], vis_info["xvis"]
2046
+ top_left_x, top_left_y, bottom_right_x, bottom_right_y = vis_info["visible_region"]
2047
+ x1, y1, x2, y2 = vis_info["cell_coords"]
2048
+ # y scroll
2049
+ if not check_cell_visibility or (check_cell_visibility and not yvis) and len(self.row_positions) > 1:
2050
+ if bottom_right_corner is None:
2051
+ both_above = y1 < top_left_y and y2 < top_left_y
2052
+ y1_above_y2_below = y1 < top_left_y and y2 > bottom_right_y
2053
+ y1_above_y2_visible = y1 < top_left_y and top_left_y <= y2 <= bottom_right_y
2054
+ brc = not (both_above or y1_above_y2_below or y1_above_y2_visible)
2055
+ else:
2056
+ brc = bottom_right_corner
2057
+ if brc:
2082
2058
  if r is not None and not keep_yscroll:
2083
2059
  winfo_height = self.winfo_height()
2084
2060
  if self.row_positions[r + 1] - self.row_positions[r] > winfo_height:
@@ -2104,8 +2080,16 @@ class MainTable(tk.Canvas):
2104
2080
  ]
2105
2081
  self.set_yviews(*args, redraw=False)
2106
2082
  need_redraw = True
2107
- if not xvis and len(self.col_positions) > 1:
2108
- if bottom_right_corner:
2083
+ # x scroll
2084
+ if not check_cell_visibility or (check_cell_visibility and not xvis) and len(self.col_positions) > 1:
2085
+ if bottom_right_corner is None:
2086
+ both_left = x1 < top_left_x and x2 < top_left_x
2087
+ x1_left_x2_right = x1 < top_left_x and x2 > bottom_right_x
2088
+ x1_left_x2_visible = x1 < top_left_x and top_left_x <= x2 <= bottom_right_x
2089
+ brc = not (both_left or x1_left_x2_right or x1_left_x2_visible)
2090
+ else:
2091
+ brc = bottom_right_corner
2092
+ if brc:
2109
2093
  if c is not None and not keep_xscroll:
2110
2094
  winfo_width = self.winfo_width()
2111
2095
  if self.col_positions[c + 1] - self.col_positions[c] > winfo_width:
@@ -2144,17 +2128,24 @@ class MainTable(tk.Canvas):
2144
2128
  0 if not r else self.row_positions[r + 1],
2145
2129
  )
2146
2130
 
2147
- def cell_completely_visible(
2131
+ def cell_completely_visible(self, r: int | None = 0, c: int | None = 0) -> bool:
2132
+ cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
2133
+ x1, y1, x2, y2 = self.get_cell_coords(r, c)
2134
+ return cy1 <= y1 and cy2 >= y2 and cx1 <= x1 and cx2 >= x2
2135
+
2136
+ def cell_visibility_info(
2148
2137
  self,
2149
- r: int | None = 0,
2150
- c: int | None = 0,
2151
- separate_axes: bool = False,
2152
- ) -> bool | tuple[bool, bool]:
2138
+ r: int,
2139
+ c: int,
2140
+ ) -> dict[Literal["yvis", "xvis", "visible_region", "cell_coords"], bool | tuple[int, int, int, int]]:
2153
2141
  cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
2154
2142
  x1, y1, x2, y2 = self.get_cell_coords(r, c)
2155
- x_vis = cx1 <= x1 and cx2 >= x2
2156
- y_vis = cy1 <= y1 and cy2 >= y2
2157
- return (y_vis, x_vis) if separate_axes else y_vis and x_vis
2143
+ return {
2144
+ "yvis": cy1 <= y1 and cy2 >= y2,
2145
+ "xvis": cx1 <= x1 and cx2 >= x2,
2146
+ "visible_region": (cx1, cy1, cx2, cy2),
2147
+ "cell_coords": (x1, y1, x2, y2),
2148
+ }
2158
2149
 
2159
2150
  def cell_visible(self, r: int = 0, c: int = 0) -> bool:
2160
2151
  cx1, cy1, cx2, cy2 = self.get_canvas_visible_area()
@@ -2184,7 +2175,7 @@ class MainTable(tk.Canvas):
2184
2175
  self.PAR.emit_event("<<SheetSelect>>", data=event_data)
2185
2176
  self.PAR.emit_event("<<SelectAll>>", data=event_data)
2186
2177
 
2187
- def select_columns(self, event: object) -> None:
2178
+ def select_columns(self, event: Any) -> None:
2188
2179
  if not self.selected:
2189
2180
  return
2190
2181
  r1, c1, r2, c2 = self.selection_boxes[self.selected.fill_iid].coords
@@ -2195,7 +2186,7 @@ class MainTable(tk.Canvas):
2195
2186
  item=self.CH.select_col(range(c1, c2), redraw=True),
2196
2187
  )
2197
2188
 
2198
- def select_rows(self, event: object) -> None:
2189
+ def select_rows(self, event: Any) -> None:
2199
2190
  if not self.selected:
2200
2191
  return
2201
2192
  r1, c1, r2, c2 = self.selection_boxes[self.selected.fill_iid].coords
@@ -2206,12 +2197,12 @@ class MainTable(tk.Canvas):
2206
2197
  item=self.RI.select_row(range(r1, r2), redraw=True),
2207
2198
  )
2208
2199
 
2209
- def select_row_start(self, event: object) -> None:
2200
+ def select_row_start(self, event: Any) -> None:
2210
2201
  if self.selected:
2211
2202
  self.see(self.selected.row, 0)
2212
2203
  self.select_cell(self.selected.row, 0, redraw=True)
2213
2204
 
2214
- def select_a1(self, event: object) -> None:
2205
+ def select_a1(self, event: Any) -> None:
2215
2206
  if len(self.row_positions) > 1 and len(self.col_positions) > 1:
2216
2207
  self.see(0, 0)
2217
2208
  self.select_cell(0, 0, redraw=True)
@@ -2301,10 +2292,10 @@ class MainTable(tk.Canvas):
2301
2292
  curr_box = self.selected.fill_iid
2302
2293
  if r == "all" or (r is None and c is None and cell is None):
2303
2294
  self.hide_dropdown_editor_all_canvases()
2304
- for item, box in self.get_selection_items():
2295
+ for item, _ in self.get_selection_items():
2305
2296
  self.hide_selection_box(item)
2306
2297
  elif r in ("allrows", "allcols"):
2307
- for item, box in self.get_selection_items(
2298
+ for item, _ in self.get_selection_items(
2308
2299
  columns=r == "allcols",
2309
2300
  rows=r == "allrows",
2310
2301
  cells=False,
@@ -2471,7 +2462,7 @@ class MainTable(tk.Canvas):
2471
2462
  if redraw:
2472
2463
  self.refresh()
2473
2464
 
2474
- def page_UP(self, event: object = None) -> None:
2465
+ def page_UP(self, event: Any = None) -> None:
2475
2466
  height = self.winfo_height()
2476
2467
  top = self.canvasy(0)
2477
2468
  scrollto_y = max(0, top - height)
@@ -2496,7 +2487,7 @@ class MainTable(tk.Canvas):
2496
2487
  self.RI.yview(*args)
2497
2488
  self.main_table_redraw_grid_and_text(redraw_row_index=True)
2498
2489
 
2499
- def page_DOWN(self, event: object = None) -> None:
2490
+ def page_DOWN(self, event: Any = None) -> None:
2500
2491
  height = self.winfo_height()
2501
2492
  top = self.canvasy(0)
2502
2493
  scrollto = top + height
@@ -2526,159 +2517,85 @@ class MainTable(tk.Canvas):
2526
2517
  self.RI.yview(*args)
2527
2518
  self.main_table_redraw_grid_and_text(redraw_row_index=True)
2528
2519
 
2529
- def arrowkey_UP(self, event: object = None) -> None:
2520
+ def arrowkey_UP(self, event: Any = None) -> None:
2530
2521
  if not self.selected:
2531
2522
  return
2532
- if self.selected.type_ == "rows":
2533
- r = self.selected.row
2534
- if r and self.RI.row_selection_enabled:
2535
- if self.cell_completely_visible(r=r - 1, c=0):
2536
- self.RI.select_row(r - 1, redraw=True)
2537
- else:
2538
- self.RI.select_row(r - 1)
2539
- self.see(r - 1, 0, keep_xscroll=True, check_cell_visibility=False)
2540
- elif self.selected.type_ in ("cells", "columns"):
2541
- r = self.selected.row
2542
- c = self.selected.column
2543
- if not r and self.CH.col_selection_enabled and not self.cell_completely_visible(r=r, c=c):
2544
- self.see(r, c, check_cell_visibility=False)
2545
- elif r and (self.single_selection_enabled or self.toggle_selection_enabled):
2546
- if self.cell_completely_visible(r=r - 1, c=c):
2547
- self.select_cell(r - 1, c, redraw=True)
2548
- else:
2549
- self.select_cell(r - 1, c)
2550
- self.see(r - 1, c, keep_xscroll=True, check_cell_visibility=False)
2523
+ r = self.selected.row
2524
+ c = self.selected.column
2525
+ if not r:
2526
+ self.see(r, c)
2527
+ else:
2528
+ self.see(r - 1, c, redraw=False)
2529
+ if self.selected.type_ == "rows" and self.RI.row_selection_enabled:
2530
+ self.RI.select_row(r - 1, redraw=True)
2531
+
2532
+ elif self.selected.type_ in ("cells", "columns") and (
2533
+ self.single_selection_enabled or self.toggle_selection_enabled
2534
+ ):
2535
+ self.select_cell(r - 1, c, redraw=True)
2551
2536
 
2552
- def arrowkey_DOWN(self, event: object = None) -> None:
2537
+ def arrowkey_LEFT(self, event: Any = None) -> None:
2553
2538
  if not self.selected:
2554
2539
  return
2555
- if self.selected.type_ == "rows":
2556
- r = self.selected.row
2557
- if r < len(self.row_positions) - 2 and self.RI.row_selection_enabled:
2558
- if self.cell_completely_visible(r=r + 1, c=0):
2559
- self.RI.select_row(r + 1, redraw=True)
2560
- else:
2561
- self.RI.select_row(r + 1)
2562
- self.see(
2563
- r + 1,
2564
- 0,
2565
- keep_xscroll=True,
2566
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2567
- check_cell_visibility=False,
2568
- )
2569
-
2570
- elif self.selected.type_ == "columns":
2571
- c = self.selected.column
2572
- if self.single_selection_enabled or self.toggle_selection_enabled:
2573
- if self.selected.row == len(self.row_positions) - 2:
2574
- r = self.selected.row
2575
- else:
2576
- r = self.selected.row + 1
2577
- if self.cell_completely_visible(r=r, c=c):
2578
- self.select_cell(r, c, redraw=True)
2579
- else:
2580
- self.select_cell(r, c)
2581
- self.see(
2582
- r,
2583
- c,
2584
- check_cell_visibility=False,
2585
- )
2540
+ r = self.selected.row
2541
+ c = self.selected.column
2542
+ if not c:
2543
+ self.see(r, c)
2586
2544
  else:
2587
- r = self.selected.row
2588
- c = self.selected.column
2589
- if r < len(self.row_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2590
- if self.cell_completely_visible(r=r + 1, c=c):
2591
- self.select_cell(r + 1, c, redraw=True)
2592
- else:
2593
- self.select_cell(r + 1, c)
2594
- self.see(
2595
- r + 1,
2596
- c,
2597
- keep_xscroll=True,
2598
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2599
- check_cell_visibility=False,
2600
- )
2545
+ self.see(r, c - 1, redraw=False)
2546
+ if self.selected.type_ == "columns" and self.CH.col_selection_enabled:
2547
+ self.CH.select_col(c - 1, redraw=True)
2548
+
2549
+ elif self.selected.type_ in ("cells", "rows") and (
2550
+ self.single_selection_enabled or self.toggle_selection_enabled
2551
+ ):
2552
+ self.select_cell(r, c - 1, redraw=True)
2601
2553
 
2602
- def arrowkey_LEFT(self, event: object = None) -> None:
2554
+ def arrowkey_DOWN(self, event: Any = None) -> None:
2603
2555
  if not self.selected:
2604
2556
  return
2605
- if self.selected.type_ == "columns":
2606
- c = self.selected.column
2607
- if c and self.CH.col_selection_enabled:
2608
- if self.cell_completely_visible(r=0, c=c - 1):
2609
- self.CH.select_col(c - 1, redraw=True)
2610
- else:
2611
- self.CH.select_col(c - 1)
2612
- self.see(
2613
- 0,
2614
- c - 1,
2615
- keep_yscroll=True,
2616
- bottom_right_corner=True,
2617
- check_cell_visibility=False,
2618
- )
2619
- elif self.selected.type_ == "rows" and self.selected.column:
2620
- self.select_cell(self.selected.row, self.selected.column - 1)
2621
- self.see(self.selected.row, self.selected.column, check_cell_visibility=True)
2622
- elif self.selected.type_ == "cells":
2623
- r = self.selected.row
2624
- c = self.selected.column
2625
- if not c and not self.cell_completely_visible(r=r, c=c):
2626
- self.see(r, c, keep_yscroll=True, check_cell_visibility=False)
2627
- elif c and (self.single_selection_enabled or self.toggle_selection_enabled):
2628
- if self.cell_completely_visible(r=r, c=c - 1):
2629
- self.select_cell(r, c - 1, redraw=True)
2630
- else:
2631
- self.select_cell(r, c - 1)
2632
- self.see(r, c - 1, keep_yscroll=True, check_cell_visibility=False)
2557
+ r = self.selected.row
2558
+ c = self.selected.column
2559
+ if self.selected.row == len(self.row_positions) - 2:
2560
+ self.see(r, c)
2561
+ else:
2562
+ brc = False if self.PAR.ops.arrow_key_down_right_scroll_page else None
2563
+ self.see(
2564
+ r + 1,
2565
+ c,
2566
+ bottom_right_corner=brc,
2567
+ redraw=False,
2568
+ )
2569
+ if self.selected.type_ == "rows" and self.RI.row_selection_enabled:
2570
+ self.RI.select_row(r + 1, redraw=True)
2571
+
2572
+ elif self.selected.type_ in ("cells", "columns") and (
2573
+ self.single_selection_enabled or self.toggle_selection_enabled
2574
+ ):
2575
+ self.select_cell(r + 1, c, redraw=True)
2633
2576
 
2634
- def arrowkey_RIGHT(self, event: object = None) -> None:
2577
+ def arrowkey_RIGHT(self, event: Any = None) -> None:
2635
2578
  if not self.selected:
2636
2579
  return
2637
- if self.selected.type_ == "rows":
2638
- r = self.selected.row
2639
- if self.single_selection_enabled or self.toggle_selection_enabled:
2640
- if self.selected.column == len(self.col_positions) - 2:
2641
- c = self.selected.column
2642
- else:
2643
- c = self.selected.column + 1
2644
- if self.cell_completely_visible(r=r, c=c):
2645
- self.select_cell(r, c, redraw=True)
2646
- else:
2647
- self.select_cell(r, c)
2648
- self.see(
2649
- r,
2650
- c,
2651
- check_cell_visibility=False,
2652
- )
2653
- elif self.selected.type_ == "columns":
2654
- c = self.selected.column
2655
- if c < len(self.col_positions) - 2 and self.CH.col_selection_enabled:
2656
- if self.cell_completely_visible(r=0, c=c + 1):
2657
- self.CH.select_col(c + 1, redraw=True)
2658
- else:
2659
- self.CH.select_col(c + 1)
2660
- self.see(
2661
- 0,
2662
- c + 1,
2663
- keep_yscroll=True,
2664
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2665
- check_cell_visibility=False,
2666
- )
2580
+ r = self.selected.row
2581
+ c = self.selected.column
2582
+ if self.selected.column == len(self.col_positions) - 2:
2583
+ self.see(r, c)
2667
2584
  else:
2668
- r = self.selected.row
2669
- c = self.selected.column
2670
- if c < len(self.col_positions) - 2 and (self.single_selection_enabled or self.toggle_selection_enabled):
2671
- if self.cell_completely_visible(r=r, c=c + 1):
2672
- self.select_cell(r, c + 1, redraw=True)
2673
- else:
2674
- self.select_cell(r, c + 1)
2675
- self.see(
2676
- r,
2677
- c + 1,
2678
- keep_yscroll=True,
2679
- bottom_right_corner=False if self.PAR.ops.arrow_key_down_right_scroll_page else True,
2680
- check_cell_visibility=False,
2681
- )
2585
+ brc = False if self.PAR.ops.arrow_key_down_right_scroll_page else None
2586
+ self.see(
2587
+ r,
2588
+ c + 1,
2589
+ bottom_right_corner=brc,
2590
+ redraw=False,
2591
+ )
2592
+ if self.selected.type_ == "columns" and self.CH.col_selection_enabled:
2593
+ self.CH.select_col(c + 1, redraw=True)
2594
+
2595
+ elif self.selected.type_ in ("cells", "rows") and (
2596
+ self.single_selection_enabled or self.toggle_selection_enabled
2597
+ ):
2598
+ self.select_cell(r, c + 1, redraw=True)
2682
2599
 
2683
2600
  def shift_arrowkey_select_box(
2684
2601
  self,
@@ -2712,7 +2629,7 @@ class MainTable(tk.Canvas):
2712
2629
  self.see(see_r, see_c, keep_xscroll=keep_xscroll, keep_yscroll=keep_yscroll, redraw=False)
2713
2630
  self.refresh()
2714
2631
 
2715
- def shift_arrowkey_UP(self, event: object = None) -> None:
2632
+ def shift_arrowkey_UP(self, event: Any = None) -> None:
2716
2633
  if not self.selected:
2717
2634
  return
2718
2635
  r1, c1, r2, c2 = self.selected.box
@@ -2729,7 +2646,7 @@ class MainTable(tk.Canvas):
2729
2646
  see_r = r1
2730
2647
  self.shift_arrowkey_select_box(r1, c1, r2, c2, current_r, current_c, see_r, c1, keep_xscroll=True)
2731
2648
 
2732
- def shift_arrowkey_DOWN(self, event: object = None) -> None:
2649
+ def shift_arrowkey_DOWN(self, event: Any = None) -> None:
2733
2650
  if not self.selected:
2734
2651
  return
2735
2652
  r1, c1, r2, c2 = self.selected.box
@@ -2744,7 +2661,7 @@ class MainTable(tk.Canvas):
2744
2661
  see_r = r1
2745
2662
  self.shift_arrowkey_select_box(r1, c1, r2, c2, current_r, current_c, see_r, c1, keep_xscroll=True)
2746
2663
 
2747
- def shift_arrowkey_LEFT(self, event: object = None) -> None:
2664
+ def shift_arrowkey_LEFT(self, event: Any = None) -> None:
2748
2665
  if not self.selected:
2749
2666
  return
2750
2667
  r1, c1, r2, c2 = self.selected.box
@@ -2761,7 +2678,7 @@ class MainTable(tk.Canvas):
2761
2678
  see_c = c1
2762
2679
  self.shift_arrowkey_select_box(r1, c1, r2, c2, current_r, current_c, r1, see_c, keep_yscroll=True)
2763
2680
 
2764
- def shift_arrowkey_RIGHT(self, event: object = None) -> None:
2681
+ def shift_arrowkey_RIGHT(self, event: Any = None) -> None:
2765
2682
  if not self.selected:
2766
2683
  return
2767
2684
  r1, c1, r2, c2 = self.selected.box
@@ -3100,7 +3017,7 @@ class MainTable(tk.Canvas):
3100
3017
  **mnkwgs,
3101
3018
  )
3102
3019
 
3103
- def enable_bindings(self, bindings: object) -> None:
3020
+ def enable_bindings(self, bindings: Any) -> None:
3104
3021
  if not bindings:
3105
3022
  self._enable_binding("all")
3106
3023
  elif isinstance(bindings, (list, tuple)):
@@ -3114,7 +3031,7 @@ class MainTable(tk.Canvas):
3114
3031
  self._enable_binding(bindings.lower())
3115
3032
  self.create_rc_menus()
3116
3033
 
3117
- def disable_bindings(self, bindings: object) -> None:
3034
+ def disable_bindings(self, bindings: Any) -> None:
3118
3035
  if not bindings:
3119
3036
  self._disable_binding("all")
3120
3037
  elif isinstance(bindings, (list, tuple)):
@@ -3128,7 +3045,7 @@ class MainTable(tk.Canvas):
3128
3045
  self._disable_binding(bindings)
3129
3046
  self.create_rc_menus()
3130
3047
 
3131
- def _enable_binding(self, binding: str) -> None:
3048
+ def _enable_binding(self, binding: Binding) -> None:
3132
3049
  if binding == "enable_all":
3133
3050
  binding = "all"
3134
3051
  if binding in (
@@ -3273,7 +3190,7 @@ class MainTable(tk.Canvas):
3273
3190
  for binding in self.PAR.ops[bindings_key]:
3274
3191
  widget.bind(binding, func)
3275
3192
 
3276
- def _disable_binding(self, binding: str) -> None:
3193
+ def _disable_binding(self, binding: Binding) -> None:
3277
3194
  if binding == "disable_all":
3278
3195
  binding = "all"
3279
3196
  if binding in (
@@ -3412,14 +3329,14 @@ class MainTable(tk.Canvas):
3412
3329
  self.CH.rsz_w = None
3413
3330
  self.CH.rsz_h = None
3414
3331
 
3415
- def mouse_motion(self, event: object):
3332
+ def mouse_motion(self, event: Any) -> None:
3416
3333
  self.reset_mouse_motion_creations()
3417
3334
  try_binding(self.extra_motion_func, event)
3418
3335
 
3419
3336
  def not_currently_resizing(self) -> bool:
3420
3337
  return all(v is None for v in (self.RI.rsz_h, self.RI.rsz_w, self.CH.rsz_h, self.CH.rsz_w))
3421
3338
 
3422
- def rc(self, event=None):
3339
+ def rc(self, event: Any = None) -> None:
3423
3340
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
3424
3341
  self.focus_set()
3425
3342
  popup_menu = None
@@ -3452,7 +3369,7 @@ class MainTable(tk.Canvas):
3452
3369
  if popup_menu:
3453
3370
  popup_menu.tk_popup(event.x_root, event.y_root)
3454
3371
 
3455
- def b1_press(self, event=None):
3372
+ def b1_press(self, event: Any = None) -> None:
3456
3373
  self.closed_dropdown = self.mouseclick_outside_editor_or_dropdown_all_canvases()
3457
3374
  self.focus_set()
3458
3375
  if (
@@ -3474,7 +3391,9 @@ class MainTable(tk.Canvas):
3474
3391
  self.b1_pressed_loc = (r, c)
3475
3392
  try_binding(self.extra_b1_press_func, event)
3476
3393
 
3477
- def create_resize_line(self, x1, y1, x2, y2, width, fill, tag):
3394
+ def create_resize_line(
3395
+ self, x1: int, y1: int, x2: int, y2: int, width: int, fill: str, tag: str | tuple[str]
3396
+ ) -> None:
3478
3397
  if self.hidd_resize_lines:
3479
3398
  t, sh = self.hidd_resize_lines.popitem()
3480
3399
  self.coords(t, x1, y1, x2, y2)
@@ -3487,7 +3406,7 @@ class MainTable(tk.Canvas):
3487
3406
  t = self.create_line(x1, y1, x2, y2, width=width, fill=fill, tags=tag)
3488
3407
  self.disp_resize_lines[t] = True
3489
3408
 
3490
- def delete_resize_lines(self):
3409
+ def delete_resize_lines(self) -> None:
3491
3410
  self.hidd_resize_lines.update(self.disp_resize_lines)
3492
3411
  self.disp_resize_lines = {}
3493
3412
  for t, sh in self.hidd_resize_lines.items():
@@ -3495,7 +3414,7 @@ class MainTable(tk.Canvas):
3495
3414
  self.itemconfig(t, state="hidden")
3496
3415
  self.hidd_resize_lines[t] = False
3497
3416
 
3498
- def ctrl_b1_press(self, event=None):
3417
+ def ctrl_b1_press(self, event: Any = None) -> None:
3499
3418
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
3500
3419
  self.focus_set()
3501
3420
  self.ctrl_b1_pressed = True
@@ -3513,7 +3432,7 @@ class MainTable(tk.Canvas):
3513
3432
  elif not self.ctrl_select_enabled:
3514
3433
  self.b1_press(event)
3515
3434
 
3516
- def ctrl_shift_b1_press(self, event=None):
3435
+ def ctrl_shift_b1_press(self, event: Any = None) -> None:
3517
3436
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
3518
3437
  self.focus_set()
3519
3438
  self.ctrl_b1_pressed = True
@@ -3541,7 +3460,7 @@ class MainTable(tk.Canvas):
3541
3460
  elif not self.ctrl_select_enabled:
3542
3461
  self.shift_b1_press(event)
3543
3462
 
3544
- def shift_b1_press(self, event=None):
3463
+ def shift_b1_press(self, event: Any = None) -> None:
3545
3464
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
3546
3465
  self.focus_set()
3547
3466
  if self.drag_selection_enabled and self.not_currently_resizing():
@@ -3568,7 +3487,7 @@ class MainTable(tk.Canvas):
3568
3487
  try_binding(self.shift_selection_binding_func, sel_event)
3569
3488
  self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
3570
3489
 
3571
- def get_shift_select_box(self, min_r: int, rowsel: int, min_c: int, colsel: int):
3490
+ def get_shift_select_box(self, min_r: int, rowsel: int, min_c: int, colsel: int) -> tuple[int, int, int, int]:
3572
3491
  if rowsel >= min_r and colsel >= min_c:
3573
3492
  return min_r, min_c, rowsel + 1, colsel + 1
3574
3493
  elif rowsel >= min_r and min_c >= colsel:
@@ -3578,7 +3497,13 @@ class MainTable(tk.Canvas):
3578
3497
  elif min_r >= rowsel and min_c >= colsel:
3579
3498
  return rowsel, colsel, min_r + 1, min_c + 1
3580
3499
 
3581
- def get_b1_motion_box(self, start_row: int, start_col: int, end_row: int, end_col: int):
3500
+ def get_b1_motion_box(
3501
+ self,
3502
+ start_row: int,
3503
+ start_col: int,
3504
+ end_row: int,
3505
+ end_col: int,
3506
+ ) -> tuple[int, int, int, int, Literal["cells"]]:
3582
3507
  if end_row >= start_row and end_col >= start_col and (end_row - start_row or end_col - start_col):
3583
3508
  return start_row, start_col, end_row + 1, end_col + 1, "cells"
3584
3509
  elif end_row >= start_row and end_col < start_col and (end_row - start_row or start_col - end_col):
@@ -3590,7 +3515,7 @@ class MainTable(tk.Canvas):
3590
3515
  else:
3591
3516
  return start_row, start_col, start_row + 1, start_col + 1, "cells"
3592
3517
 
3593
- def b1_motion(self, event: object):
3518
+ def b1_motion(self, event: Any) -> None:
3594
3519
  if self.drag_selection_enabled and all(
3595
3520
  v is None
3596
3521
  for v in (
@@ -3638,7 +3563,7 @@ class MainTable(tk.Canvas):
3638
3563
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True, redraw_table=True)
3639
3564
  try_binding(self.extra_b1_motion_func, event)
3640
3565
 
3641
- def ctrl_b1_motion(self, event: object):
3566
+ def ctrl_b1_motion(self, event: Any) -> None:
3642
3567
  if self.ctrl_select_enabled and self.drag_selection_enabled and self.not_currently_resizing():
3643
3568
  need_redraw = False
3644
3569
  end_row = self.identify_row(y=event.y)
@@ -3681,7 +3606,7 @@ class MainTable(tk.Canvas):
3681
3606
  elif not self.ctrl_select_enabled:
3682
3607
  self.b1_motion(event)
3683
3608
 
3684
- def b1_release(self, event=None):
3609
+ def b1_release(self, event: Any = None) -> None:
3685
3610
  to_hide = self.being_drawn_item
3686
3611
  if self.being_drawn_item is not None and (to_sel := self.coords_and_type(self.being_drawn_item)):
3687
3612
  r_to_sel, c_to_sel = self.selected.row, self.selected.column
@@ -3731,7 +3656,7 @@ class MainTable(tk.Canvas):
3731
3656
  self.closed_dropdown = None
3732
3657
  try_binding(self.extra_b1_release_func, event)
3733
3658
 
3734
- def double_b1(self, event=None):
3659
+ def double_b1(self, event: Any = None) -> None:
3735
3660
  self.mouseclick_outside_editor_or_dropdown_all_canvases()
3736
3661
  self.focus_set()
3737
3662
  if (
@@ -3755,7 +3680,7 @@ class MainTable(tk.Canvas):
3755
3680
  self.open_cell(event)
3756
3681
  try_binding(self.extra_double_b1_func, event)
3757
3682
 
3758
- def identify_row(self, event=None, y=None, allow_end=True):
3683
+ def identify_row(self, event: Any = None, y: int | None = None, allow_end: bool = True) -> int | None:
3759
3684
  if event is None:
3760
3685
  y2 = self.canvasy(y)
3761
3686
  elif y is None:
@@ -3767,7 +3692,7 @@ class MainTable(tk.Canvas):
3767
3692
  return None
3768
3693
  return r
3769
3694
 
3770
- def identify_col(self, event=None, x=None, allow_end=True):
3695
+ def identify_col(self, event: Any = None, x: int | None = None, allow_end: bool = True) -> int | None:
3771
3696
  if event is None:
3772
3697
  x2 = self.canvasx(x)
3773
3698
  elif x is None:
@@ -3799,7 +3724,7 @@ class MainTable(tk.Canvas):
3799
3724
  if self.show_index:
3800
3725
  self.RI.yview("moveto", 1)
3801
3726
 
3802
- def scroll_if_event_offscreen(self, event: object) -> bool:
3727
+ def scroll_if_event_offscreen(self, event: Any) -> bool:
3803
3728
  need_redraw = False
3804
3729
  if self.data:
3805
3730
  xcheck = self.xview()
@@ -3838,7 +3763,7 @@ class MainTable(tk.Canvas):
3838
3763
  self.y_move_synced_scrolls("moveto", self.yview()[0])
3839
3764
  return need_redraw
3840
3765
 
3841
- def x_move_synced_scrolls(self, *args, redraw: bool = True, use_scrollbar: bool = False):
3766
+ def x_move_synced_scrolls(self, *args: Any, redraw: bool = True, use_scrollbar: bool = False) -> None:
3842
3767
  for widget in self.synced_scrolls:
3843
3768
  # try:
3844
3769
  if hasattr(widget, "MT"):
@@ -3851,7 +3776,7 @@ class MainTable(tk.Canvas):
3851
3776
  # except Exception:
3852
3777
  # continue
3853
3778
 
3854
- def y_move_synced_scrolls(self, *args, redraw: bool = True, use_scrollbar: bool = False):
3779
+ def y_move_synced_scrolls(self, *args: Any, redraw: bool = True, use_scrollbar: bool = False) -> None:
3855
3780
  for widget in self.synced_scrolls:
3856
3781
  # try:
3857
3782
  if hasattr(widget, "MT"):
@@ -3864,7 +3789,7 @@ class MainTable(tk.Canvas):
3864
3789
  # except Exception:
3865
3790
  # continue
3866
3791
 
3867
- def _xscrollbar(self, *args, move_synced: bool = True):
3792
+ def _xscrollbar(self, *args: Any, move_synced: bool = True) -> None:
3868
3793
  self.xview(*args)
3869
3794
  if self.show_header:
3870
3795
  self.CH.xview(*args)
@@ -3872,7 +3797,7 @@ class MainTable(tk.Canvas):
3872
3797
  if move_synced:
3873
3798
  self.x_move_synced_scrolls(*args, use_scrollbar=True)
3874
3799
 
3875
- def _yscrollbar(self, *args, move_synced: bool = True):
3800
+ def _yscrollbar(self, *args: Any, move_synced: bool = True) -> None:
3876
3801
  self.yview(*args)
3877
3802
  if self.show_index:
3878
3803
  self.RI.yview(*args)
@@ -3882,7 +3807,7 @@ class MainTable(tk.Canvas):
3882
3807
 
3883
3808
  def set_xviews(
3884
3809
  self,
3885
- *args,
3810
+ *args: Any,
3886
3811
  move_synced: bool = True,
3887
3812
  redraw: bool = True,
3888
3813
  ) -> None:
@@ -3902,7 +3827,7 @@ class MainTable(tk.Canvas):
3902
3827
 
3903
3828
  def set_yviews(
3904
3829
  self,
3905
- *args,
3830
+ *args: Any,
3906
3831
  move_synced: bool = True,
3907
3832
  redraw: bool = True,
3908
3833
  ) -> None:
@@ -3924,7 +3849,7 @@ class MainTable(tk.Canvas):
3924
3849
  self.set_xviews(*x_args)
3925
3850
  self.set_yviews(*y_args)
3926
3851
 
3927
- def mousewheel(self, event: object) -> None:
3852
+ def mousewheel(self, event: Any) -> None:
3928
3853
  if event.delta < 0 or event.num == 5:
3929
3854
  self.yview_scroll(1, "units")
3930
3855
  self.RI.yview_scroll(1, "units")
@@ -3937,7 +3862,7 @@ class MainTable(tk.Canvas):
3937
3862
  self.y_move_synced_scrolls("moveto", self.yview()[0])
3938
3863
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
3939
3864
 
3940
- def shift_mousewheel(self, event: object) -> None:
3865
+ def shift_mousewheel(self, event: Any) -> None:
3941
3866
  if event.delta < 0 or event.num == 5:
3942
3867
  self.xview_scroll(1, "units")
3943
3868
  self.CH.xview_scroll(1, "units")
@@ -3950,13 +3875,13 @@ class MainTable(tk.Canvas):
3950
3875
  self.x_move_synced_scrolls("moveto", self.xview()[0])
3951
3876
  self.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
3952
3877
 
3953
- def ctrl_mousewheel(self, event):
3878
+ def ctrl_mousewheel(self, event: Any) -> None:
3954
3879
  if event.delta < 0 or event.num == 5:
3955
3880
  self.zoom_out()
3956
3881
  elif event.delta >= 0 or event.num == 4:
3957
3882
  self.zoom_in()
3958
3883
 
3959
- def zoom_in(self, event=None):
3884
+ def zoom_in(self, event: Any = None) -> None:
3960
3885
  self.zoom_font(
3961
3886
  (self.PAR.ops.table_font[0], self.PAR.ops.table_font[1] + 1, self.PAR.ops.table_font[2]),
3962
3887
  (self.PAR.ops.index_font[0], self.PAR.ops.index_font[1] + 1, self.PAR.ops.index_font[2]),
@@ -3964,7 +3889,7 @@ class MainTable(tk.Canvas):
3964
3889
  "in",
3965
3890
  )
3966
3891
 
3967
- def zoom_out(self, event=None):
3892
+ def zoom_out(self, event: Any = None) -> None:
3968
3893
  if self.PAR.ops.table_font[1] < 2 or self.PAR.ops.index_font[1] < 2 or self.PAR.ops.header_font[1] < 2:
3969
3894
  return
3970
3895
  self.zoom_font(
@@ -3974,7 +3899,13 @@ class MainTable(tk.Canvas):
3974
3899
  "out",
3975
3900
  )
3976
3901
 
3977
- def zoom_font(self, table_font: tuple, index_font: tuple, header_font: tuple, zoom: Literal["in", "out"]) -> None:
3902
+ def zoom_font(
3903
+ self,
3904
+ table_font: FontTuple,
3905
+ index_font: FontTuple,
3906
+ header_font: FontTuple,
3907
+ zoom: Literal["in", "out"],
3908
+ ) -> None:
3978
3909
  self.saved_column_widths = {}
3979
3910
  self.saved_row_heights = {}
3980
3911
  # should record position prior to change and then see after change
@@ -4129,7 +4060,7 @@ class MainTable(tk.Canvas):
4129
4060
  self.recreate_all_selection_boxes()
4130
4061
  return self.PAR.ops.index_font
4131
4062
 
4132
- def set_index_font_help(self):
4063
+ def set_index_font_help(self) -> None:
4133
4064
  self.RI.index_font = self.PAR.ops.index_font
4134
4065
  if self.PAR.ops.index_font not in self.char_widths:
4135
4066
  self.char_widths[self.PAR.ops.index_font] = {}
@@ -4169,7 +4100,7 @@ class MainTable(tk.Canvas):
4169
4100
  self.recreate_all_selection_boxes()
4170
4101
  return self.PAR.ops.header_font
4171
4102
 
4172
- def set_header_font_help(self):
4103
+ def set_header_font_help(self) -> None:
4173
4104
  self.CH.header_font = self.PAR.ops.header_font
4174
4105
  if self.PAR.ops.header_font not in self.char_widths:
4175
4106
  self.char_widths[self.PAR.ops.header_font] = {}
@@ -4183,11 +4114,11 @@ class MainTable(tk.Canvas):
4183
4114
  self.PAR.ops.default_header_height = int(self.min_header_height)
4184
4115
  self.CH.set_height(self.get_default_header_height(), set_TL=True)
4185
4116
 
4186
- def purge_undo_and_redo_stack(self):
4117
+ def purge_undo_and_redo_stack(self) -> None:
4187
4118
  self.undo_stack = deque(maxlen=self.PAR.ops.max_undos)
4188
4119
  self.redo_stack = deque(maxlen=self.PAR.ops.max_undos)
4189
4120
 
4190
- def purge_redo_stack(self):
4121
+ def purge_redo_stack(self) -> None:
4191
4122
  self.redo_stack = deque(maxlen=self.PAR.ops.max_undos)
4192
4123
 
4193
4124
  def data_reference(
@@ -4198,7 +4129,7 @@ class MainTable(tk.Canvas):
4198
4129
  redraw: bool = False,
4199
4130
  return_id: bool = True,
4200
4131
  keep_formatting: bool = True,
4201
- ) -> object:
4132
+ ) -> Any:
4202
4133
  if isinstance(newdataref, (list, tuple)):
4203
4134
  self.hide_dropdown_editor_all_canvases()
4204
4135
  self.data = newdataref
@@ -4218,7 +4149,7 @@ class MainTable(tk.Canvas):
4218
4149
  else:
4219
4150
  return self.data
4220
4151
 
4221
- def get_cell_dimensions(self, datarn, datacn):
4152
+ def get_cell_dimensions(self, datarn: int, datacn: int) -> tuple[int, int]:
4222
4153
  txt = self.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
4223
4154
  if txt:
4224
4155
  self.txt_measure_canvas.itemconfig(self.txt_measure_canvas_text, text=txt, font=self.PAR.ops.table_font)
@@ -4232,7 +4163,9 @@ class MainTable(tk.Canvas):
4232
4163
  return w + self.table_txt_height, h
4233
4164
  return w, h
4234
4165
 
4235
- def set_cell_size_to_text(self, r, c, only_if_too_small=False, redraw: bool = True, run_binding=False):
4166
+ def set_cell_size_to_text(
4167
+ self, r: int, c: int, only_if_too_small: bool = False, redraw: bool = True, run_binding: bool = False
4168
+ ) -> bool:
4236
4169
  min_column_width = self.PAR.ops.min_column_width
4237
4170
  min_rh = self.min_row_height
4238
4171
  w = min_column_width
@@ -4303,6 +4236,7 @@ class MainTable(tk.Canvas):
4303
4236
  return True
4304
4237
  else:
4305
4238
  return False
4239
+ return False
4306
4240
 
4307
4241
  def get_cell_max_width(self, datarn: int, dispcn: int) -> int:
4308
4242
  datacn = self.datacn(dispcn)
@@ -4375,14 +4309,8 @@ class MainTable(tk.Canvas):
4375
4309
  qfont = self.PAR.ops.table_font
4376
4310
  numrows = self.total_data_rows()
4377
4311
  numcols = self.total_data_cols()
4378
- if self.all_columns_displayed:
4379
- itercols = range(numcols)
4380
- else:
4381
- itercols = self.displayed_columns
4382
- if self.all_rows_displayed:
4383
- iterrows = range(numrows)
4384
- else:
4385
- iterrows = self.displayed_rows
4312
+ itercols = range(numcols) if self.all_columns_displayed else self.displayed_columns
4313
+ iterrows = range(numrows) if self.all_rows_displayed else self.displayed_rows
4386
4314
  if is_iterable(self._row_index):
4387
4315
  for datarn in iterrows:
4388
4316
  w_, h = self.RI.get_cell_dimensions(datarn)
@@ -4395,10 +4323,7 @@ class MainTable(tk.Canvas):
4395
4323
  added_w_space = 1 if slim else 7
4396
4324
  for datacn in itercols:
4397
4325
  w = min_column_width if width is None else width
4398
- if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w:
4399
- w = hw
4400
- else:
4401
- w = min_column_width
4326
+ w = hw if (hw := self.CH.get_cell_dimensions(datacn)[0]) > w else min_column_width
4402
4327
  for datarn in iterrows:
4403
4328
  if txt := self.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True):
4404
4329
  qconf(qtxtm, text=txt, font=qfont)
@@ -4462,7 +4387,7 @@ class MainTable(tk.Canvas):
4462
4387
  else:
4463
4388
  self.set_row_positions(itr=repeat(height, len(self.displayed_rows)))
4464
4389
 
4465
- def del_col_position(self, idx: int, deselect_all: bool = False):
4390
+ def del_col_position(self, idx: int, deselect_all: bool = False) -> None:
4466
4391
  if deselect_all:
4467
4392
  self.deselect("all", redraw=False)
4468
4393
  if idx == "end" or len(self.col_positions) <= idx + 1:
@@ -4473,7 +4398,7 @@ class MainTable(tk.Canvas):
4473
4398
  del self.col_positions[idx]
4474
4399
  self.col_positions[idx:] = [e - w for e in islice(self.col_positions, idx, len(self.col_positions))]
4475
4400
 
4476
- def del_row_position(self, idx: int, deselect_all: bool = False):
4401
+ def del_row_position(self, idx: int, deselect_all: bool = False) -> None:
4477
4402
  if deselect_all:
4478
4403
  self.deselect("all", redraw=False)
4479
4404
  if idx == "end" or len(self.row_positions) <= idx + 1:
@@ -4484,7 +4409,7 @@ class MainTable(tk.Canvas):
4484
4409
  del self.row_positions[idx]
4485
4410
  self.row_positions[idx:] = [e - w for e in islice(self.row_positions, idx, len(self.row_positions))]
4486
4411
 
4487
- def del_col_positions(self, idxs: AnyIter[int] | None = None):
4412
+ def del_col_positions(self, idxs: AnyIter[int] | None = None) -> None:
4488
4413
  if idxs is None:
4489
4414
  del self.col_positions[-1]
4490
4415
  else:
@@ -4492,7 +4417,7 @@ class MainTable(tk.Canvas):
4492
4417
  idxs = set(idxs)
4493
4418
  self.set_col_positions(itr=(w for i, w in enumerate(self.gen_column_widths()) if i not in idxs))
4494
4419
 
4495
- def del_row_positions(self, idxs: AnyIter[int] | None = None):
4420
+ def del_row_positions(self, idxs: AnyIter[int] | None = None) -> None:
4496
4421
  if idxs is None:
4497
4422
  del self.row_positions[-1]
4498
4423
  else:
@@ -4715,9 +4640,9 @@ class MainTable(tk.Canvas):
4715
4640
 
4716
4641
  def adjust_options_post_delete_columns(
4717
4642
  self,
4718
- to_del: None | set = None,
4719
- to_bis: None | list = None,
4720
- named_spans: None | set = None,
4643
+ to_del: None | set[int] = None,
4644
+ to_bis: None | list[int] = None,
4645
+ named_spans: None | set[str] = None,
4721
4646
  ) -> list[int]:
4722
4647
  if to_del is None:
4723
4648
  to_del = set()
@@ -4773,7 +4698,7 @@ class MainTable(tk.Canvas):
4773
4698
 
4774
4699
  def del_columns_from_named_spans(
4775
4700
  self,
4776
- to_del: set,
4701
+ to_del: set[int],
4777
4702
  to_bis: list,
4778
4703
  named_spans: None | set = None,
4779
4704
  ) -> None:
@@ -4789,10 +4714,7 @@ class MainTable(tk.Canvas):
4789
4714
  if isinstance(span["upto_c"], int) and span["upto_c"] > c:
4790
4715
  span["upto_c"] -= 1
4791
4716
 
4792
- def get_spans_to_del_from_cols(
4793
- self,
4794
- cols: set,
4795
- ) -> set:
4717
+ def get_spans_to_del_from_cols(self, cols: set[int]) -> set[str]:
4796
4718
  total = self.total_data_cols()
4797
4719
  return {
4798
4720
  nm
@@ -4803,9 +4725,9 @@ class MainTable(tk.Canvas):
4803
4725
 
4804
4726
  def adjust_options_post_delete_rows(
4805
4727
  self,
4806
- to_del: None | set = None,
4807
- to_bis: None | list = None,
4808
- named_spans: None | set = None,
4728
+ to_del: None | set[int] = None,
4729
+ to_bis: None | list[int] = None,
4730
+ named_spans: None | set[str] = None,
4809
4731
  ) -> list[int]:
4810
4732
  if to_del is None:
4811
4733
  to_del = set()
@@ -4868,7 +4790,7 @@ class MainTable(tk.Canvas):
4868
4790
  self,
4869
4791
  to_del: set,
4870
4792
  to_bis: list,
4871
- named_spans: None | set = None,
4793
+ named_spans: None | set[str] = None,
4872
4794
  ) -> None:
4873
4795
  if named_spans is None:
4874
4796
  named_spans = self.get_spans_to_del_from_rows(rows=to_del)
@@ -4882,10 +4804,7 @@ class MainTable(tk.Canvas):
4882
4804
  if isinstance(span["upto_r"], int) and span["upto_r"] > r:
4883
4805
  span["upto_r"] -= 1
4884
4806
 
4885
- def get_spans_to_del_from_rows(
4886
- self,
4887
- rows: set,
4888
- ) -> set:
4807
+ def get_spans_to_del_from_rows(self, rows: set[int]) -> set[str]:
4889
4808
  total = self.total_data_rows()
4890
4809
  return {
4891
4810
  nm
@@ -4979,7 +4898,7 @@ class MainTable(tk.Canvas):
4979
4898
  try_binding(self.extra_end_insert_cols_rc_func, event_data, "end_add_columns")
4980
4899
  return event_data
4981
4900
 
4982
- def rc_add_columns(self, event: object = None) -> None:
4901
+ def rc_add_columns(self, event: Any = None) -> None:
4983
4902
  rowlen = self.equalize_data_row_lengths()
4984
4903
  selcols = sorted(self.get_selected_cols())
4985
4904
  if (
@@ -5028,8 +4947,8 @@ class MainTable(tk.Canvas):
5028
4947
 
5029
4948
  def add_rows(
5030
4949
  self,
5031
- rows: dict[int, list[object]],
5032
- index: dict[int, object],
4950
+ rows: dict[int, list[Any]],
4951
+ index: dict[int, Any],
5033
4952
  row_heights: dict[int, float | int],
5034
4953
  event_data: EventDataDict,
5035
4954
  create_ops: bool = True,
@@ -5113,7 +5032,7 @@ class MainTable(tk.Canvas):
5113
5032
  try_binding(self.extra_end_insert_rows_rc_func, event_data, "end_add_rows")
5114
5033
  return event_data
5115
5034
 
5116
- def rc_add_rows(self, event: object = None) -> None:
5035
+ def rc_add_rows(self, event: Any = None) -> None:
5117
5036
  total_data_rows = self.total_data_rows()
5118
5037
  selrows = sorted(self.get_selected_rows())
5119
5038
  if (
@@ -5165,7 +5084,7 @@ class MainTable(tk.Canvas):
5165
5084
  data_ins_col: int,
5166
5085
  displayed_ins_col: int,
5167
5086
  numcols: int,
5168
- columns: list[list[object]] | None = None,
5087
+ columns: list[list[Any]] | None = None,
5169
5088
  widths: list[int] | tuple[int] | None = None,
5170
5089
  headers: bool = False,
5171
5090
  ) -> tuple[dict, dict, dict]:
@@ -5190,12 +5109,9 @@ class MainTable(tk.Canvas):
5190
5109
  for datacn in reversed(range(data_ins_col, data_ins_col + numcols))
5191
5110
  }
5192
5111
  else:
5193
- if headers:
5194
- start = 1
5195
- else:
5196
- start = 0
5112
+ start = 1 if headers else 0
5197
5113
  columns = {
5198
- datacn: {datarn: v for datarn, v in enumerate(islice(column, start, None))}
5114
+ datacn: dict(enumerate(islice(column, start, None)))
5199
5115
  for datacn, column in zip(reversed(range(data_ins_col, data_ins_col + numcols)), reversed(columns))
5200
5116
  }
5201
5117
  if widths is None:
@@ -5204,10 +5120,7 @@ class MainTable(tk.Canvas):
5204
5120
  for c in reversed(range(displayed_ins_col, displayed_ins_col + numcols))
5205
5121
  }
5206
5122
  else:
5207
- widths = {
5208
- c: width
5209
- for c, width in zip(reversed(range(displayed_ins_col, displayed_ins_col + numcols)), reversed(widths))
5210
- }
5123
+ widths = dict(zip(reversed(range(displayed_ins_col, displayed_ins_col + numcols)), reversed(widths)))
5211
5124
  return columns, header_data, widths
5212
5125
 
5213
5126
  def get_args_for_add_rows(
@@ -5215,7 +5128,7 @@ class MainTable(tk.Canvas):
5215
5128
  data_ins_row: int,
5216
5129
  displayed_ins_row: int,
5217
5130
  numrows: int,
5218
- rows: list[list[object]] | None = None,
5131
+ rows: list[list[Any]] | None = None,
5219
5132
  heights: list[int] | tuple[int] | None = None,
5220
5133
  row_index: bool = False,
5221
5134
  total_data_cols: int | None = None,
@@ -5245,10 +5158,7 @@ class MainTable(tk.Canvas):
5245
5158
  for datarn in reversed(range(data_ins_row, data_ins_row + numrows))
5246
5159
  }
5247
5160
  else:
5248
- if row_index:
5249
- start = 1
5250
- else:
5251
- start = 0
5161
+ start = 1 if row_index else 0
5252
5162
  rows = {
5253
5163
  datarn: v[start:] if start and v else v
5254
5164
  for datarn, v in zip(reversed(range(data_ins_row, data_ins_row + numrows)), reversed(rows))
@@ -5257,10 +5167,7 @@ class MainTable(tk.Canvas):
5257
5167
  default_row_height = self.get_default_row_height()
5258
5168
  heights = {r: default_row_height for r in reversed(range(displayed_ins_row, displayed_ins_row + numrows))}
5259
5169
  else:
5260
- heights = {
5261
- r: height
5262
- for r, height in zip(reversed(range(displayed_ins_row, displayed_ins_row + numrows)), reversed(heights))
5263
- }
5170
+ heights = dict(zip(reversed(range(displayed_ins_row, displayed_ins_row + numrows)), reversed(heights)))
5264
5171
  return rows, index_data, heights
5265
5172
 
5266
5173
  def copy_options(self) -> dict:
@@ -5345,16 +5252,15 @@ class MainTable(tk.Canvas):
5345
5252
 
5346
5253
  def delete_columns(
5347
5254
  self,
5348
- event: object = None,
5255
+ event: Any = None,
5349
5256
  columns: list[int] | None = None,
5350
5257
  data_indexes: bool = False,
5351
5258
  undo: bool = True,
5352
5259
  emit_event: bool = True,
5353
5260
  ) -> EventDataDict:
5354
5261
  event_data = self.new_event_dict("delete_columns", state=True)
5355
- if not columns:
5356
- if not (columns := sorted(self.get_selected_cols())):
5357
- return event_data
5262
+ if not columns and not (columns := sorted(self.get_selected_cols())):
5263
+ return event_data
5358
5264
  if not try_binding(self.extra_begin_del_cols_rc_func, event_data, "begin_delete_columns"):
5359
5265
  return
5360
5266
  if self.all_columns_displayed:
@@ -5432,16 +5338,15 @@ class MainTable(tk.Canvas):
5432
5338
 
5433
5339
  def delete_rows(
5434
5340
  self,
5435
- event: object = None,
5341
+ event: Any = None,
5436
5342
  rows: list[int] | None = None,
5437
5343
  data_indexes: bool = False,
5438
5344
  undo: bool = True,
5439
5345
  emit_event: bool = True,
5440
- ) -> EventDataDict:
5346
+ ) -> None | EventDataDict:
5441
5347
  event_data = self.new_event_dict("delete_rows", state=True)
5442
- if not rows:
5443
- if not (rows := sorted(self.get_selected_rows())):
5444
- return
5348
+ if not rows and not (rows := sorted(self.get_selected_rows())):
5349
+ return
5445
5350
  if not try_binding(self.extra_begin_del_rows_rc_func, event_data, "begin_delete_rows"):
5446
5351
  return
5447
5352
  if self.all_rows_displayed:
@@ -5571,12 +5476,12 @@ class MainTable(tk.Canvas):
5571
5476
 
5572
5477
  def headers(
5573
5478
  self,
5574
- newheaders: object = None,
5479
+ newheaders: Any = None,
5575
5480
  index: int | None = None,
5576
5481
  reset_col_positions: bool = False,
5577
5482
  show_headers_if_not_sheet: bool = True,
5578
5483
  redraw: bool = False,
5579
- ) -> object:
5484
+ ) -> Any:
5580
5485
  if newheaders is not None:
5581
5486
  if isinstance(newheaders, (list, tuple)):
5582
5487
  self._headers = list(newheaders) if isinstance(newheaders, tuple) else newheaders
@@ -5589,13 +5494,13 @@ class MainTable(tk.Canvas):
5589
5494
  elif not isinstance(newheaders, (list, tuple, int)) and index is None:
5590
5495
  try:
5591
5496
  self._headers = list(newheaders)
5592
- except Exception:
5497
+ except ValueError as error:
5593
5498
  raise ValueError(
5594
5499
  """
5595
5500
  New header must be iterable or int \
5596
5501
  (use int to use a row as the header
5597
5502
  """
5598
- )
5503
+ ) from error
5599
5504
  if reset_col_positions:
5600
5505
  self.reset_col_positions()
5601
5506
  elif (
@@ -5618,12 +5523,12 @@ class MainTable(tk.Canvas):
5618
5523
 
5619
5524
  def row_index(
5620
5525
  self,
5621
- newindex: object = None,
5526
+ newindex: Any = None,
5622
5527
  index: int | None = None,
5623
5528
  reset_row_positions: bool = False,
5624
5529
  show_index_if_not_sheet: bool = True,
5625
5530
  redraw: bool = False,
5626
- ) -> object:
5531
+ ) -> Any:
5627
5532
  if newindex is not None:
5628
5533
  if not self._row_index and not isinstance(self._row_index, int):
5629
5534
  self.RI.set_width(self.PAR.ops.default_row_index_width, set_TL=True)
@@ -5638,13 +5543,13 @@ class MainTable(tk.Canvas):
5638
5543
  elif not isinstance(newindex, (list, tuple, int)) and index is None:
5639
5544
  try:
5640
5545
  self._row_index = list(newindex)
5641
- except Exception:
5546
+ except ValueError as error:
5642
5547
  raise ValueError(
5643
5548
  """
5644
5549
  New index must be iterable or int \
5645
5550
  (use int to use a column as the index
5646
5551
  """
5647
- )
5552
+ ) from error
5648
5553
  if reset_row_positions:
5649
5554
  self.reset_row_positions()
5650
5555
  elif (
@@ -6038,7 +5943,7 @@ class MainTable(tk.Canvas):
6038
5943
  widths[i] = min_column_width
6039
5944
  if diffs and len(diffs) < len(widths):
6040
5945
  change = sum(diffs.values()) / (len(widths) - len(diffs))
6041
- for i, w in enumerate(widths):
5946
+ for i in range(len(widths)):
6042
5947
  if i not in diffs:
6043
5948
  widths[i] -= change
6044
5949
  self.col_positions = list(accumulate(chain([0], widths)))
@@ -6065,7 +5970,7 @@ class MainTable(tk.Canvas):
6065
5970
  heights[i] = min_row_height
6066
5971
  if diffs and len(diffs) < len(heights):
6067
5972
  change = sum(diffs.values()) / (len(heights) - len(diffs))
6068
- for i, h in enumerate(heights):
5973
+ for i in range(len(heights)):
6069
5974
  if i not in diffs:
6070
5975
  heights[i] -= change
6071
5976
  self.row_positions = list(accumulate(chain([0], heights)))
@@ -6252,10 +6157,7 @@ class MainTable(tk.Canvas):
6252
6157
  if self.PAR.ops.horizontal_grid_to_end_of_window:
6253
6158
  x_grid_stop = scrollpos_right + can_width
6254
6159
  else:
6255
- if last_col_line_pos > scrollpos_right:
6256
- x_grid_stop = x_stop + 1
6257
- else:
6258
- x_grid_stop = x_stop - 1
6160
+ x_grid_stop = x_stop + 1 if last_col_line_pos > scrollpos_right else x_stop - 1
6259
6161
  self.redraw_gridline(
6260
6162
  points=tuple(
6261
6163
  chain.from_iterable(
@@ -6278,10 +6180,7 @@ class MainTable(tk.Canvas):
6278
6180
  if self.PAR.ops.vertical_grid_to_end_of_window:
6279
6181
  y_grid_stop = scrollpos_bot + can_height
6280
6182
  else:
6281
- if last_row_line_pos > scrollpos_bot:
6282
- y_grid_stop = y_stop + 1
6283
- else:
6284
- y_grid_stop = y_stop - 1
6183
+ y_grid_stop = y_stop + 1 if last_row_line_pos > scrollpos_bot else y_stop - 1
6285
6184
  self.redraw_gridline(
6286
6185
  points=tuple(
6287
6186
  chain.from_iterable(
@@ -6305,10 +6204,7 @@ class MainTable(tk.Canvas):
6305
6204
  sel_cells_bg = color_tup(self.PAR.ops.table_selected_cells_bg)
6306
6205
  sel_cols_bg = color_tup(self.PAR.ops.table_selected_columns_bg)
6307
6206
  sel_rows_bg = color_tup(self.PAR.ops.table_selected_rows_bg)
6308
- if self.selected:
6309
- current_loc = (self.selected.row, self.selected.column)
6310
- else:
6311
- current_loc = tuple()
6207
+ current_loc = (self.selected.row, self.selected.column) if self.selected else ()
6312
6208
  if self.PAR.ops.alternate_color:
6313
6209
  alternate_color = Highlight(
6314
6210
  bg=self.PAR.ops.alternate_color,
@@ -6318,10 +6214,10 @@ class MainTable(tk.Canvas):
6318
6214
  if self.selected and box_is_single_cell(*self.selected.box) and self.PAR.ops.show_selected_cells_border:
6319
6215
  dont_blend = current_loc
6320
6216
  else:
6321
- dont_blend = tuple()
6217
+ dont_blend = ()
6322
6218
  else:
6323
6219
  alternate_color = None
6324
- dont_blend = tuple()
6220
+ dont_blend = ()
6325
6221
  if not self.PAR.ops.show_selected_cells_border:
6326
6222
  override = (
6327
6223
  color_tup(self.PAR.ops.table_selected_cells_fg),
@@ -6329,7 +6225,7 @@ class MainTable(tk.Canvas):
6329
6225
  color_tup(self.PAR.ops.table_selected_rows_fg),
6330
6226
  )
6331
6227
  else:
6332
- override = tuple()
6228
+ override = ()
6333
6229
  allow_overflow = self.PAR.ops.allow_cell_overflow
6334
6230
  wrap = self.PAR.ops.table_wrap
6335
6231
  cells = self._redraw_precache_cells(
@@ -6526,7 +6422,7 @@ class MainTable(tk.Canvas):
6526
6422
  self.itemconfig(iid, state="hidden")
6527
6423
  dct[iid] = False
6528
6424
  if self.PAR.ops.show_selected_cells_border:
6529
- for iid, box in self.selection_boxes.items():
6425
+ for _, box in self.selection_boxes.items():
6530
6426
  if box.bd_iid:
6531
6427
  self.tag_raise(box.bd_iid)
6532
6428
  if self.selected:
@@ -6588,7 +6484,7 @@ class MainTable(tk.Canvas):
6588
6484
  def reselect_from_get_boxes(
6589
6485
  self,
6590
6486
  boxes: dict,
6591
- selected: tuple = tuple(),
6487
+ selected: tuple = (),
6592
6488
  ) -> None:
6593
6489
  for (r1, c1, r2, c2), v in boxes.items():
6594
6490
  if r2 < len(self.row_positions) and c2 < len(self.col_positions):
@@ -6622,14 +6518,15 @@ class MainTable(tk.Canvas):
6622
6518
 
6623
6519
  # set current to any existing selection box with coordinates: box
6624
6520
  if isinstance(box, tuple):
6625
- for item, selection_box in self.get_selection_items(reverse=True):
6626
- if box == selection_box.coords:
6627
- if box_created(box[0] if r is None else r, box[1] if c is None else c, selection_box):
6628
- return
6521
+ for _, selection_box in self.get_selection_items(reverse=True):
6522
+ if box == selection_box.coords and box_created(
6523
+ box[0] if r is None else r, box[1] if c is None else c, selection_box
6524
+ ):
6525
+ return
6629
6526
 
6630
6527
  # set current to a coordinate, find the top most box there
6631
6528
  if isinstance(r, int) and isinstance(c, int):
6632
- for item, selection_box in self.get_selection_items(reverse=True):
6529
+ for _, selection_box in self.get_selection_items(reverse=True):
6633
6530
  if box_created(r, c, selection_box):
6634
6531
  return
6635
6532
 
@@ -6648,15 +6545,15 @@ class MainTable(tk.Canvas):
6648
6545
  def coords_and_type(self, item: int) -> tuple:
6649
6546
  if item in self.selection_boxes:
6650
6547
  return Box_t(*(self.selection_boxes[item].coords + (self.selection_boxes[item].type_,)))
6651
- return tuple()
6548
+ return ()
6652
6549
 
6653
6550
  def get_selected_box_bg_fg(self, type_: str) -> tuple:
6654
- if type_ == "cells":
6655
- return self.PAR.ops.table_selected_cells_bg, self.PAR.ops.table_selected_box_cells_fg
6656
- elif type_ == "rows":
6657
- return self.PAR.ops.table_selected_rows_bg, self.PAR.ops.table_selected_box_rows_fg
6658
- elif type_ == "columns":
6659
- return self.PAR.ops.table_selected_columns_bg, self.PAR.ops.table_selected_box_columns_fg
6551
+ type_map = {
6552
+ "cells": (self.PAR.ops.table_selected_cells_bg, self.PAR.ops.table_selected_box_cells_fg),
6553
+ "rows": (self.PAR.ops.table_selected_rows_bg, self.PAR.ops.table_selected_box_rows_fg),
6554
+ "columns": (self.PAR.ops.table_selected_columns_bg, self.PAR.ops.table_selected_box_columns_fg),
6555
+ }
6556
+ return type_map[type_]
6660
6557
 
6661
6558
  def create_currently_selected_box(
6662
6559
  self,
@@ -6713,10 +6610,7 @@ class MainTable(tk.Canvas):
6713
6610
  width: int,
6714
6611
  iid: None | int = None,
6715
6612
  ) -> int:
6716
- if not self.PAR.ops.rounded_boxes or not x2 - x1 or not y2 - y1:
6717
- radius = 0
6718
- else:
6719
- radius = 5
6613
+ radius = 0 if not self.PAR.ops.rounded_boxes or not x2 - x1 or not y2 - y1 else 5
6720
6614
  coords = rounded_box_coords(
6721
6615
  x1,
6722
6616
  y1,
@@ -6773,7 +6667,7 @@ class MainTable(tk.Canvas):
6773
6667
  def hide_selected(self) -> None:
6774
6668
  if self.selected:
6775
6669
  self.hide_box(self.selected.iid)
6776
- self.selected = tuple()
6670
+ self.selected = ()
6777
6671
 
6778
6672
  def create_selection_box(
6779
6673
  self,
@@ -7203,7 +7097,7 @@ class MainTable(tk.Canvas):
7203
7097
 
7204
7098
  def open_cell(
7205
7099
  self,
7206
- event: object = None,
7100
+ event: Any = None,
7207
7101
  ignore_existing_editor: bool = False,
7208
7102
  ) -> None:
7209
7103
  if not self.anything_selected() or (not ignore_existing_editor and self.text_editor.open):
@@ -7238,7 +7132,7 @@ class MainTable(tk.Canvas):
7238
7132
  # displayed indexes
7239
7133
  def open_text_editor(
7240
7134
  self,
7241
- event: object = None,
7135
+ event: Any = None,
7242
7136
  r: int = 0,
7243
7137
  c: int = 0,
7244
7138
  text: str | None = None,
@@ -7283,7 +7177,7 @@ class MainTable(tk.Canvas):
7283
7177
  self.text_editor.window.set_text(self.text_editor.get() + "" if not isinstance(text, str) else text)
7284
7178
  return False
7285
7179
  self.hide_text_editor()
7286
- if not self.see(r=r, c=c, check_cell_visibility=True):
7180
+ if not self.see(r, c):
7287
7181
  self.main_table_redraw_grid_and_text(True, True)
7288
7182
  x = self.col_positions[c]
7289
7183
  y = self.row_positions[r]
@@ -7337,7 +7231,7 @@ class MainTable(tk.Canvas):
7337
7231
  # displayed indexes
7338
7232
  def text_editor_newline_binding(
7339
7233
  self,
7340
- event: object = None,
7234
+ event: Any = None,
7341
7235
  check_lines: bool = True,
7342
7236
  ) -> None:
7343
7237
  r, c = self.text_editor.coords
@@ -7517,13 +7411,7 @@ class MainTable(tk.Canvas):
7517
7411
  new_r, new_c = None, None
7518
7412
  if isinstance(new_r, int):
7519
7413
  self.set_currently_selected(new_r, new_c, item=self.selected.fill_iid)
7520
- self.see(
7521
- new_r,
7522
- new_c,
7523
- keep_xscroll=False,
7524
- bottom_right_corner=True,
7525
- check_cell_visibility=True,
7526
- )
7414
+ self.see(new_r, new_c)
7527
7415
  self.recreate_all_selection_boxes()
7528
7416
  self.hide_text_editor_and_dropdown()
7529
7417
  if event.keysym != "FocusOut":
@@ -7536,19 +7424,13 @@ class MainTable(tk.Canvas):
7536
7424
  r,
7537
7425
  c + 1 if c < len(self.col_positions) - 2 else c,
7538
7426
  bottom_right_corner=True,
7539
- check_cell_visibility=True,
7540
7427
  )
7541
7428
 
7542
7429
  def select_down(self, r: int, c: int) -> None:
7543
7430
  self.select_cell(r + 1 if r < len(self.row_positions) - 2 else r, c)
7544
- self.see(
7545
- r + 1 if r < len(self.row_positions) - 2 else r,
7546
- c,
7547
- bottom_right_corner=True,
7548
- check_cell_visibility=True,
7549
- )
7431
+ self.see(r + 1 if r < len(self.row_positions) - 2 else r, c)
7550
7432
 
7551
- def tab_key(self, event: object = None) -> str:
7433
+ def tab_key(self, event: Any = None) -> str:
7552
7434
  if not self.selected:
7553
7435
  return
7554
7436
  r, c = self.selected.row, self.selected.column
@@ -7562,13 +7444,7 @@ class MainTable(tk.Canvas):
7562
7444
  else:
7563
7445
  new_r, new_c = cell_right_within_box(r, c, r1, c1, r2, c2, numrows, numcols)
7564
7446
  self.set_currently_selected(new_r, new_c, item=self.selected.fill_iid)
7565
- self.see(
7566
- new_r,
7567
- new_c,
7568
- keep_xscroll=False,
7569
- bottom_right_corner=True,
7570
- check_cell_visibility=True,
7571
- )
7447
+ self.see(new_r, new_c, bottom_right_corner=True)
7572
7448
  if not self.PAR.ops.show_selected_cells_border:
7573
7449
  self.refresh()
7574
7450
  return "break"
@@ -7652,7 +7528,7 @@ class MainTable(tk.Canvas):
7652
7528
  self,
7653
7529
  r: int,
7654
7530
  c: int,
7655
- event: object = None,
7531
+ event: Any = None,
7656
7532
  ) -> None:
7657
7533
  self.hide_text_editor()
7658
7534
  datarn = self.datarn(r)
@@ -7733,7 +7609,7 @@ class MainTable(tk.Canvas):
7733
7609
  self,
7734
7610
  r: int | None = None,
7735
7611
  c: int | None = None,
7736
- selection: object = None,
7612
+ selection: Any = None,
7737
7613
  redraw: bool = True,
7738
7614
  ) -> None:
7739
7615
  if r is not None and c is not None and selection is not None:
@@ -7878,8 +7754,8 @@ class MainTable(tk.Canvas):
7878
7754
  self,
7879
7755
  datarn: int,
7880
7756
  datacn: int,
7881
- value: object,
7882
- kwargs: dict = {},
7757
+ value: Any,
7758
+ kwargs: dict | None = None,
7883
7759
  expand_sheet: bool = True,
7884
7760
  ) -> None:
7885
7761
  if expand_sheet:
@@ -7904,7 +7780,7 @@ class MainTable(tk.Canvas):
7904
7780
  else:
7905
7781
  self.data[datarn][datacn] = value
7906
7782
 
7907
- def get_value_for_empty_cell(self, datarn: int, datacn: int, r_ops: bool = True, c_ops: bool = True) -> object:
7783
+ def get_value_for_empty_cell(self, datarn: int, datacn: int, r_ops: bool = True, c_ops: bool = True) -> Any:
7908
7784
  kwargs = self.get_cell_kwargs(
7909
7785
  datarn,
7910
7786
  datacn,
@@ -7927,7 +7803,7 @@ class MainTable(tk.Canvas):
7927
7803
  start: int = 0,
7928
7804
  r_ops: bool = True,
7929
7805
  c_ops: bool = True,
7930
- ) -> list[object]:
7806
+ ) -> list[Any]:
7931
7807
  return [self.get_value_for_empty_cell(datarn, datacn, r_ops=r_ops, c_ops=c_ops) for datacn in range(start, end)]
7932
7808
 
7933
7809
  def fix_row_len(self, datarn: int, datacn: int) -> None:
@@ -7987,10 +7863,7 @@ class MainTable(tk.Canvas):
7987
7863
  self.set_cell_data(*key, get_val(*key), expand_sheet=False)
7988
7864
 
7989
7865
  def delete_row_format(self, datarn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
7990
- if isinstance(datarn, str) and datarn.lower() == "all":
7991
- itr = gen_formatted(self.row_options)
7992
- else:
7993
- itr = (datarn,)
7866
+ itr = gen_formatted(self.row_options) if isinstance(datarn, str) and datarn.lower() == "all" else (datarn,)
7994
7867
  get_val = self.get_value_for_empty_cell
7995
7868
  for datarn in itr:
7996
7869
  try:
@@ -8002,10 +7875,7 @@ class MainTable(tk.Canvas):
8002
7875
  self.set_cell_data(datarn, datacn, get_val(datarn, datacn), expand_sheet=False)
8003
7876
 
8004
7877
  def delete_column_format(self, datacn: Literal["all"] | int = "all", clear_values: bool = False) -> None:
8005
- if isinstance(datacn, str) and datacn.lower() == "all":
8006
- itr = gen_formatted(self.col_options)
8007
- else:
8008
- itr = (datacn,)
7878
+ itr = gen_formatted(self.col_options) if isinstance(datacn, str) and datacn.lower() == "all" else (datacn,)
8009
7879
  get_val = self.get_value_for_empty_cell
8010
7880
  for datacn in itr:
8011
7881
  try:
@@ -8055,7 +7925,7 @@ class MainTable(tk.Canvas):
8055
7925
  none_to_empty_str: bool = False,
8056
7926
  fmt_kw: dict | None = None,
8057
7927
  **kwargs,
8058
- ) -> object:
7928
+ ) -> Any:
8059
7929
  if get_displayed:
8060
7930
  return self.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
8061
7931
  value = (
@@ -8074,7 +7944,7 @@ class MainTable(tk.Canvas):
8074
7944
  self,
8075
7945
  datarn: int,
8076
7946
  datacn: int,
8077
- value: object,
7947
+ value: Any,
8078
7948
  check_readonly: bool = True,
8079
7949
  ignore_empty: bool = False,
8080
7950
  ) -> bool:
@@ -8083,9 +7953,7 @@ class MainTable(tk.Canvas):
8083
7953
  return False
8084
7954
  elif "format" in kwargs:
8085
7955
  return True
8086
- elif self.cell_equal_to(datarn, datacn, value, ignore_empty=ignore_empty):
8087
- return False
8088
- elif (
7956
+ elif self.cell_equal_to(datarn, datacn, value, ignore_empty=ignore_empty) or (
8089
7957
  (dropdown := kwargs.get("dropdown", {})) and dropdown["validate_input"] and value not in dropdown["values"]
8090
7958
  ):
8091
7959
  return False
@@ -8094,7 +7962,7 @@ class MainTable(tk.Canvas):
8094
7962
  else:
8095
7963
  return True
8096
7964
 
8097
- def cell_equal_to(self, datarn: int, datacn: int, value: object, ignore_empty: bool = False, **kwargs) -> bool:
7965
+ def cell_equal_to(self, datarn: int, datacn: int, value: Any, ignore_empty: bool = False, **kwargs) -> bool:
8098
7966
  v = self.get_cell_data(datarn, datacn)
8099
7967
  kwargs = self.get_cell_kwargs(datarn, datacn, key="format")
8100
7968
  if kwargs and kwargs["formatter"] is None:
@@ -8132,16 +8000,30 @@ class MainTable(tk.Canvas):
8132
8000
  row: bool = True,
8133
8001
  column: bool = True,
8134
8002
  ) -> dict:
8135
- if cell and (datarn, datacn) in self.cell_options:
8136
- return (
8137
- self.cell_options[(datarn, datacn)] if key is None else self.cell_options[(datarn, datacn)].get(key, {})
8138
- )
8139
- elif row and datarn in self.row_options:
8140
- return self.row_options[datarn] if key is None else self.row_options[datarn].get(key, {})
8141
- elif column and datacn in self.col_options:
8142
- return self.col_options[datacn] if key is None else self.col_options[datacn].get(key, {})
8003
+ if key is None:
8004
+ if cell and (datarn, datacn) in self.cell_options:
8005
+ return self.cell_options[(datarn, datacn)]
8006
+
8007
+ elif row and datarn in self.row_options:
8008
+ return self.row_options[datarn]
8009
+
8010
+ elif column and datacn in self.col_options:
8011
+ return self.col_options[datacn]
8012
+
8013
+ else:
8014
+ return {}
8143
8015
  else:
8144
- return {}
8016
+ if cell and (datarn, datacn) in self.cell_options and key in self.cell_options[(datarn, datacn)]:
8017
+ return self.cell_options[(datarn, datacn)][key]
8018
+
8019
+ elif row and datarn in self.row_options and key in self.row_options[datarn]:
8020
+ return self.row_options[datarn][key]
8021
+
8022
+ elif column and datacn in self.col_options and key in self.col_options[datacn]:
8023
+ return self.col_options[datacn][key]
8024
+
8025
+ else:
8026
+ return {}
8145
8027
 
8146
8028
  def datacn(self, c: int) -> int:
8147
8029
  return c if self.all_columns_displayed else self.displayed_columns[c]