tksheet 7.1.3__tar.gz → 7.1.5__tar.gz
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-7.1.3/tksheet.egg-info → tksheet-7.1.5}/PKG-INFO +1 -1
- {tksheet-7.1.3 → tksheet-7.1.5}/pyproject.toml +1 -1
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/__init__.py +1 -1
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/column_headers.py +91 -91
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/functions.py +16 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/main_table.py +155 -133
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/other_classes.py +4 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/row_index.py +89 -97
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/sheet.py +123 -82
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/text_editor.py +8 -6
- {tksheet-7.1.3 → tksheet-7.1.5/tksheet.egg-info}/PKG-INFO +1 -1
- {tksheet-7.1.3 → tksheet-7.1.5}/LICENSE.txt +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/README.md +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/setup.cfg +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/colors.py +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/formatters.py +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/sheet_options.py +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/themes.py +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/top_left_rectangle.py +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/types.py +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet/vars.py +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet.egg-info/SOURCES.txt +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet.egg-info/dependency_links.txt +0 -0
- {tksheet-7.1.3 → tksheet-7.1.5}/tksheet.egg-info/top_level.txt +0 -0
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|
6
6
|
name = "tksheet"
|
7
7
|
description = "Tkinter table / sheet widget"
|
8
8
|
readme = "README.md"
|
9
|
-
version = "7.1.
|
9
|
+
version = "7.1.5"
|
10
10
|
authors = [{ name = "ragardner", email = "github@ragardner.simplelogin.com" }]
|
11
11
|
requires-python = ">=3.8"
|
12
12
|
license = {file = "LICENSE.txt"}
|
@@ -197,8 +197,7 @@ class ColumnHeaders(tk.Canvas):
|
|
197
197
|
self.toggle_select_col(c, redraw=True)
|
198
198
|
if self.MT.rc_popup_menus_enabled:
|
199
199
|
popup_menu = self.ch_rc_popup_menu
|
200
|
-
|
201
|
-
self.extra_rc_func(event)
|
200
|
+
try_binding(self.extra_rc_func, event)
|
202
201
|
if popup_menu is not None:
|
203
202
|
self.popup_menu_loc = c
|
204
203
|
popup_menu.tk_popup(event.x_root, event.y_root)
|
@@ -218,10 +217,9 @@ class ColumnHeaders(tk.Canvas):
|
|
218
217
|
self.being_drawn_item = True
|
219
218
|
self.being_drawn_item = self.add_selection(c, set_as_current=True, run_binding_func=False)
|
220
219
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
)
|
220
|
+
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
221
|
+
try_binding(self.ctrl_selection_binding_func, sel_event)
|
222
|
+
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
225
223
|
elif c_selected:
|
226
224
|
self.MT.deselect(c=c)
|
227
225
|
elif not self.MT.ctrl_select_enabled:
|
@@ -252,10 +250,9 @@ class ColumnHeaders(tk.Canvas):
|
|
252
250
|
set_as_current=True,
|
253
251
|
)
|
254
252
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
)
|
253
|
+
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
254
|
+
try_binding(self.ctrl_selection_binding_func, sel_event)
|
255
|
+
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
259
256
|
elif c_selected:
|
260
257
|
self.dragged_col = DraggedRowColumn(
|
261
258
|
dragged=c,
|
@@ -275,15 +272,16 @@ class ColumnHeaders(tk.Canvas):
|
|
275
272
|
if self.MT.selected and self.MT.selected.type_ == "columns":
|
276
273
|
r_to_sel, c_to_sel = self.MT.selected.row, self.MT.selected.column
|
277
274
|
self.MT.deselect("all", redraw=False)
|
278
|
-
self.being_drawn_item = self.MT.create_selection_box(
|
275
|
+
self.being_drawn_item = self.MT.create_selection_box(
|
276
|
+
*self.get_shift_select_box(c, c_to_sel), "columns"
|
277
|
+
)
|
279
278
|
self.MT.set_currently_selected(r_to_sel, c_to_sel, self.being_drawn_item)
|
280
279
|
else:
|
281
280
|
self.being_drawn_item = self.select_col(c, run_binding_func=False)
|
282
281
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=True)
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
)
|
282
|
+
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
283
|
+
try_binding(self.shift_selection_binding_func, sel_event)
|
284
|
+
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
287
285
|
elif c_selected:
|
288
286
|
self.dragged_col = DraggedRowColumn(
|
289
287
|
dragged=c,
|
@@ -371,8 +369,7 @@ class ColumnHeaders(tk.Canvas):
|
|
371
369
|
self.MT.current_cursor = "hand2"
|
372
370
|
if not mouse_over_resize and not mouse_over_selected:
|
373
371
|
self.MT.reset_mouse_motion_creations()
|
374
|
-
|
375
|
-
self.extra_motion_func(event)
|
372
|
+
try_binding(self.extra_motion_func, event)
|
376
373
|
|
377
374
|
def double_b1(self, event: object):
|
378
375
|
self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
|
@@ -412,8 +409,7 @@ class ColumnHeaders(tk.Canvas):
|
|
412
409
|
self.open_cell(event)
|
413
410
|
self.rsz_w = None
|
414
411
|
self.mouse_motion(event)
|
415
|
-
|
416
|
-
self.extra_double_b1_func(event)
|
412
|
+
try_binding(self.extra_double_b1_func, event)
|
417
413
|
|
418
414
|
def b1_press(self, event: object):
|
419
415
|
self.MT.unbind("<MouseWheel>")
|
@@ -478,8 +474,7 @@ class ColumnHeaders(tk.Canvas):
|
|
478
474
|
self.being_drawn_item = self.select_col(c, redraw=True)
|
479
475
|
elif self.MT.toggle_selection_enabled:
|
480
476
|
self.toggle_select_col(c, redraw=True)
|
481
|
-
|
482
|
-
self.extra_b1_press_func(event)
|
477
|
+
try_binding(self.extra_b1_press_func, event)
|
483
478
|
|
484
479
|
def b1_motion(self, event: object):
|
485
480
|
x1, y1, x2, y2 = self.MT.get_canvas_visible_area()
|
@@ -570,16 +565,14 @@ class ColumnHeaders(tk.Canvas):
|
|
570
565
|
else:
|
571
566
|
self.being_drawn_item = self.select_col(self.MT.selected.column, run_binding_func=False)
|
572
567
|
need_redraw = True
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
)
|
568
|
+
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
569
|
+
try_binding(self.drag_selection_binding_func, sel_event)
|
570
|
+
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
577
571
|
if self.scroll_if_event_offscreen(event):
|
578
572
|
need_redraw = True
|
579
573
|
if need_redraw:
|
580
574
|
self.MT.main_table_redraw_grid_and_text(redraw_header=True, redraw_row_index=False)
|
581
|
-
|
582
|
-
self.extra_b1_motion_func(event)
|
575
|
+
try_binding(self.extra_b1_motion_func, event)
|
583
576
|
|
584
577
|
def get_b1_motion_box(self, start_col, end_col):
|
585
578
|
if end_col >= start_col:
|
@@ -631,10 +624,9 @@ class ColumnHeaders(tk.Canvas):
|
|
631
624
|
self.MT.hide_selection_box(self.MT.selected.fill_iid)
|
632
625
|
self.being_drawn_item = self.add_selection(box[1], run_binding_func=False)
|
633
626
|
need_redraw = True
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
)
|
627
|
+
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
628
|
+
try_binding(self.drag_selection_binding_func, sel_event)
|
629
|
+
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
638
630
|
if self.scroll_if_event_offscreen(event):
|
639
631
|
need_redraw = True
|
640
632
|
if need_redraw:
|
@@ -770,10 +762,9 @@ class ColumnHeaders(tk.Canvas):
|
|
770
762
|
c_to_sel,
|
771
763
|
item=self.MT.create_selection_box(*to_sel, set_current=False),
|
772
764
|
)
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
)
|
765
|
+
sel_event = self.MT.get_select_event(being_drawn_item=self.being_drawn_item)
|
766
|
+
try_binding(self.drag_selection_binding_func, sel_event)
|
767
|
+
self.PAR.emit_event("<<SheetSelect>>", data=sel_event)
|
777
768
|
self.MT.bind("<MouseWheel>", self.MT.mousewheel)
|
778
769
|
if self.width_resizing_enabled and self.rsz_w is not None and self.currently_resizing_width:
|
779
770
|
self.currently_resizing_width = False
|
@@ -865,8 +856,16 @@ class ColumnHeaders(tk.Canvas):
|
|
865
856
|
):
|
866
857
|
datacn = c if self.MT.all_columns_displayed else self.MT.displayed_columns[c]
|
867
858
|
canvasx = self.canvasx(event.x)
|
868
|
-
if self.event_over_dropdown(
|
869
|
-
c,
|
859
|
+
if self.event_over_dropdown(
|
860
|
+
c,
|
861
|
+
datacn,
|
862
|
+
event,
|
863
|
+
canvasx,
|
864
|
+
) or self.event_over_checkbox(
|
865
|
+
c,
|
866
|
+
datacn,
|
867
|
+
event,
|
868
|
+
canvasx,
|
870
869
|
):
|
871
870
|
self.open_cell(event)
|
872
871
|
else:
|
@@ -879,8 +878,7 @@ class ColumnHeaders(tk.Canvas):
|
|
879
878
|
self.rsz_w = None
|
880
879
|
self.rsz_h = None
|
881
880
|
self.mouse_motion(event)
|
882
|
-
|
883
|
-
self.extra_b1_release_func(event)
|
881
|
+
try_binding(self.extra_b1_release_func, event)
|
884
882
|
|
885
883
|
def toggle_select_col(
|
886
884
|
self,
|
@@ -982,15 +980,15 @@ class ColumnHeaders(tk.Canvas):
|
|
982
980
|
qconf = self.MT.txt_measure_canvas.itemconfig
|
983
981
|
qbbox = self.MT.txt_measure_canvas.bbox
|
984
982
|
qtxtm = self.MT.txt_measure_canvas_text
|
983
|
+
qfont = self.PAR.ops.header_font
|
985
984
|
new_height = self.MT.min_header_height
|
986
985
|
default_header_height = self.MT.get_default_header_height()
|
987
986
|
self.fix_header()
|
988
987
|
if text is not None:
|
989
988
|
if text:
|
990
|
-
qconf(qtxtm, text=text)
|
989
|
+
qconf(qtxtm, text=text, font=qfont)
|
991
990
|
b = qbbox(qtxtm)
|
992
|
-
h
|
993
|
-
if h > new_height:
|
991
|
+
if (h := b[3] - b[1] + 5) > new_height:
|
994
992
|
new_height = h
|
995
993
|
else:
|
996
994
|
if self.MT.all_columns_displayed:
|
@@ -1014,7 +1012,7 @@ class ColumnHeaders(tk.Canvas):
|
|
1014
1012
|
for datacn in iterable:
|
1015
1013
|
txt = self.MT.get_valid_cell_data_as_str(datarn, datacn, get_displayed=True)
|
1016
1014
|
if txt:
|
1017
|
-
qconf(qtxtm, text=txt)
|
1015
|
+
qconf(qtxtm, text=txt, font=qfont)
|
1018
1016
|
b = qbbox(qtxtm)
|
1019
1017
|
h = b[3] - b[1] + 5
|
1020
1018
|
else:
|
@@ -1026,7 +1024,7 @@ class ColumnHeaders(tk.Canvas):
|
|
1026
1024
|
if h > new_height:
|
1027
1025
|
new_height = h
|
1028
1026
|
space_bot = self.MT.get_space_bot(0)
|
1029
|
-
if new_height > space_bot:
|
1027
|
+
if new_height > space_bot and space_bot > self.MT.min_header_height:
|
1030
1028
|
new_height = space_bot
|
1031
1029
|
if not only_increase or (only_increase and new_height > self.current_height):
|
1032
1030
|
self.set_height(new_height, set_TL=True)
|
@@ -1646,7 +1644,7 @@ class ColumnHeaders(tk.Canvas):
|
|
1646
1644
|
text = event.char
|
1647
1645
|
else:
|
1648
1646
|
return False
|
1649
|
-
if self.extra_begin_edit_cell_func
|
1647
|
+
if self.extra_begin_edit_cell_func:
|
1650
1648
|
try:
|
1651
1649
|
text = self.extra_begin_edit_cell_func(
|
1652
1650
|
event_dict(
|
@@ -1696,12 +1694,12 @@ class ColumnHeaders(tk.Canvas):
|
|
1696
1694
|
}
|
1697
1695
|
),
|
1698
1696
|
"sheet_ops": self.PAR.ops,
|
1699
|
-
"border_color": self.PAR.ops.
|
1697
|
+
"border_color": self.PAR.ops.header_selected_columns_bg,
|
1700
1698
|
"text": text,
|
1701
1699
|
"state": state,
|
1702
1700
|
"width": w,
|
1703
1701
|
"height": h,
|
1704
|
-
"show_border":
|
1702
|
+
"show_border": True,
|
1705
1703
|
"bg": bg,
|
1706
1704
|
"fg": fg,
|
1707
1705
|
"align": self.get_cell_align(c),
|
@@ -1747,31 +1745,34 @@ class ColumnHeaders(tk.Canvas):
|
|
1747
1745
|
|
1748
1746
|
# displayed indexes
|
1749
1747
|
def text_editor_newline_binding(self, r=0, c=0, event: object = None, check_lines=True):
|
1750
|
-
if self.height_resizing_enabled:
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1755
|
-
|
1756
|
-
|
1757
|
-
|
1758
|
-
|
1759
|
-
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1763
|
-
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
1767
|
-
|
1768
|
-
|
1769
|
-
|
1770
|
-
|
1771
|
-
|
1772
|
-
|
1773
|
-
|
1774
|
-
self.
|
1748
|
+
if not self.height_resizing_enabled:
|
1749
|
+
return
|
1750
|
+
curr_height = self.text_editor.window.winfo_height()
|
1751
|
+
if curr_height < self.MT.min_header_height:
|
1752
|
+
return
|
1753
|
+
if (
|
1754
|
+
not check_lines
|
1755
|
+
or self.MT.get_lines_cell_height(
|
1756
|
+
self.text_editor.window.get_num_lines() + 1,
|
1757
|
+
font=self.PAR.ops.header_font,
|
1758
|
+
)
|
1759
|
+
> curr_height
|
1760
|
+
):
|
1761
|
+
new_height = curr_height + self.MT.header_xtra_lines_increment
|
1762
|
+
space_bot = self.MT.get_space_bot(0)
|
1763
|
+
if new_height > space_bot:
|
1764
|
+
new_height = space_bot
|
1765
|
+
if new_height != curr_height:
|
1766
|
+
self.text_editor.window.config(height=new_height)
|
1767
|
+
self.set_height(new_height, set_TL=True)
|
1768
|
+
if self.dropdown.open and self.dropdown.get_coords() == c:
|
1769
|
+
win_h, anchor = self.get_dropdown_height_anchor(c, new_height)
|
1770
|
+
self.coords(
|
1771
|
+
self.dropdown.canvas_id,
|
1772
|
+
self.MT.col_positions[c],
|
1773
|
+
new_height - 1,
|
1774
|
+
)
|
1775
|
+
self.itemconfig(self.dropdown.canvas_id, anchor=anchor, height=win_h)
|
1775
1776
|
|
1776
1777
|
def refresh_open_window_positions(self):
|
1777
1778
|
if self.text_editor.open:
|
@@ -1909,33 +1910,32 @@ class ColumnHeaders(tk.Canvas):
|
|
1909
1910
|
if not self.open_text_editor(event=event, c=c, dropdown=True):
|
1910
1911
|
return
|
1911
1912
|
win_h, anchor = self.get_dropdown_height_anchor(c)
|
1913
|
+
win_w = self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1
|
1912
1914
|
ypos = self.current_height - 1
|
1913
|
-
|
1914
|
-
|
1915
|
-
|
1916
|
-
|
1917
|
-
|
1918
|
-
self.
|
1919
|
-
|
1920
|
-
|
1915
|
+
reset_kwargs = {
|
1916
|
+
"r": 0,
|
1917
|
+
"c": c,
|
1918
|
+
"width": win_w,
|
1919
|
+
"height": win_h,
|
1920
|
+
"font": self.PAR.ops.header_font,
|
1921
|
+
"ops": self.PAR.ops,
|
1922
|
+
"outline_color": self.PAR.ops.popup_menu_fg,
|
1923
|
+
"align": self.get_cell_align(c),
|
1924
|
+
"values": kwargs["values"],
|
1925
|
+
}
|
1926
|
+
if self.dropdown.window:
|
1927
|
+
self.dropdown.window.reset(**reset_kwargs)
|
1928
|
+
self.itemconfig(self.dropdown.canvas_id, state="normal")
|
1921
1929
|
self.coords(self.dropdown.canvas_id, self.MT.col_positions[c], ypos)
|
1922
1930
|
else:
|
1923
1931
|
self.dropdown.window = self.PAR.dropdown_class(
|
1924
|
-
self.
|
1925
|
-
|
1926
|
-
c,
|
1927
|
-
width=self.MT.col_positions[c + 1] - self.MT.col_positions[c] + 1,
|
1928
|
-
height=win_h,
|
1929
|
-
font=self.PAR.ops.header_font,
|
1930
|
-
ops=self.PAR.ops,
|
1931
|
-
outline_color=self.PAR.ops.popup_menu_fg,
|
1932
|
-
values=kwargs["values"],
|
1932
|
+
self.winfo_toplevel(),
|
1933
|
+
**reset_kwargs,
|
1934
|
+
single_index="c",
|
1933
1935
|
close_dropdown_window=self.close_dropdown_window,
|
1934
1936
|
search_function=kwargs["search_function"],
|
1935
1937
|
arrowkey_RIGHT=self.MT.arrowkey_RIGHT,
|
1936
1938
|
arrowkey_LEFT=self.MT.arrowkey_LEFT,
|
1937
|
-
align="w",
|
1938
|
-
single_index="c",
|
1939
1939
|
)
|
1940
1940
|
self.dropdown.canvas_id = self.create_window(
|
1941
1941
|
(self.MT.col_positions[c], ypos),
|
@@ -1146,6 +1146,22 @@ def set_readonly(
|
|
1146
1146
|
return options
|
1147
1147
|
|
1148
1148
|
|
1149
|
+
def convert_align(align: str | None) -> str | None:
|
1150
|
+
if isinstance(align, str):
|
1151
|
+
a = align.lower()
|
1152
|
+
if a == "global":
|
1153
|
+
return None
|
1154
|
+
elif a in ("c", "center", "centre"):
|
1155
|
+
return "center"
|
1156
|
+
elif a in ("w", "west", "left"):
|
1157
|
+
return "w"
|
1158
|
+
elif a in ("e", "east", "right"):
|
1159
|
+
return "e"
|
1160
|
+
elif align is None:
|
1161
|
+
return None
|
1162
|
+
raise ValueError("Align must be one of the following values: c, center, w, west, left, e, east, right")
|
1163
|
+
|
1164
|
+
|
1149
1165
|
def set_align(
|
1150
1166
|
options: dict,
|
1151
1167
|
key: int | tuple[int, int],
|