tksheet 7.4.23__py3-none-any.whl → 7.5.0__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/row_index.py CHANGED
@@ -160,6 +160,9 @@ class RowIndex(tk.Canvas):
160
160
  self.MT.recreate_all_selection_boxes()
161
161
  self.current_width = new_width
162
162
 
163
+ def is_readonly(self, datarn: int) -> bool:
164
+ return datarn in self.cell_options and "readonly" in self.cell_options[datarn]
165
+
163
166
  def rc(self, event: Any) -> None:
164
167
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
165
168
  self.focus_set()
@@ -185,6 +188,8 @@ class RowIndex(tk.Canvas):
185
188
  try_binding(self.extra_rc_func, event)
186
189
  if popup_menu is not None:
187
190
  self.popup_menu_loc = r
191
+ self.MT.popup_menu_disable_edit_if_readonly(popup_menu)
192
+ self.MT.popup_menu_disable_undo_redo(popup_menu)
188
193
  popup_menu.tk_popup(event.x_root, event.y_root)
189
194
 
190
195
  def ctrl_b1_press(self, event: Any) -> None:
tksheet/sheet.py CHANGED
@@ -329,7 +329,7 @@ class Sheet(tk.Frame):
329
329
  index_align = "w"
330
330
  auto_resize_row_index = True
331
331
  paste_can_expand_y = False
332
- for k, v in locals().items():
332
+ for k, v in chain(locals().items(), kwargs.items()):
333
333
  if (xk := backwards_compatibility_keys.get(k, k)) in self.ops and v != self.ops[xk]:
334
334
  self.ops[xk] = v
335
335
  self.ops.from_clipboard_delimiters = (
@@ -784,15 +784,19 @@ class Sheet(tk.Frame):
784
784
  index_menu: bool = True,
785
785
  header_menu: bool = True,
786
786
  empty_space_menu: bool = True,
787
+ image: tk.PhotoImage | Literal[""] = "",
788
+ compound: Literal["top", "bottom", "left", "right", "none"] | None = None,
789
+ accelerator: str | None = None,
787
790
  ) -> Sheet:
788
- if label not in self.MT.extra_table_rc_menu_funcs and table_menu:
789
- self.MT.extra_table_rc_menu_funcs[label] = func
790
- if label not in self.MT.extra_index_rc_menu_funcs and index_menu:
791
- self.MT.extra_index_rc_menu_funcs[label] = func
792
- if label not in self.MT.extra_header_rc_menu_funcs and header_menu:
793
- self.MT.extra_header_rc_menu_funcs[label] = func
794
- if label not in self.MT.extra_empty_space_rc_menu_funcs and empty_space_menu:
795
- self.MT.extra_empty_space_rc_menu_funcs[label] = func
791
+ dct = {"command": func, "image": image, "accelerator": accelerator, "compound": compound}
792
+ if table_menu:
793
+ self.MT.extra_table_rc_menu_funcs[label] = dct
794
+ if index_menu:
795
+ self.MT.extra_index_rc_menu_funcs[label] = dct
796
+ if header_menu:
797
+ self.MT.extra_header_rc_menu_funcs[label] = dct
798
+ if empty_space_menu:
799
+ self.MT.extra_empty_space_rc_menu_funcs[label] = dct
796
800
  self.MT.create_rc_menus()
797
801
  return self
798
802
 
@@ -1565,8 +1569,9 @@ class Sheet(tk.Frame):
1565
1569
  ):
1566
1570
  if undo is True or (undo is None and span.undo):
1567
1571
  self.MT.undo_stack.append(stored_event_dict(event_data))
1568
- if emit_event is True or (emit_event is None and span.emit_event):
1569
- self.emit_event("<<SheetModified>>", event_data)
1572
+ self.MT.sheet_modified(
1573
+ event_data, emit_event=emit_event is True or (emit_event is None and span.emit_event)
1574
+ )
1570
1575
  self.set_refresh_timer(redraw)
1571
1576
  return event_data
1572
1577
 
@@ -1605,8 +1610,9 @@ class Sheet(tk.Frame):
1605
1610
  if event_data["cells"]["table"] or event_data["cells"]["header"] or event_data["cells"]["index"]:
1606
1611
  if undo is True or (undo is None and span.undo):
1607
1612
  self.MT.undo_stack.append(stored_event_dict(event_data))
1608
- if emit_event is True or (emit_event is None and span.emit_event):
1609
- self.emit_event("<<SheetModified>>", event_data)
1613
+ self.MT.sheet_modified(
1614
+ event_data, emit_event=emit_event is True or (emit_event is None and span.emit_event)
1615
+ )
1610
1616
  self.set_refresh_timer(redraw)
1611
1617
  return event_data
1612
1618
 
@@ -1743,8 +1749,7 @@ class Sheet(tk.Frame):
1743
1749
  )
1744
1750
  if undo:
1745
1751
  self.MT.undo_stack.append(stored_event_dict(event_data))
1746
- if emit_event:
1747
- self.emit_event("<<SheetModified>>", event_data)
1752
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
1748
1753
  self.set_refresh_timer(redraw)
1749
1754
  return event_data
1750
1755
 
@@ -1797,8 +1802,7 @@ class Sheet(tk.Frame):
1797
1802
  )
1798
1803
  if undo:
1799
1804
  self.MT.undo_stack.append(stored_event_dict(event_data))
1800
- if emit_event:
1801
- self.emit_event("<<SheetModified>>", event_data)
1805
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
1802
1806
  self.set_refresh_timer(redraw)
1803
1807
  return event_data
1804
1808
 
@@ -1939,8 +1943,7 @@ class Sheet(tk.Frame):
1939
1943
  )
1940
1944
  if undo:
1941
1945
  self.MT.undo_stack.append(stored_event_dict(event_data))
1942
- if emit_event:
1943
- self.emit_event("<<SheetModified>>", event_data)
1946
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
1944
1947
  self.set_refresh_timer(redraw)
1945
1948
  return data_idxs, disp_idxs, event_data
1946
1949
 
@@ -1974,8 +1977,7 @@ class Sheet(tk.Frame):
1974
1977
  )
1975
1978
  if undo:
1976
1979
  self.MT.undo_stack.append(stored_event_dict(event_data))
1977
- if emit_event:
1978
- self.emit_event("<<SheetModified>>", event_data)
1980
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
1979
1981
  self.set_refresh_timer(redraw)
1980
1982
  return data_idxs, disp_idxs, event_data
1981
1983
 
@@ -1999,8 +2001,7 @@ class Sheet(tk.Frame):
1999
2001
  )
2000
2002
  if undo:
2001
2003
  self.MT.undo_stack.append(stored_event_dict(event_data))
2002
- if emit_event:
2003
- self.emit_event("<<SheetModified>>", event_data)
2004
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
2004
2005
  self.set_refresh_timer(redraw)
2005
2006
  return data_idxs, disp_idxs, event_data
2006
2007
 
@@ -2026,8 +2027,7 @@ class Sheet(tk.Frame):
2026
2027
  )
2027
2028
  if undo:
2028
2029
  self.MT.undo_stack.append(stored_event_dict(event_data))
2029
- if emit_event:
2030
- self.emit_event("<<SheetModified>>", event_data)
2030
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
2031
2031
  self.set_refresh_timer(redraw)
2032
2032
  return data_idxs, disp_idxs, event_data
2033
2033
 
@@ -2242,7 +2242,6 @@ class Sheet(tk.Frame):
2242
2242
  self.MT.undo_stack.append(stored_event_dict(event_data))
2243
2243
  try_binding(self.MT.extra_end_replace_all_func, event_data)
2244
2244
  self.MT.sheet_modified(event_data)
2245
- self.emit_event("<<SheetModified>>", event_data)
2246
2245
  return event_data
2247
2246
 
2248
2247
  # Highlighting Cells
@@ -4142,6 +4141,8 @@ class Sheet(tk.Frame):
4142
4141
  self.ops.paste_can_expand_y = kwargs["expand_sheet_if_paste_too_big"]
4143
4142
  if "show_top_left" in kwargs:
4144
4143
  self.show("top_left")
4144
+ if "popup_menu_font" in kwargs:
4145
+ self.ops.popup_menu_font = FontTuple(*self.ops.popup_menu_font)
4145
4146
  if "font" in kwargs:
4146
4147
  self.MT.set_table_font(kwargs["font"])
4147
4148
  elif "table_font" in kwargs:
@@ -4872,8 +4873,7 @@ class Sheet(tk.Frame):
4872
4873
  if event_data:
4873
4874
  if undo and self.MT.undo_enabled:
4874
4875
  self.MT.undo_stack.append(stored_event_dict(event_data))
4875
- if emit_event:
4876
- self.emit_event("<<SheetModified>>", event_data)
4876
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
4877
4877
 
4878
4878
  self.set_refresh_timer(redraw=not get_only and redraw)
4879
4879
  if get_only:
@@ -4973,8 +4973,7 @@ class Sheet(tk.Frame):
4973
4973
  )
4974
4974
  if undo:
4975
4975
  self.MT.undo_stack.append(stored_event_dict(event_data))
4976
- if emit_event:
4977
- self.emit_event("<<SheetModified>>", event_data)
4976
+ self.MT.sheet_modified(event_data, emit_event=emit_event)
4978
4977
  self.set_refresh_timer()
4979
4978
  return data_new_idxs, disp_new_idxs, event_data
4980
4979
 
tksheet/sheet_options.py CHANGED
@@ -1,6 +1,23 @@
1
1
  from __future__ import annotations
2
2
 
3
- from .constants import USER_OS, ctrl_key
3
+ import tkinter as tk
4
+
5
+ from .constants import ( # noqa: F401
6
+ ICON_ADD,
7
+ ICON_CLEAR,
8
+ ICON_COPY,
9
+ ICON_CUT,
10
+ ICON_DEL,
11
+ ICON_EDIT,
12
+ ICON_PASTE,
13
+ ICON_REDO,
14
+ ICON_SELECT_ALL,
15
+ ICON_SORT_ASC,
16
+ ICON_SORT_DESC,
17
+ ICON_UNDO,
18
+ USER_OS,
19
+ ctrl_key,
20
+ )
4
21
  from .other_classes import DotDict, FontTuple
5
22
  from .sorting import fast_sort_key, natural_sort_key, version_sort_key # noqa: F401
6
23
  from .themes import theme_light_blue
@@ -30,62 +47,111 @@ def new_sheet_options() -> DotDict:
30
47
  13 if USER_OS == "darwin" else 11,
31
48
  "normal",
32
49
  ),
33
- # cell editing
50
+ # edit header
34
51
  "edit_header_label": "Edit header",
35
52
  "edit_header_accelerator": "",
53
+ "edit_header_image": tk.PhotoImage(data=ICON_EDIT),
54
+ "edit_header_compound": "left",
55
+ # edit index
36
56
  "edit_index_label": "Edit index",
37
57
  "edit_index_accelerator": "",
58
+ "edit_index_image": tk.PhotoImage(data=ICON_EDIT),
59
+ "edit_index_compound": "left",
60
+ # edit cell
38
61
  "edit_cell_label": "Edit cell",
39
62
  "edit_cell_accelerator": "",
40
- # cut/copy/paste
63
+ "edit_cell_image": tk.PhotoImage(data=ICON_EDIT),
64
+ "edit_cell_compound": "left",
65
+ # cut
41
66
  "cut_label": "Cut",
42
67
  "cut_accelerator": "Ctrl+X",
68
+ "cut_image": tk.PhotoImage(data=ICON_CUT),
69
+ "cut_compound": "left",
70
+ # cut contents
43
71
  "cut_contents_label": "Cut contents",
44
72
  "cut_contents_accelerator": "Ctrl+X",
73
+ "cut_contents_image": tk.PhotoImage(data=ICON_CUT),
74
+ "cut_contents_compound": "left",
75
+ # copy
45
76
  "copy_label": "Copy",
46
77
  "copy_accelerator": "Ctrl+C",
78
+ "copy_image": tk.PhotoImage(data=ICON_COPY),
79
+ "copy_compound": "left",
80
+ # copy contents
47
81
  "copy_contents_label": "Copy contents",
48
82
  "copy_contents_accelerator": "Ctrl+C",
83
+ "copy_contents_image": tk.PhotoImage(data=ICON_COPY),
84
+ "copy_contents_compound": "left",
85
+ # paste
49
86
  "paste_label": "Paste",
50
87
  "paste_accelerator": "Ctrl+V",
51
- # clear/del
88
+ "paste_image": tk.PhotoImage(data=ICON_PASTE),
89
+ "paste_compound": "left",
90
+ # delete
52
91
  "delete_label": "Delete",
53
92
  "delete_accelerator": "Del",
93
+ "delete_image": tk.PhotoImage(data=ICON_CLEAR),
94
+ "delete_compound": "left",
95
+ # clear contents
54
96
  "clear_contents_label": "Clear contents",
55
97
  "clear_contents_accelerator": "Del",
56
- # del/insert columns
98
+ "clear_contents_image": tk.PhotoImage(data=ICON_CLEAR),
99
+ "clear_contents_compound": "left",
100
+ # del columns
57
101
  "delete_columns_label": "Delete columns",
58
102
  "delete_columns_accelerator": "",
103
+ "delete_columns_image": tk.PhotoImage(data=ICON_DEL),
104
+ "delete_columns_compound": "left",
105
+ # insert columns left
59
106
  "insert_columns_left_label": "Insert columns left",
60
107
  "insert_columns_left_accelerator": "",
61
- "insert_column_label": "Insert column",
62
- "insert_column_accelerator": "",
108
+ "insert_columns_left_image": tk.PhotoImage(data=ICON_ADD),
109
+ "insert_columns_left_compound": "left",
110
+ # insert columns right
63
111
  "insert_columns_right_label": "Insert columns right",
64
112
  "insert_columns_right_accelerator": "",
65
- # del/insert rows
113
+ "insert_columns_right_image": tk.PhotoImage(data=ICON_ADD),
114
+ "insert_columns_right_compound": "left",
115
+ # insert single column
116
+ "insert_column_label": "Insert column",
117
+ "insert_column_accelerator": "",
118
+ "insert_column_image": tk.PhotoImage(data=ICON_ADD),
119
+ "insert_column_compound": "left",
120
+ # del rows
66
121
  "delete_rows_label": "Delete rows",
67
122
  "delete_rows_accelerator": "",
123
+ "delete_rows_image": tk.PhotoImage(data=ICON_DEL),
124
+ "delete_rows_compound": "left",
125
+ # insert rows above
68
126
  "insert_rows_above_label": "Insert rows above",
69
127
  "insert_rows_above_accelerator": "",
128
+ "insert_rows_above_image": tk.PhotoImage(data=ICON_ADD),
129
+ "insert_rows_above_compound": "left",
130
+ # insert rows below
70
131
  "insert_rows_below_label": "Insert rows below",
71
132
  "insert_rows_below_accelerator": "",
133
+ "insert_rows_below_image": tk.PhotoImage(data=ICON_ADD),
134
+ "insert_rows_below_compound": "left",
135
+ # insert single row
72
136
  "insert_row_label": "Insert row",
73
137
  "insert_row_accelerator": "",
138
+ "insert_row_image": tk.PhotoImage(data=ICON_ADD),
139
+ "insert_row_compound": "left",
74
140
  # sorting
75
141
  # labels
76
- "sort_cells_label": "Sort ",
77
- "sort_cells_x_label": "Sort ",
78
- "sort_row_label": "Sort values ",
79
- "sort_column_label": "Sort values ",
80
- "sort_rows_label": "Sort rows ",
81
- "sort_columns_label": "Sort columns ",
142
+ "sort_cells_label": "Sort Asc.",
143
+ "sort_cells_x_label": "Sort row-wise Asc.",
144
+ "sort_row_label": "Sort values Asc.",
145
+ "sort_column_label": "Sort values Asc.",
146
+ "sort_rows_label": "Sort rows Asc.",
147
+ "sort_columns_label": "Sort columns Asc.",
82
148
  # reverse labels
83
- "sort_cells_reverse_label": "Sort ",
84
- "sort_cells_x_reverse_label": "Sort ",
85
- "sort_row_reverse_label": "Sort values ",
86
- "sort_column_reverse_label": "Sort values ",
87
- "sort_rows_reverse_label": "Sort rows ",
88
- "sort_columns_reverse_label": "Sort columns ",
149
+ "sort_cells_reverse_label": "Sort Desc.",
150
+ "sort_cells_x_reverse_label": "Sort row-wise Desc.",
151
+ "sort_row_reverse_label": "Sort values Desc.",
152
+ "sort_column_reverse_label": "Sort values Desc.",
153
+ "sort_rows_reverse_label": "Sort rows Desc.",
154
+ "sort_columns_reverse_label": "Sort columns Desc.",
89
155
  # accelerators
90
156
  "sort_cells_accelerator": "",
91
157
  "sort_cells_x_accelerator": "",
@@ -100,12 +166,49 @@ def new_sheet_options() -> DotDict:
100
166
  "sort_column_reverse_accelerator": "",
101
167
  "sort_rows_reverse_accelerator": "",
102
168
  "sort_columns_reverse_accelerator": "",
169
+ # images
170
+ "sort_cells_image": tk.PhotoImage(data=ICON_SORT_ASC),
171
+ "sort_cells_x_image": tk.PhotoImage(data=ICON_SORT_ASC),
172
+ "sort_row_image": tk.PhotoImage(data=ICON_SORT_ASC),
173
+ "sort_column_image": tk.PhotoImage(data=ICON_SORT_ASC),
174
+ "sort_rows_image": tk.PhotoImage(data=ICON_SORT_ASC),
175
+ "sort_columns_image": tk.PhotoImage(data=ICON_SORT_ASC),
176
+ # compounds
177
+ "sort_cells_compound": "left",
178
+ "sort_cells_x_compound": "left",
179
+ "sort_row_compound": "left",
180
+ "sort_column_compound": "left",
181
+ "sort_rows_compound": "left",
182
+ "sort_columns_compound": "left",
183
+ # reverse images
184
+ "sort_cells_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
185
+ "sort_cells_x_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
186
+ "sort_row_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
187
+ "sort_column_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
188
+ "sort_rows_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
189
+ "sort_columns_reverse_image": tk.PhotoImage(data=ICON_SORT_DESC),
190
+ # reverse compounds
191
+ "sort_cells_reverse_compound": "left",
192
+ "sort_cells_x_reverse_compound": "left",
193
+ "sort_row_reverse_compound": "left",
194
+ "sort_column_reverse_compound": "left",
195
+ "sort_rows_reverse_compound": "left",
196
+ "sort_columns_reverse_compound": "left",
103
197
  # select all
104
198
  "select_all_label": "Select all",
105
199
  "select_all_accelerator": "Ctrl+A",
200
+ "select_all_image": tk.PhotoImage(data=ICON_SELECT_ALL),
201
+ "select_all_compound": "left",
106
202
  # undo
107
203
  "undo_label": "Undo",
108
204
  "undo_accelerator": "Ctrl+Z",
205
+ "undo_image": tk.PhotoImage(data=ICON_UNDO),
206
+ "undo_compound": "left",
207
+ # redo
208
+ "redo_label": "Redo",
209
+ "redo_accelerator": "Ctrl+Shift+Z",
210
+ "redo_image": tk.PhotoImage(data=ICON_REDO),
211
+ "redo_compound": "left",
109
212
  # bindings
110
213
  "copy_bindings": [
111
214
  f"<{ctrl_key}-c>",
tksheet/text_editor.py CHANGED
@@ -65,39 +65,58 @@ class TextEditorTkText(tk.Text):
65
65
  self.rc_popup_menu.add_command(
66
66
  label=sheet_ops.select_all_label,
67
67
  accelerator=sheet_ops.select_all_accelerator,
68
+ image=sheet_ops.select_all_image,
69
+ compound=sheet_ops.select_all_compound,
68
70
  command=self.select_all,
69
71
  **menu_kwargs,
70
72
  )
71
73
  self.rc_popup_menu.add_command(
72
74
  label=sheet_ops.cut_label,
73
75
  accelerator=sheet_ops.cut_accelerator,
76
+ image=sheet_ops.cut_image,
77
+ compound=sheet_ops.cut_compound,
74
78
  command=self.cut,
75
79
  **menu_kwargs,
76
80
  )
77
81
  self.rc_popup_menu.add_command(
78
82
  label=sheet_ops.copy_label,
79
83
  accelerator=sheet_ops.copy_accelerator,
84
+ image=sheet_ops.copy_image,
85
+ compound=sheet_ops.copy_compound,
80
86
  command=self.copy,
81
87
  **menu_kwargs,
82
88
  )
83
89
  self.rc_popup_menu.add_command(
84
90
  label=sheet_ops.paste_label,
85
91
  accelerator=sheet_ops.paste_accelerator,
92
+ image=sheet_ops.paste_image,
93
+ compound=sheet_ops.paste_compound,
86
94
  command=self.paste,
87
95
  **menu_kwargs,
88
96
  )
89
97
  self.rc_popup_menu.add_command(
90
98
  label=sheet_ops.undo_label,
91
99
  accelerator=sheet_ops.undo_accelerator,
100
+ image=sheet_ops.undo_image,
101
+ compound=sheet_ops.undo_compound,
92
102
  command=self.undo,
93
103
  **menu_kwargs,
94
104
  )
105
+ self.rc_popup_menu.add_command(
106
+ label=sheet_ops.redo_label,
107
+ accelerator=sheet_ops.redo_accelerator,
108
+ image=sheet_ops.redo_image,
109
+ compound=sheet_ops.redo_compound,
110
+ command=self.redo,
111
+ **menu_kwargs,
112
+ )
95
113
  self.align = align_helper[convert_align(align)]
96
114
  self.delete(1.0, "end")
97
115
  self.insert(1.0, text)
98
116
  self.yview_moveto(1)
99
117
  self.tag_configure("align", justify=self.align)
100
118
  self.tag_add("align", 1.0, "end")
119
+ self.edit_reset()
101
120
 
102
121
  def _proxy(self, command: Any, *args) -> Any:
103
122
  try:
@@ -140,8 +159,8 @@ class TextEditorTkText(tk.Text):
140
159
  return "break"
141
160
 
142
161
  def select_all(self, event: Any = None) -> Literal["break"]:
143
- self.tag_add(tk.SEL, "1.0", tk.END)
144
- self.mark_set(tk.INSERT, tk.END)
162
+ self.tag_add(tk.SEL, "1.0", "end-1c")
163
+ self.mark_set(tk.INSERT, "end-1c")
145
164
  # self.see(tk.INSERT)
146
165
  return "break"
147
166
 
@@ -164,6 +183,11 @@ class TextEditorTkText(tk.Text):
164
183
  self.event_generate("<KeyRelease>")
165
184
  return "break"
166
185
 
186
+ def redo(self, event: Any = None) -> Literal["break"]:
187
+ self.event_generate(f"<{ctrl_key}-Shift-z>")
188
+ self.event_generate("<KeyRelease>")
189
+ return "break"
190
+
167
191
 
168
192
  class TextEditor(tk.Frame):
169
193
  def __init__(
tksheet/themes.py CHANGED
@@ -183,8 +183,8 @@ theme_light_green: dict[str, str] = DotDict(
183
183
  theme_dark: dict[str, str] = DotDict(
184
184
  {
185
185
  "popup_menu_fg": "white",
186
- "popup_menu_bg": "gray15",
187
- "popup_menu_highlight_bg": "gray40",
186
+ "popup_menu_bg": "gray5",
187
+ "popup_menu_highlight_bg": "gray20",
188
188
  "popup_menu_highlight_fg": "white",
189
189
  "index_hidden_rows_expander_bg": "gray30",
190
190
  "header_hidden_columns_expander_bg": "gray30",
@@ -272,8 +272,8 @@ theme_dark: dict[str, str] = DotDict(
272
272
  theme_black: dict[str, str] = DotDict(
273
273
  {
274
274
  "popup_menu_fg": "white",
275
- "popup_menu_bg": "gray15",
276
- "popup_menu_highlight_bg": "gray40",
275
+ "popup_menu_bg": "gray5",
276
+ "popup_menu_highlight_bg": "gray20",
277
277
  "popup_menu_highlight_fg": "white",
278
278
  "index_hidden_rows_expander_bg": "gray30",
279
279
  "header_hidden_columns_expander_bg": "gray30",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tksheet
3
- Version: 7.4.23
3
+ Version: 7.5.0
4
4
  Summary: Tkinter table / sheet and treeview widget
5
5
  Author-email: ragardner <github@ragardner.simplelogin.com>
6
6
  License: Copyright (c) 2019 ragardner and open source contributors
@@ -23,6 +23,28 @@ License: Copyright (c) 2019 ragardner and open source contributors
23
23
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
24
  SOFTWARE.
25
25
 
26
+ ---
27
+
28
+ ### Third-Party Assets: Icons from Lucide Icons
29
+
30
+ Icons used in tksheet are sourced from Lucide Icons (https://lucide.dev) and are licensed under the ISC License. This license applies only to the icon assets and not to the rest of the tksheet software, which remains under the MIT License above.
31
+
32
+ ISC License
33
+
34
+ Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
35
+
36
+ Permission to use, copy, modify, and/or distribute this software for any
37
+ purpose with or without fee is hereby granted, provided that the above
38
+ copyright notice and this permission notice appear in all copies.
39
+
40
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
41
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
42
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
43
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
44
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
45
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
46
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
47
+
26
48
  Project-URL: Homepage, https://github.com/ragardner/tksheet
27
49
  Project-URL: Documentation, https://github.com/ragardner/tksheet/wiki/Version-7
28
50
  Project-URL: Changelog, https://github.com/ragardner/tksheet/blob/master/docs/CHANGELOG.md
@@ -0,0 +1,22 @@
1
+ tksheet/__init__.py,sha256=4q4kfmD7owShwMa_eV6g1z7fFkQgthXuiKAsdGDd_i4,2532
2
+ tksheet/colors.py,sha256=dHhmdFuQDlwohDHsAfT9VdrKoSl_R33L72a3HCin5zo,51591
3
+ tksheet/column_headers.py,sha256=S-5AQ-kmywDMsL061iWyHTVKNmikNBfHxML3zFnUD-o,103609
4
+ tksheet/constants.py,sha256=tuOYfha46w17N1wOZxWqDGlq-C25gTr1a3JILWUHqCg,25490
5
+ tksheet/find_window.py,sha256=P27qQsj9BxjALgfVfWV5tyRTDlnws-rCjnmZmoGzq1c,20917
6
+ tksheet/formatters.py,sha256=DGcRiMsDJnySNpQcjfiX84oJ7TmOSMdU6u9injIhA4g,10095
7
+ tksheet/functions.py,sha256=8d5T8UgNrJ3XmDFLGWXw19yVZQclLgMkinnTi5aDaLo,53163
8
+ tksheet/main_table.py,sha256=7jUcy3h2CsKoGmnt-dtYjCyUppnkGipdl8eVa5JuM4U,377951
9
+ tksheet/other_classes.py,sha256=4VcAxiPH8SxuNbbLSve5ynqfnLwMUGSUs1ZQp0Yc1Gc,18177
10
+ tksheet/row_index.py,sha256=EHn6FJB6I5EawX0EPpz0lxqeBAPlT4EXCIh1XHB1R1g,141881
11
+ tksheet/sheet.py,sha256=OOvi7lSi-Zm6xSo9rTgdR2mItEM-p2bjFJXKZ9ECVwM,269918
12
+ tksheet/sheet_options.py,sha256=bB-XBs1sL2w9a47wSM6GD960ZKbvQuU2VvYIK2JRSjE,14567
13
+ tksheet/sorting.py,sha256=zcZPpRtP1h_xJGtGkG3E43H7deKQFnh9cMwZ1B2-aGc,17502
14
+ tksheet/text_editor.py,sha256=bkVRWYE3fCIo5xvwUBkmkBJ6nBGV2X1VsZ4LhQ5146I,8366
15
+ tksheet/themes.py,sha256=kUUCUmvgu8vUlzfVNk9a3BEbeBcU3asNwPB_u-OejCY,18471
16
+ tksheet/tksheet_types.py,sha256=1MjXR34EmvP1KfHlLTvKKVnf0VMz_LU_WOM2q4o5hfI,4598
17
+ tksheet/top_left_rectangle.py,sha256=A4wWL8PFl57Pn2Ek71rASCE1-bW844cTl7bgt4tLWzI,8499
18
+ tksheet-7.5.0.dist-info/licenses/LICENSE.txt,sha256=n1UvJHBr-AYNOf6ExICDsEggh9R7U4V4m_gH7FD-y-o,2305
19
+ tksheet-7.5.0.dist-info/METADATA,sha256=0v3K5izYFSvikrOGjzMPPuNyw4bGvtrsp4wk1-FgTYU,9474
20
+ tksheet-7.5.0.dist-info/WHEEL,sha256=GHB6lJx2juba1wDgXDNlMTyM13ckjBMKf-OnwgKOCtA,91
21
+ tksheet-7.5.0.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
22
+ tksheet-7.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.0.1)
2
+ Generator: setuptools (80.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,41 @@
1
+ Copyright (c) 2019 ragardner and open source contributors
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
20
+
21
+ ---
22
+
23
+ ### Third-Party Assets: Icons from Lucide Icons
24
+
25
+ Icons used in tksheet are sourced from Lucide Icons (https://lucide.dev) and are licensed under the ISC License. This license applies only to the icon assets and not to the rest of the tksheet software, which remains under the MIT License above.
26
+
27
+ ISC License
28
+
29
+ Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
30
+
31
+ Permission to use, copy, modify, and/or distribute this software for any
32
+ purpose with or without fee is hereby granted, provided that the above
33
+ copyright notice and this permission notice appear in all copies.
34
+
35
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
36
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
37
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
38
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
39
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
40
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
41
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -1,22 +0,0 @@
1
- tksheet/__init__.py,sha256=EnHhyTDrgSe8qTi28EYl56aynnSF8TxhBAq2xjoPcSI,2327
2
- tksheet/colors.py,sha256=dHhmdFuQDlwohDHsAfT9VdrKoSl_R33L72a3HCin5zo,51591
3
- tksheet/column_headers.py,sha256=cP0RImb-EgHdVLSfNmU42k5GwCol7akKgMH6xq1sZfY,103339
4
- tksheet/constants.py,sha256=aiDvUSaPtl_TSNtRRJ_p87c9iTBz9ksMd5IsSXzz4Hk,13316
5
- tksheet/find_window.py,sha256=w6S0FZFLRNHiM57Oq97avALT_PctIBPegSxnkNUwkwk,19982
6
- tksheet/formatters.py,sha256=DGcRiMsDJnySNpQcjfiX84oJ7TmOSMdU6u9injIhA4g,10095
7
- tksheet/functions.py,sha256=gwf9X9ENHmoikjbXtoj-00uUVQGRJVffkeJHoR7yB2E,52993
8
- tksheet/main_table.py,sha256=YwgqTWithMHXoUpYsBGPrp3g5vtGqjSnwiLdq3qPKo4,367715
9
- tksheet/other_classes.py,sha256=4VcAxiPH8SxuNbbLSve5ynqfnLwMUGSUs1ZQp0Yc1Gc,18177
10
- tksheet/row_index.py,sha256=8zuNU00ATmz5oumEqSyB_nOUAIuCS23mUfTpq3R1WOM,141611
11
- tksheet/sheet.py,sha256=xj2xIaoZQHPlG95hOduNT5NsVpZ0Mb87xJB935caOzA,269918
12
- tksheet/sheet_options.py,sha256=ob-XYgGfBoi2TaFAvUUmlWUkw9xB-yXmJw17gu9__Lw,9948
13
- tksheet/sorting.py,sha256=zcZPpRtP1h_xJGtGkG3E43H7deKQFnh9cMwZ1B2-aGc,17502
14
- tksheet/text_editor.py,sha256=rU8Fz0-ltkM63W9io2DoZJPyzUGzCc9Z0qBtc4D1H40,7404
15
- tksheet/themes.py,sha256=AoNAxibnQi04MN0Zpbn9-kyDnkiiV8TDNWP9FYjpuf0,18473
16
- tksheet/tksheet_types.py,sha256=1MjXR34EmvP1KfHlLTvKKVnf0VMz_LU_WOM2q4o5hfI,4598
17
- tksheet/top_left_rectangle.py,sha256=A4wWL8PFl57Pn2Ek71rASCE1-bW844cTl7bgt4tLWzI,8499
18
- tksheet-7.4.23.dist-info/licenses/LICENSE.txt,sha256=ndbcCPe9SlHfweE_W2RAueWUe2k7yudyxYLq6WjFdn4,1101
19
- tksheet-7.4.23.dist-info/METADATA,sha256=4DhkRE9dHocL93gc5iWbfZOub24S2u0DdZkZwULoOO8,8117
20
- tksheet-7.4.23.dist-info/WHEEL,sha256=ooBFpIzZCPdw3uqIQsOo4qqbA4ZRPxHnOH7peeONza0,91
21
- tksheet-7.4.23.dist-info/top_level.txt,sha256=my61PXCcck_HHAc9cq3NAlyAr3A3FXxCy9gptEOaCN8,8
22
- tksheet-7.4.23.dist-info/RECORD,,
@@ -1,19 +0,0 @@
1
- Copyright (c) 2019 ragardner and open source contributors
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy
4
- of this software and associated documentation files (the "Software"), to deal
5
- in the Software without restriction, including without limitation the rights
6
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- copies of the Software, and to permit persons to whom the Software is
8
- furnished to do so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
- SOFTWARE.