问题描述
我正在尝试使用pyautogui进行故障保护。有时必须将鼠标光标移到角落是非常困难的。以下是此键绑定处于活动状态时我的代码应该执行的示例。它可以工作,但是我想看看是否有更好的方式编写此代码,而不必每次都重复每个条件。我希望能够在循环期间的任何时间执行故障保护,而不必等到每次迭代的开始。
这是我希望我的代码执行的操作:
import pyautogui
import sys
from win32.lib.win32con import VK_CAPITAL
from win32.win32api import GetKeyState
def check():
if GetKeyState(VK_CAPITAL) == 1:
sys.exit()
for i in range(10):
check()
pyautogui.move(100,200,duration=1)
check()
pyautogui.move(200,300,duration=1)
check()
这是现在的样子:
import pyautogui
import sys
from win32.lib.win32con import VK_CAPITAL
from win32.win32api import GetKeyState
def check():
if GetKeyState(VK_CAPITAL) == 1:
sys.exit()
for i in range(10):
check()
pyautogui.move(100,duration=1)
pyautogui.move(200,duration=1)
解决方法
建立可调用操作的列表,并在检查条件时迭代该列表。以下将调用功能列表,直到大写锁定键处于活动状态:
import sys
import time
from win32.lib.win32con import VK_CAPITAL
from win32.win32api import GetKeyState
def check():
if GetKeyState(VK_CAPITAL) == 1:
print('exiting...')
sys.exit()
def move(x,y,duration):
print(f'move to {x},{y}')
time.sleep(duration)
funcs = (lambda: move(100,200,duration=1),lambda: move(200,300,duration=1))
while True:
for func in funcs:
check()
func()
,
一种不同的方法,
def func1():
print('func1')
def func2():
print('func1')
def func3():
print('func1')
funcs_map['cond1'] = func1
funcs_map['cond2'] = func2
funcs_map['cond3'] = func3
def get_condition(i:int) -> str:
if(i == 1):
return 'cond1'
elif(i == 2):
return 'cond2'
else:
raise ValueError(f'Unknown i value: {i} to get a condition')
for i in range(x):
func_ptr = funcs_map[get_condition(i)]
func_ptr()