Python中pyautogui鼠标范围判断or运算符失效问题求助
问题:鼠标区域限制的逻辑错误分析
我是Python新手,想用pyautogui把鼠标限制在500≤x≤600、500≤y≤600的100x100矩形区域里。一开始用or运算符的代码没生效,鼠标能在全屏的T形区域移动,好像其中一个坐标的判断被忽略了。我本来是想检测鼠标是否离开指定区域,占位符是留着补逻辑的,但分开判断x和y的代码就能正常工作,搞不懂第一种写法为啥失效。
初始失效代码
pyautogui.moveTo(550,550) while True: mos = pyautogui.position() print(mos[0],mos[1]) if (500 < mos[0] < 600) or (500 < mos[1] < 600) : pass else: print('placeholder') print('f')
可用代码
pyautogui.moveTo(550,550) while True: mos = pyautogui.position() print(mos[0],mos[1]) if (500 < mos[0] < 600): pass else: print('placeholder') print('f') if (500 < mos[1] < 600): pass else: print('placeholder') print('f')
原因分析
你用or的逻辑完全错误。(500 < x < 600) or (500 < y < 600)的含义是只要x在范围内,或者y在范围内,就执行pass。也就是说:
- 哪怕x超出范围但y在范围内,不会触发else逻辑
- 哪怕y超出范围但x在范围内,也不会触发else逻辑
这就导致鼠标可以在x符合要求但y随意移动,或者y符合要求但x随意移动的区域(也就是你说的T形区域)自由活动,根本起不到限制矩形区域的作用。
而分开判断x和y的逻辑是:只要x超出范围就触发逻辑,只要y超出范围也触发逻辑——只有当x和y同时在指定范围内时,才不会执行else里的内容,这才是符合需求的逻辑。
更简洁的正确写法
其实不用分开判断,把or换成and就能实现需求,逻辑更清晰:
pyautogui.moveTo(550,550) while True: mos = pyautogui.position() print(mos[0],mos[1]) # 只有x和y同时在范围内时才pass,否则执行限制逻辑 if (500 < mos[0] < 600) and (500 < mos[1] < 600): pass else: print('placeholder') print('f') # 这里可以补充把鼠标移回区域内的逻辑,比如: # pyautogui.moveTo(max(500, min(mos[0], 600)), max(500, min(mos[1], 600)))
内容的提问来源于stack exchange,提问作者jacob blake
相关产品推荐
相关产品推荐

