Skip to content

Commit 77ba1eb

Browse files
authored
Merge pull request PySimpleGUI#6538 from PySimpleGUI/Dev-latest
Dev latest
2 parents 41e137e + ddebd7a commit 77ba1eb

File tree

1 file changed

+42
-41
lines changed

1 file changed

+42
-41
lines changed

PySimpleGUI.py

Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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
@@ -470,6 +470,10 @@
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

Comments
 (0)