我正在为游戏制作一个机器人,我想在按下热键时调用该功能。我已经尝试了一些解决方案,但效果并不好。这是我的代码:
def start():
while True:
if keyboard.is_pressed('alt+s'):
break
...
def main():
while True:
if keyboard.is_pressed('alt+p'):
start()
这种方式很稳定,但会导致卡顿,我很难打字。
def main():
keyboard.add_hotkey('alt+p', start, args=(), suppress=True, trigger_on_release=True)
while True:
# waiting for the user to press hotkey
continue
据我所知,keyboard.add_hotkey 只返回输出,所以我无法在启动函数中停止循环。
有没有更好的解决方案?
虽然这对你来说可能晚了,但如果他们发现这个可能会帮助其他人......
exit = false
def start():
exit = true
def main():
keyboard.add_hotkey('alt+p', start, suppress=True, trigger_on_release=True)
while not exit:
# put something here, you can't have an empty loop
keyboard.remove_hotkey('alt+p')
当调用 main 时,这将添加一个热键,当触发时,将运行函数启动。然后它将进入 while 循环。 (请注意,除非您正在使用子处理,否则这将阻止其他一切继续进行,直到您离开循环)while 循环将运行到
exit = false
。删除热键可能是个好主意,尽管您可能也有理由不这么做。
import keyboard
import time
class Listener:
def __init__(self):
self.__listKey = []
self.__hotkey = {}
self.__validKey = []
def start(self):
while True:
key = keyboard.read_event()
if key.name in self.__validKey and key.event_type == 'down':
if key.name not in self.__listKey:
self.__listKey.append(key.name)
_hotkey = '+'.join(self.__listKey)
if _hotkey in self.__hotkey:
self.__hotkey[_hotkey][0](*self.__hotkey[_hotkey][1])
else:
continue
else:
self.__listKey.clear()
continue
def addHotKey(self, hotkey, callback, *args):
self.__hotkey[hotkey] = callback, args
for _hotkey in hotkey.split('+'):
self.__validKey.append(_hotkey)
def func():
while True:
print('Hello')
time.sleep(0.5)
if keyboard.is_pressed('alt+s'):
break
def main():
lis = Listener()
lis.addHotKey('alt+b', func)
lis.start()
main()