11#!/usr/bin/python3
22
3- version = __version__ = "4.61.0.199 Unreleased"
3+ version = __version__ = "4.61.0.201 Unreleased"
44
55_change_log = """
66 Changelog since 4.60.0 released to PyPI on 8-May-2022
470470 Added no_buffering option to popup_animated
471471 4.61.0.199
472472 Updated Udemy coupon code
473+ 4.61.0.200
474+ Fix for grab anywhere window movement and control+left_mouse_drag. Window move smoother, including the Move-All-Windows feature. Thank you JASON for the help!
475+ 4.61.0.201
476+ Added init for _mouse_offset_x and y in case tkinter doesn't call the mouse down callback
473477
474478 """
475479
@@ -10616,6 +10620,7 @@ def __init__(self, title, layout=None, default_element_size=None,
1061610620 if self.use_custom_titlebar:
1061710621 self.Margins = (0, 0)
1061810622 self.NoTitleBar = True
10623+ self._mouse_offset_x = self._mouse_offset_y = 0
1061910624
1062010625 if watermark is True:
1062110626 Window._watermark_temp_forced = True
@@ -11745,8 +11750,8 @@ def _StartMoveUsingControlKey(self, event):
1174511750 :param event: event information passed in by tkinter. Contains x,y position of mouse
1174611751 :type event: (event)
1174711752 """
11748-
11749- self._StartMove(event)
11753+ self._start_move_save_offset(event)
11754+ return
1175011755
1175111756
1175211757 def _StartMoveGrabAnywhere(self, event):
@@ -11760,31 +11765,11 @@ def _StartMoveGrabAnywhere(self, event):
1176011765 if (isinstance(event.widget, GRAB_ANYWHERE_IGNORE_THESE_WIDGETS) or event.widget in self._grab_anywhere_ignore_these_list) and event.widget not in self._grab_anywhere_include_these_list:
1176111766 # print('Found widget to ignore in grab anywhere...')
1176211767 return
11763-
11764- self._StartMove(event)
11765-
11768+ self._start_move_save_offset(event)
1176611769
1176711770 def _StartMove(self, event):
11768- try:
11769- geometry = self.TKroot.geometry()
11770- location = geometry[geometry.find('+')+1:].split('+')
11771- self._startx = int(location[0])
11772- self._starty = int(location[1])
11773- self._mousex = event.x + event.widget.winfo_rootx()
11774- self._mousey = event.y + event.widget.winfo_rooty()
11775- # print(self._startx, self._starty)
11776- # print(self._mousex, self._mousey)
11777- # print(self.TKroot.geometry())
11778- except:
11779- pass
11780- # print('Start move {},{} widget {}'.format(event.x,event.y, event.widget))
11781-
11782- if Window._move_all_windows:
11783- for window in Window._active_windows:
11784- window._offsetx = event.x + event.widget.winfo_rootx() - window.TKroot.winfo_rootx()
11785- window._offsety = event.y + event.widget.winfo_rooty() - window.TKroot.winfo_rooty()
11786-
11787-
11771+ self._start_move_save_offset(event)
11772+ return
1178811773
1178911774 def _StopMove(self, event):
1179011775 """
@@ -11795,6 +11780,28 @@ def _StopMove(self, event):
1179511780 """
1179611781 return
1179711782
11783+ def _start_move_save_offset(self, event):
11784+ self._mousex = event.x + event.widget.winfo_rootx()
11785+ self._mousey = event.y + event.widget.winfo_rooty()
11786+ geometry = self.TKroot.geometry()
11787+ location = geometry[geometry.find('+') + 1:].split('+')
11788+ self._startx = int(location[0])
11789+ self._starty = int(location[1])
11790+ self._mouse_offset_x = self._mousex - self._startx
11791+ self._mouse_offset_y = self._mousey - self._starty
11792+ # ------ Move All Windows code ------
11793+ if Window._move_all_windows:
11794+ # print('Moving all')
11795+ for win in Window._active_windows:
11796+ if win == self:
11797+ continue
11798+ geometry = win.TKroot.geometry()
11799+ location = geometry[geometry.find('+') + 1:].split('+')
11800+ _startx = int(location[0])
11801+ _starty = int(location[1])
11802+ win._mouse_offset_x = event.x_root - _startx
11803+ win._mouse_offset_y = event.y_root - _starty
11804+
1179811805
1179911806 def _OnMotionUsingControlKey(self, event):
1180011807 self._OnMotion(event)
@@ -11815,22 +11822,16 @@ def _OnMotionGrabAnywhere(self, event):
1181511822
1181611823
1181711824 def _OnMotion(self, event):
11818- try:
1181911825
11820- _mousex = event.x + event.widget.winfo_rootx()
11821- _mousey = event.y + event.widget.winfo_rooty()
11822- deltax = _mousex - self._mousex
11823- deltay = _mousey - self._mousey
11824- x = self._startx + deltax
11825- y = self._starty + deltay
11826- self.TKroot.geometry("+%s+%s" % (x, y)) # this is what really moves the window
11826+ self.TKroot.geometry(f"+{event.x_root-self._mouse_offset_x}+{event.y_root-self._mouse_offset_y}")
11827+ # print(f"+{event.x_root}+{event.y_root}")
11828+ # ------ Move All Windows code ------
11829+ try:
1182711830 if Window._move_all_windows:
11828- for window in Window._active_windows:
11829- deltax = window._offsetx
11830- deltay = window._offsety
11831- x = window.TKroot.winfo_pointerx() - deltax
11832- y = window.TKroot.winfo_pointery() - deltay
11833- window.TKroot.geometry("+%s+%s" % (x, y)) # this is what really moves the window
11831+ for win in Window._active_windows:
11832+ if win == self:
11833+ continue
11834+ win.TKroot.geometry(f"+{event.x_root-win._mouse_offset_x}+{event.y_root-win._mouse_offset_y}")
1183411835 except Exception as e:
1183511836 print('on motion error', e)
1183611837
@@ -26987,4 +26988,4 @@ def _optional_window_data(window):
2698726988 exit(0)
2698826989 main()
2698926990 exit(0)
26990- #8191dd5d8352d3c13f89bde32cdd01d664da2f4cabeff579ec281e413131545b6aafe489020f8f73c96477dbdf9e86e0013c01759cae8c5837d9d7ea44c7fc75f9af3fb5bce6270b0254f6f6f2d966abc5257991792b3d83880d7690a85e8f4b59e4051b0ff2f7ac1a5fa27d5630c2365d70398b22cda91c1a988c4f19379c4575afb6f6c86e873e0bcda2ed4fc65879a8c4c7a297437742b1ac070de6d04019ffc5e350d6030ce97965d0414ef48ea670ba21bb359319f1c8be7e6da2ff46c727ea82f54eb30d3a74728b5aa20e1412b6812750cfb8cb6122b3e720f0a2c0106d7ddb0eba9313ed763aa3f404221e0d4ffe9bb324a56ebb410e5cd6f45f6b985db5c39369d1fe201fc2ee7c9e8017e8eb7a9e08edafa15ad8a89f6214b75b8e183e2dde4c67350975999d7f74572f0f17d422a9ca430c928f80e2ffee4dd376ce916999b7a263b39783ddf54242b1341e70240c6875832525d87100c9a733d09969465e38226d80ead49508692eb9851eaa4fba26ca5069cb2c6ee88647c79683860d9b12fa598a1d452015d80295a1b59236c38f8fb42edf1aa897db653f8c20ce79836641cc64c1e5975b8400edc98854ab5c26de57241ce8b89979173b84f9cf3e5dd455a63721545001b06af63a8b11ed7889a4e53af7a1527bbd3e14ae6e6a16eb569c79d7213d52e7f276f1a59423fb3a519adc122b73128196aec80a
26991+ #5550034f4202b0dde48a8ff1a870d871f1759f6e59b3a92f40150e8c42204e1b06eaafbe206994c7f0ff811df9f61018269480e40a91fe781b16dac2c81dfe0c0977090f8557e435b97d4d8e7c5ec1c91f2be19033b9dc2f5a8f16e0b5d1cab1e692d998dbb4f5fc26b551befa483142430c1cadee39363aba10ed19675867ed15ef534fd40fcdf38c811e3431751de160dd6eb567091160b936a580305902387dca997ce20b90f80984644e8289882eabf1809b3f54f98a80ea80f2c5a644ebeac34413cf68b4c8cf2c7d69072abee5fddd075e7daae6f7644e4eba3deaa228cc4d4dbcb59cdc62c73c2c830f630653cc10646d314eeba1736f43a8a603c57221eb9977f2ad6a05692f87f161238e8514b317d20fcaec1e84faead09e0e8c9ecac402c38a021b490086fd3d07d3f2777627f21946f0ff1b4b0e66d28e1b0484a21b9d61f4929bfd9ca58c48ec1e7bd764cbfe21cc827ae7239d544ee324a0f4a1d9d4aa75d5e76a0fed5f8540ba275fdc3684d2d7b722028cabee2d3d7aa469ab4c9cf5c3c66cb7dbcc749b57991988e726c5191ac02224d345d87ba6eb5b209f5f755fa1318f10034de6c828aead47f333f80de385ae13e0a0be2a8c76cfa9162c24c6ff9dc55c0031af42464adaf2ccb95bebbd17f24cfd2938140c3538109491bea1f409c7358dde3a2466f4788a68cd3c3bb45cbd33589475a149617549
0 commit comments