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/__init__.py CHANGED
@@ -4,13 +4,25 @@
4
4
  tksheet - A Python tkinter table widget
5
5
  """
6
6
 
7
- __version__ = "7.4.23"
7
+ __version__ = "7.5.0"
8
8
 
9
9
  from .colors import (
10
10
  color_map,
11
11
  )
12
12
  from .column_headers import ColumnHeaders
13
13
  from .constants import (
14
+ ICON_ADD,
15
+ ICON_CLEAR,
16
+ ICON_COPY,
17
+ ICON_CUT,
18
+ ICON_DEL,
19
+ ICON_EDIT,
20
+ ICON_PASTE,
21
+ ICON_REDO,
22
+ ICON_SELECT_ALL,
23
+ ICON_SORT_ASC,
24
+ ICON_SORT_DESC,
25
+ ICON_UNDO,
14
26
  USER_OS,
15
27
  ctrl_key,
16
28
  emitted_events,
tksheet/column_headers.py CHANGED
@@ -164,6 +164,9 @@ class ColumnHeaders(tk.Canvas):
164
164
  self.current_height = new_height
165
165
  return expanded
166
166
 
167
+ def is_readonly(self, datacn: int) -> bool:
168
+ return datacn in self.cell_options and "readonly" in self.cell_options[datacn]
169
+
167
170
  def rc(self, event: Any) -> None:
168
171
  self.mouseclick_outside_editor_or_dropdown_all_canvases(inside=True)
169
172
  self.focus_set()
@@ -189,6 +192,8 @@ class ColumnHeaders(tk.Canvas):
189
192
  try_binding(self.extra_rc_func, event)
190
193
  if popup_menu is not None:
191
194
  self.popup_menu_loc = c
195
+ self.MT.popup_menu_disable_edit_if_readonly(popup_menu)
196
+ self.MT.popup_menu_disable_undo_redo(popup_menu)
192
197
  popup_menu.tk_popup(event.x_root, event.y_root)
193
198
 
194
199
  def ctrl_b1_press(self, event: Any) -> None:
tksheet/constants.py CHANGED
@@ -345,3 +345,183 @@ for o, b in BINDING_TO_ATTR.values():
345
345
  SELECT_BINDINGS.append((o, b))
346
346
  visited.add((o, b))
347
347
  visited = set()
348
+
349
+ ICON_CUT = (
350
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAxxJREFUSEuFVstq"""
351
+ """20AUPVcqBLLqoiZxVvK2u1JKoFCIocs0/5BlIP6AkWyJOI30AQ5k6X5Dkl1psiwhP6FV3JKuA1lYt7nz"""
352
+ """sEaW3Qps7NHoPs4594yIADDal163XwRe+Vs/aQOsjkOgdTfqtOtKaBbV2rUoTvbZu+Oi+IAKIwD79vFr"""
353
+ """BHyaqvj+35WuT7boQIJThTvTNFcEAQaBRirA7ihW9x4idURbXFYUUQhMZU8Wq76BXaLYDsZfi0sAX5h5"""
354
+ """+uf37EiW32x3Lwh0COAqTdTBIqqPx0s5WV5ErxhTrrAHwrcsUYeOVz9BJdU+/nrYnEzOn4WDwfFgo9Pd"""
355
+ """eSKARkMVCtfLpevKmafEtMeMMh2q3lJ+88j4LK8A4sfZw+bk3CYYDDY62ztP0muaqLApOEJW5FHIGpY9"""
356
+ """AsrRUPWs3OpmXbbxmQ/Rw5Hg19nufgfw6eXzI03izwZT04YJTjo4gDJLVM/Iuk246cAo6M5oiqUbWRaS"""
357
+ """5ZrNA3w8UaqUP4J5CJ6CSQdPk7jnR27MUJ2UMC7yJZnyDUBvCegKvvMQfUngYDHBVW+h8zUDu+q+I5+z"""
358
+ """PI/Cim7BiEBcgqiEVguXWRL3ajk2FNCY8P+MpOBdRGGFW4AjzYJWS9yrLaRZY0NFNV5+nppMjbmWoqcW"""
359
+ """Dcu6q2lOBopmbOHLrbME94bIqMUmHStVtg1xqRu/g7YX8Q2IXoPxHnaI6snPxVXKeYD+iYrLlfqUHS7B"""
360
+ """OPe9CJVeZwQgqZdmaaJ2XKM+ZKIkk0SVzhBdEc673CRfAtTwos7Wzk8Q3rW8yPEixGt1eUlWIG4TFMaL"""
361
+ """tFVMnmXRedFqq2iqS8NF6J/EcemmXWLUdu28SJvd5FkgOrZepM1Oe5Hg1fQCI2G+BShycGnyLU4LFTW9"""
362
+ """aHYkGzpb3QsiOiTgajRUB2JkjerssaqtQ88JIoCtdej6fZLFJsh6kSXZHjgIsJsqdW8ecWe1L0frrBUy"""
363
+ """2ZMmSs4Q00NLpnOMQLxvT7RrBDh1wRf8rTumW1PrTrQ1JtVAu/X24C+0brr6m28VvrO2sF6QVr/C+K8t"""
364
+ """vvbr34S/2B2/MddUJi4AAAAASUVORK5CYII="""
365
+ )
366
+
367
+
368
+ ICON_EDIT = (
369
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAn5JREFUSEuFVu1h"""
370
+ """qzAMPJEMQjYhk7x2DEIDoR9hDPomSTd5HiRYr5INCHBa/yK29XGnkxyCLALA+jWtzVbcSFxNO4ie5L75"""
371
+ """XEWxJ2nPeqN9e79k2a5hhgPha8jQtmXpJHNSO2v8Y6YWLKHprvmO0YO5CCeyJElyw4Dnti6/DIJo/Iib"""
372
+ """yCWB1UXTdfme0TOjAODuGY5imt39E2VZI0jqU6l7CZIe8yEnddfFzIPzuioPoxMJvPP4N+6HABtaEpzF"""
373
+ """i0oL0MOrc1luyPjYlicnP5q3a7HL6CYw65eSQg02UQhKxapAmp1yHjKPAXKA3T2jIzGgwRkFD75t6upi"""
374
+ """AliytsSNzkmMGa5+KQ9C1d7jBnAuhQXBiXP6RnWOtG0DxKwtgpkWVYs6F9haj6uiugHIo4pcXZ1iTYSJ"""
375
+ """5JqJm2gRzokXxkLumrbgfO6nHxutkezAPZiiWk6HUaaS/6oPJmTrkiYxKL9zE01SHLEF5xTURFaqUSBT"""
376
+ """3yTcr2E3VXmwSgvnEVks+Jz1soc2jRaaiHtiKjg2kTVR57EPVC2x4JYWG2zRaHPmXND3PAlSmyH/hizF"""
377
+ """9WLYvV67W+CUXVOdIi3BbOHc0mJn1GZyIk5THbkfFx1Sq9mSVMsKmUW5RjHV4PWjkwGVDx7H9hzG7Dg1"""
378
+ """7Xiwgy2R8ObxsQFUKHVVTnuhD+bZI84fjUE7k22vqLPX9+4JxD1An3VVPmsg6YN5asY+2EpwMShtPcZv"""
379
+ """MWmluIzCe9/K71iLMSmnffD4iVBabNZK7vgEaIBO1KPStG+/Y+//NufqspHfhqflxoIiDSAUZfwHTLk4"""
380
+ """9Xv6HB+QxGs0xUvHsWjGlzoth1//zjwys538H8mvnjDSt4tXAAAAAElFTkSuQmCC"""
381
+ )
382
+
383
+
384
+ ICON_SORT_DESC = (
385
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAf5JREFUSEuNVW12"""
386
+ """gjAQnMWDVG+CJ+nzGJEWEIsco97EHoWDKGmzhLD5svL8ISG7szszmxCSD4GgodMfE6sEiN3yjdYXm5QX"""
387
+ """fAC5RyZakXwAWYEHwMF2bzqpV9vzLl2hBi6ouhmG7UbjGxrbR4F9p9S40JWuVXZv6xeFuqrNpyU5aZQ2"""
388
+ """6Xi3IK71iMYnFEm+ROUlrxsE4t94J+xPRzXyekKnSHmvA1E5JpQgmERbG7T8Hw1dJ2VB4NNiMaWMrhau"""
389
+ """qOuHGzRM5WNdqV3XD8zQo8BuM+E2A+qxqY67mbq84Embns59S0XxbpKb4K6/cJ66UsTUTWjs+yF2mk+Q"""
390
+ """b33xTSIvHRiAV/wum/J7exUgIvm1aReD5rd57getNVB/zB10F6ORLue0wmLsNGu3JQXhp67Ufj4RhO3k"""
391
+ """MRBSZDViHbxntbI7jQi4flbqwKll5zKQAWwHuemNPJkYhmwHIUVebKjieoRFfogBbHBOg9n/QoOId1nK"""
392
+ """okE0OEAIEGsQCAtc64V3cTtkXOQPWkStXUjr5ysmhshPI0XOAaQHMLis/LHWxrp8o537ixkDPip4Dobh"""
393
+ """himYAyLrd9mSPKVI2lScr38o7fmrLah4qz+OBzNabde3tCka3rXS73hPONS5OHFN5ipKkJW/a5x1XFRu"""
394
+ """7z85AlSpwUJRwqZPBUwMWno/8Au5DCkvTFG1swAAAABJRU5ErkJggg=="""
395
+ )
396
+
397
+
398
+ ICON_SORT_ASC = (
399
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAhZJREFUSEuVVu11"""
400
+ """wjAMPAGDhE3KKIyRBBIaXuIxYBPYpCwCbmU7sfyV98qfFlv2Sbo7GcLyIQA6/GaWwnUT4Jb8DoGg3Wm5"""
401
+ """yesxQPk+f3cmRgLLO1MAv7tkmj8sA8P/ZeECwAW53WGaHrzSNfWB/w5KPfDBl0yeCM9zWx+Wzrqzpl2i"""
402
+ """Uy5T2UfgOirNjHRtTRx7uY4X2lBvg+2HgPv5VB8FddmOZ2olXMdpAUi6FpQhhJBwE5Ac4vgKGjLqKhGb"""
403
+ """TW/W4z8Ahkk9oCUHGqap3EfiBOg58xXKtyCGYVTGFGscREfvneEj7F9BRYAB0EB3ci0qaTVjxpiibBeH"""
404
+ """cQoq8B7PObnkiZkDqV+XqVeRrWDmwGybvkveHR9ev46PFZIlB3zuexgvtN30Zf8GFrif2/rovOJh5cDK"""
405
+ """+6CsVakcKWvj0rm/kq/YyQEHCeGxcubJyup1AHb2EN7A8btpXpLkXqlqq3HjVLqmORTHdYZLK1MysjRG"""
406
+ """AvB6b/Rh96Efzvq9wd5c/sEXSN/7tjmm1STDJHgzzJd+UtX2AwapQHgBqCy4fkKTAe7aep9MMz/4Yo9Z"""
407
+ """KiQ5vZosCHRlZ6vVJIFe51O9j6dmxmOJyAIAvrLjSjSDuAqCzOVzuGYu/3ymo+IvZyZ1p3HTGhW3JX6h"""
408
+ """bGUhWCLTuXXJ4UySPqa0WZ7Zi4pCM2RUUe6I/DESRa2MipSt9Zcrsuty/BfWPCAzd/TdsgAAAABJRU5E"""
409
+ """rkJggg=="""
410
+ )
411
+
412
+
413
+ ICON_PASTE = (
414
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAlFJREFUSEt9Ve2h"""
415
+ """oyAQnI2NmE5MJe9SBppINKeWkXeVJJ08CjnlDgRcRPWXIDjsfCyE8BAAvQzX83ufkx18IYGWoXtj3+Vz"""
416
+ """KLITXgTkEbQZkAaB1N8J1+YuPhYn/rc9r5lyDwcgEDSafnhD6yJaltao6kqcN0oPmAHZQDye3YNOpy8A"""
417
+ """ud8kK0Fb5LXdwKfV/xqauiq/OdVRBc+u/6U1XqEuR0VdlaYkQMdCPLtBb1B3nUFmzmKAvn9rjWKccDG8"""
418
+ """tpYiFHvl2/kTPrUQFzkMeTbhB4CSlTh74Aig7Xo7X1fCil8bkTPIAxA1WpHLj6Gl/T0Y5e3+zQo4wOGp"""
419
+ """dz623WAqyBeAlT28aL4CTzmnf8OJAc7Q1AhhxI6MExYkALGBV0afP1qdoDESXZtSKGMEY/GgAT/RAlBS"""
420
+ """SAlXywVnnpp3MiOokXAxIFGVfOBtFyg6rGDeKfshzzTeLjdqPOHSCqH8IZiLAFuBBuqbqyARM86BH8mh"""
421
+ """z7OJjKVzECyI12IGcCv3Kghc+0zYAB76TNU3cV71ImABKMkKxQ7czC1EHv7WN0Giz70Sl1nw8BDWQeNi"""
422
+ """+uAsfWZpjrLv80zTywVyI8luLbcpP+mSg7il27SbFqH1izQVGkg6K7sP9imKpY3jMNvUtvSI9w0XxRRx"""
423
+ """6pJMMPv69p7cCazY8C8ucsL1NmcBajHFKsncpiyV17oS396+CUVJAAF3vb71NDXyXj02u2ly4dhVzvR7"""
424
+ """3l/NJwD8dO7SKED4Wu6ADYAEzE4oPU5/ZH17cHqP87juu6vGlxgh0Qn4B4YcZzGhG9dFAAAAAElFTkSu"""
425
+ """QmCC"""
426
+ )
427
+
428
+
429
+ ICON_CLEAR = (
430
+ """iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAktJREFUOE9tVOuB"""
431
+ """o0AI/tAU4lZyppLVQoTMWEhMJclVkhTiLifDjFEv/vGBMN8DIOwuAqAANvf8SKRQC9lVwuWVsMYstF4i"""
432
+ """0tSnuk0Zln1I3L6XEDNP2zOoBGKMHYDrLpjwHqs6QlLnAuD1q3q7iFwskBESYgyW+yDFzf4q7JzigVNW"""
433
+ """JR/1B4qWmb/s3c5CQkd6haIvFD5IlX5PRRI8LzeOsVNNzFJuQjhmukroeTBNLFFTTnpS3YFcnSFFDKtU"""
434
+ """PUsuGOPYEfSqQC/Mk9MlCA/Ngv61pW/GhRBexe1dwYJwNYTIKS+MRLg51fVTQRPz0Ls04Q6gmef5bAcZ"""
435
+ """vfA20xGa3mELO5/CIk1VVR1RJYCaNo2CWkAfwnI2/Qx5HGOHnYZkGo6dQl1Y0zC7akXrquoqIsm0HyJy"""
436
+ """Nk0/U5Yp2WY6EOGqapSHae0SjxnNNnf/JMy996aJoAj/IcwuK3AlQj8kl/2KY7xbjxHw+FX9S0SyaDgx"""
437
+ """c9LUOyR0SlhbLiEcQ/SPoJ6HYbJvMqQxfFqxQfgsAzdVXZum3z8/83nR/eXsQpowAvqBjXIR1sZO0S/u"""
438
+ """Tpqbdj90x8WxsuhIsbbcG6HPcZ6UbXLWP30yZz32YQf0XBCKSHuq6zs2Gu7Q5WVwnHH7x3rY9If18OCG"""
439
+ """IrVHXT8XNx8E3MqkrCsi2V6s2syNn/oNovZnnr9CDNbsPreXEC4VVeLtul0CuVD6syxSz1kRrzsgb5uy"""
440
+ """pX3cTq0XfRfyzLIE8+LIYRu3feydenjau7ovU4xJO6m0ZDr0H9VKXi8tUg0XAAAAAElFTkSuQmCC"""
441
+ )
442
+
443
+ ICON_DEL = (
444
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAilJREFUSEuVVu1Z"""
445
+ """8zAMPLXvIGWTMAl0DBOaNoUmYxQmCZvgQWj9YllO5NgpkB/Fjz901p10hjB+BIKDmybSEQHLi4Be5rH8"""
446
+ """+D8KIi4UYk+n0mhZAJkQRAVAOLy8Hlar1QOADW/z6RD/yFgOZ/MOnL+D/R60TW3eQkp+1n8EHF+7R4DO"""
447
+ """IWiBJ5nPqChTumUQHerYdQM5qr4uuG8b86EZiZfw4Lek2Pf9Zn11nwDZ5tnc8f544HjqWd/m2Xitw/eD"""
448
+ """sCX6fRx/bFcb5kFRJABqIamoJTAlpt8/XjQH6JiAJIO/plECmCgSAJ2BF//UD37PF7Btn4z1mMy1w5kp"""
449
+ """fTL3mqpfUiRNxwBBfAfYywocjIM7VN/l/NbUZjsHYOCEIk5NZzARvu+7zb8rDS70hiWCdSG4bWpzN6+G"""
450
+ """MQ4XS9IHqfq6vz3I+oIBJA0owbNS1hpINS5UUVoyI+fOVVJ4TFdrgia6nstVVFA/ZjAFD7QINNOVgoQT"""
451
+ """KdWzPtANMlrIqR9EUOY8dCsGwG0IZHejDtFydD/NNNDqxwzalxMboA4kIHu50O0q0lbBB7RVlI1spHxS"""
452
+ """ahqVKdLcZQC/9M/JlYMj5H2QelH58jPjmW9i25+ZXaxlbwki5ujl8dHg1+YHs2MLOfbVes398hEshBK7"""
453
+ """fiTgvPgmZyktvXS8cXpw4sWkMioQHiSTJYmXn1LAuuv1/bCrD4VHP/2v4uZbk+le2K3kkpumApZKcDml"""
454
+ """5ZX/A1xULlr4HbYAAAAASUVORK5CYII="""
455
+ )
456
+
457
+
458
+ ICON_ADD = (
459
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAYZJREFUSEuVVdt1"""
460
+ """wjAMldNBWKUdhTEC1IVAyBpsQjdLjx+JJesqTvPB4ThGV/ch4RwRzfGDdjz5Ir/PC4A64Qg+qka8JSuo"""
461
+ """5jh+fqkB/kcpN6cqr027Uk/27GiWqgFgiwEnmwC4SBYDRzSM0ztc9af+SwtWKchIrdJisPw6ADym2Is/"""
462
+ """96Z3RZvUefsiM3YYn/En/tIHBfUD0rUjReVXw7iHgTRce2A1FiXKDLJE2K46LMYUxBRVpgQG4eg7AoCZ"""
463
+ """UGFZPNhIDtdaAshqPNa1FYLD8JzeNM+fjrCP8XIwWLiXDxz9hghvAtzu49V13Q9gW45iPY6Sv8/08pfT"""
464
+ """kU8W68PWdHljS2RtDEfGJNcWpgLrHPBBU9MpU5MY7DZZxlTsHLZyhAe4gWTxElMuUVkV+Y5Up7Sfm2YM"""
465
+ """gCxgDvAuwg2FiiJsrclsmmxsATjL6PB2f1xd93Hw5/4I1zU3hUlXb9hNwNZKr7esngO1ci28Rj4RAzy9"""
466
+ """Mi0Yrt6g5e+WDRroSLHhYPsY/AFsVMwga5Ld0wAAAABJRU5ErkJggg=="""
467
+ )
468
+
469
+
470
+ ICON_COPY = (
471
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAjdJREFUSEuFVuuZ"""
472
+ """qjAQPYOFXLcTrGTXMiIIImLK0FuJdrI2smRvJgEmJLn6w4+Qx8x5zATC/CMQDAwB/m+ZEk9ymp8Tq+R7"""
473
+ """mgZdP5yoKD4BbOc9drddsA7gxq9/s11TqXsyE35J4ADdRX+BcEtnJKMYu2Wd9T4ZxB/G+Z2v+gGD8mfE"""
474
+ """rmvU838UTdm2+rrdjPQNg1dTq480CpuODTBoprKp1ExIwOPMdYiRaaXiT1OrvdRSKpMNkOGdM3onbLDX"""
475
+ """a2DJDRB4jVaneae9cU7oTEvRRRuQQVMdVp4Buv5yomLzCYOtXcO2SrhLxAzc5SjiAB6B4ODM7jK3hHOW"""
476
+ """80KTwSbB6w32Ta3uIkCMwLnLlD8j7bqjeq6ZSdVkq/V2M+Lb1klTqY+pDiKKWJucu96U8+LKA7kAiYMW"""
477
+ """+3pkkX3SRrb7+kEby5zVNNZA8BBok+8H0YysK4EgoYFEFhEeQlpGhPNwnQvXIdD6gRElAftjre5Tq3CZ"""
478
+ """JOwr+szUfbkTeywpDb4A3HxxPZuD2qW1yfEeouEABmhq5TRw1jIliGxBWXtxb5kKsK0O5DLNNZBQhkjk"""
479
+ """qcGsz0hRlPfOFITQD1fvIo9gmQqTjLus7EX5UJGLHPK4T04IIoq8o6SwkiSmiDXwdRAwKBzS+YsIcH3F"""
480
+ """uit96JJc2+tyU+ABgjNLrr97kfkqTdeYvD7nBsdE+DP5KnUBMnQG7hpRzh8AuXbt3r/MOP5tj9VpvvQn"""
481
+ """98lqZLmjwPLTRk7Lygvx/gLRN1wxA1X+ogAAAABJRU5ErkJggg=="""
482
+ )
483
+
484
+
485
+ ICON_SELECT_ALL = (
486
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAiZJREFUSEuNVe11"""
487
+ """gzAMPJlBmm4Ck6QZwyF8tsAYTSdJNmkG6cONhQk2tkn4kUeELEun04lgPQRA8Y8xGgNBGZP56Dna/nZE"""
488
+ """QLsGnlgg7/bH2eULYUlodUH92dVCiD0It+ooM11I2w8XKKQgXMujzHSghm0qBdG1zGWmy2O/ETsQmjKX"""
489
+ """Z05dWRe0Xf8B0PeUkjqX+fGg35rPriYhKgDnMpe+7SQPOhD7kagMJge+5H7+AZHOgBTSvxFZU8hrGLoY"""
490
+ """mlO61TDskhG/AG7lSb47FZhM3+YsYxeEu7DgruMIId4Krkzb5zr4z8yWV/pu+9ukmGCZiEggO6NNRgWY"""
491
+ """6J0NBHN6oGPMrFgq83ntzMrq4rbvLzpzzTi3yV3PIBW5JC7tKVwBHwLar4Hvn+LAQHQP2bRMR7fJmxMb"""
492
+ """xmMdx++BHdR7txsYgC7CjbhYxJVhdSbGonnQNHad3RyDb4Am3BtPBJfKdJNNL1lCFhbNTT5JWkvq84Yv"""
493
+ """BbXdwCNQOk1mzfmqSSSmyc+nI9aNtSI4cr0J+StTZQ/PDKPHxBg1vcOB0bZNnlxrPdfY8QTGIdoEj8li"""
494
+ """x1mzSFEKgLU8hogtZMtunQKV7ZAmibrwIvKlYvgAMC0cs730q7vRjplmVDPw9kqJcC1MoIff/TuBDsVJ"""
495
+ """nhe5vstrNfS7ZCS9GvdQuPFeYAlhdr220YTYq3H8qYq8nokblWtH063hWsMyD51td/iwSZoYUV6WEOAf"""
496
+ """jjY7LKuzEksAAAAASUVORK5CYII="""
497
+ )
498
+
499
+
500
+ ICON_UNDO = (
501
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAjpJREFUSEuNVv19"""
502
+ """wiAQPdBB4iZmk3YMYg0h/jRjtJ1EN5E92kB7BMIRiJp/QHLc53svMsCHAYB1u8KevvQ2ryz+Gi7zU3a1"""
503
+ """Fj1NKFqlXpIAz6vxBZLsrNszYGDTJjyuYLrQDkO1sfCJgdtG1MvOvNK8vEX+FjrfAnyCgT0AfLUH8V4c"""
504
+ """1pMozFfohhxsZcgcnTPQ7UHsXplryYZUMLmfnVuXedn5q73BpGkF1DkD0EefObWhQHiOuhDA13a6DFfr"""
505
+ """MkdSML/4Pa1/OtL+6DZyUL0QOlBpmcR8NQZIvU2YwqcQbDLVxpjv7njo0jngTcJe1yID13/UVNiiXw61"""
506
+ """Eo2OCIhNQVu8yn/NG+Nc4htjjJKLIBnRaBDMbORQu/IfDFYOl2pj2B0s6NHad3VsbgGSSQVhmPLiK7FQ"""
507
+ """Ya8xiGqEplBeQrI7nTvOuAQON9mIemppaNH8wyLrXUdiJbYCYLr9ELtZCzLAM3BVjHDHhORB7Kh2pqpF"""
508
+ """Lvsg0kmFYzLlctozb3tPubOoIGr2EgtOzxK2zxah4tOw3zC4zi0K9msyW1bWXIpDYHU6d4imqFt+Bhk4"""
509
+ """6AGV4uw8Srfsh/2WA5IURgt1fxS3dAYFR2uBacU4WP5j3tjGZQ52NEq2H138NiQzSD8mcQqTy/4yXMHa"""
510
+ """vWO1I3TKajuTLG/jDI1sHsRW9ecOM3VH0be2xnybLf9SQgRtmjgWupIp5Rpo15hcmBn9BzHJdYE4DyGb"""
511
+ """QSzlh5tBDtO1GdDoBZgutXmR7R8TrUAvyr2/1AAAAABJRU5ErkJggg=="""
512
+ )
513
+
514
+
515
+ ICON_REDO = (
516
+ """iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAkJJREFUSEuVVe2B"""
517
+ """oyAQncErRCu5tZJNykAjijlDGclVEjuJhZywgqggmN3zT3QY5uPNmxeE/YMAoKzRvpuft3YEBOX7OCHW"""
518
+ """1yOnrYajjG5BbiUA+iv6RAqG2X1pL3ItcjwnCKIdeDqx25t46qsjwplTOgRdxiAKwD8aEAK03e0JCj8A"""
519
+ """YBgJ5FuSH0J0BN1ir4VIEwm6i3SfZA/If0Br2WKzBEkQcl4UgyGLB9Hb2blBw9HXN5EmKt7JMt4oGro6"""
520
+ """8k+eMCG/QYHG2jJoIZ6ucXs3ZRiTGlhZZDNxEDBYosmHX7sGCam9zDae8Z8DOQkcT4SeFTRfLM4ezFA0"""
521
+ """JjjW+ktKySWQvq1o7y23g5SZg1J3wygFA7sUmWGjs5NreiZE+kvCSzuMEnPOaG/aXGXAH9YcHO4aQpzo"""
522
+ """WpU0iynPart24q4UnJSSvK7KJlzA7Xotbmmi0AQHUENdFpmnVzEWtZ14aV6PBLKW0uFQFMyiiacd/sBK"""
523
+ """msVmGbCo7YQhMLtQT6NiusSvfxokyacOvqpNTHG3zAjtTa8/fIxS5W1V9EvLbnXxSl2V9afgVdp24j6t"""
524
+ """/WmC6cFKel64HChoEO+7BPbcsGKEl16WaUV4VdKH334oZLHBbgqtGbh7eNs1mJglG9Qo/0okPa9o7/L6"""
525
+ """MKjDHF+LbErNd70LWiIIIfUhiwj0jNI8LmG+IAYdLA3ZpasBITV09KXnwS707EOxKehbiL77H9jOY+Sd"""
526
+ """T/esW+8EFIwYXK0Pki0K6khLCFEAbBzpn3b6BQruMyxajTd+AAAAAElFTkSuQmCC"""
527
+ )
tksheet/find_window.py CHANGED
@@ -59,33 +59,51 @@ class FindWindowTkText(tk.Text):
59
59
  self.rc_popup_menu.add_command(
60
60
  label=sheet_ops.select_all_label,
61
61
  accelerator=sheet_ops.select_all_accelerator,
62
+ image=sheet_ops.select_all_image,
63
+ compound=sheet_ops.select_all_compound,
62
64
  command=self.select_all,
63
65
  **menu_kwargs,
64
66
  )
65
67
  self.rc_popup_menu.add_command(
66
68
  label=sheet_ops.cut_label,
67
69
  accelerator=sheet_ops.cut_accelerator,
70
+ image=sheet_ops.cut_image,
71
+ compound=sheet_ops.cut_compound,
68
72
  command=self.cut,
69
73
  **menu_kwargs,
70
74
  )
71
75
  self.rc_popup_menu.add_command(
72
76
  label=sheet_ops.copy_label,
73
77
  accelerator=sheet_ops.copy_accelerator,
78
+ image=sheet_ops.copy_image,
79
+ compound=sheet_ops.copy_compound,
74
80
  command=self.copy,
75
81
  **menu_kwargs,
76
82
  )
77
83
  self.rc_popup_menu.add_command(
78
84
  label=sheet_ops.paste_label,
79
85
  accelerator=sheet_ops.paste_accelerator,
86
+ image=sheet_ops.paste_image,
87
+ compound=sheet_ops.paste_compound,
80
88
  command=self.paste,
81
89
  **menu_kwargs,
82
90
  )
83
91
  self.rc_popup_menu.add_command(
84
92
  label=sheet_ops.undo_label,
85
93
  accelerator=sheet_ops.undo_accelerator,
94
+ image=sheet_ops.undo_image,
95
+ compound=sheet_ops.undo_compound,
86
96
  command=self.undo,
87
97
  **menu_kwargs,
88
98
  )
99
+ self.rc_popup_menu.add_command(
100
+ label=sheet_ops.redo_label,
101
+ accelerator=sheet_ops.redo_accelerator,
102
+ image=sheet_ops.redo_image,
103
+ compound=sheet_ops.redo_compound,
104
+ command=self.redo,
105
+ **menu_kwargs,
106
+ )
89
107
 
90
108
  def rc(self, event: Any) -> None:
91
109
  """Show the right-click popup menu."""
@@ -108,8 +126,8 @@ class FindWindowTkText(tk.Text):
108
126
 
109
127
  def select_all(self, event: Any = None) -> Literal["break"]:
110
128
  """Select all text in the widget."""
111
- self.tag_add(tk.SEL, "1.0", tk.END)
112
- self.mark_set(tk.INSERT, tk.END)
129
+ self.tag_add(tk.SEL, "1.0", "end-1c")
130
+ self.mark_set(tk.INSERT, "end-1c")
113
131
  return "break"
114
132
 
115
133
  def cut(self, event: Any = None) -> Literal["break"]:
@@ -135,6 +153,11 @@ class FindWindowTkText(tk.Text):
135
153
  self.event_generate("<KeyRelease>")
136
154
  return "break"
137
155
 
156
+ def redo(self, event: Any = None) -> Literal["break"]:
157
+ self.event_generate(f"<{ctrl_key}-Shift-z>")
158
+ self.event_generate("<KeyRelease>")
159
+ return "break"
160
+
138
161
 
139
162
  class Tooltip(tk.Toplevel):
140
163
  def __init__(self, parent: tk.Misc, text: str, bg: str, fg: str) -> None:
tksheet/functions.py CHANGED
@@ -433,7 +433,7 @@ def push_n(num: int, sorted_seq: Sequence[int]) -> int:
433
433
  def get_menu_kwargs(ops: DotDict[str, Any]) -> DotDict[str, Any]:
434
434
  return DotDict(
435
435
  {
436
- "font": ops.table_font,
436
+ "font": ops.popup_menu_font,
437
437
  "foreground": ops.popup_menu_fg,
438
438
  "background": ops.popup_menu_bg,
439
439
  "activebackground": ops.popup_menu_highlight_bg,
@@ -1109,6 +1109,14 @@ def try_binding(
1109
1109
  return True
1110
1110
 
1111
1111
 
1112
+ def menu_item_exists(menu: tk.Menu, label: str) -> bool:
1113
+ try:
1114
+ menu.index(label)
1115
+ return True
1116
+ except Exception:
1117
+ return False
1118
+
1119
+
1112
1120
  def span_dict(
1113
1121
  from_r: int | None = None,
1114
1122
  from_c: int | None = None,