我的目标是制作一个脚本,当您键入“medo1”时,它会自动键入 for 循环内出现的文本。但显然,last5 根本无法更改,并且该函数是通过自己输入内容来运行的。有什么帮助吗?
from pynput.keyboard import Key,Listener;import pyautogui as pa,time as t
musics=['medo1=link1','medo2=link2','medo3=link3','medo4=link4','medo5=link5']
last5=['a','a','a','a','a']
def on_press(key):
if key==Key.esc:return
global last5
d='aaaaa'
try:last5.append(key.char);last5.pop(0);d=''.join(last5)
except:pass
for m in musics:
if d in m:
pa.press('backspace',presses=99);pa.typewrite('b.p '+m.split('=')[1]);t.sleep(0.03);pa.press("enter")
pa.typewrite('b.loop all');t.sleep(0.1);pa.press("enter");last5=['a','a','a','a','a'];break
# Collect events until released
with Listener(on_press=on_press) as listener:listener.join()
我试图通过输入“medo1”来使其工作,它做到了,但它进入了无限循环,我必须删除 Visual Studio 内的终端。
我的猜测,您遇到的问题似乎是由于脚本输入自身造成的,导致无限循环。当您的脚本键入命令时,它还会捕获这些按键,从而导致重复执行。要解决此问题,您需要在脚本发送自动按键时暂时禁用侦听器。
您可以修改脚本以在执行自动打字期间禁用侦听器。这是脚本的更新版本,进行了必要的更改:
from pynput.keyboard import Key, Listener, Controller
import pyautogui as pa
import time as t
musics = ['medo1=link1', 'medo2=link2', 'medo3=link3', 'medo4=link4', 'medo5=link5']
last5 = ['a', 'a', 'a', 'a', 'a']
def on_press(key, listener):
if key == Key.esc:
return False # Stop listener
global last5
d = 'aaaaa'
try:
last5.append(key.char)
last5.pop(0)
d = ''.join(last5)
except AttributeError:
pass
for m in musics:
if d in m:
listener.stop() # Stop listening to avoid infinite loop
execute_commands(m)
last5 = ['a', 'a', 'a', 'a', 'a']
listener.start() # Restart listener
break
def execute_commands(music_command):
pa.press('backspace', presses=99)
pa.typewrite('b.p ' + music_command.split('=')[1])
t.sleep(0.03)
pa.press("enter")
pa.typewrite('b.loop all')
t.sleep(0.1)
pa.press("enter")
# Set up the listener
def start_listener():
with Listener(on_press=lambda key: on_press(key, listener)) as listener:
listener.join()
start_listener()
问题是你的监听器正在监听它自己,至于CHF的Answer的问题,恰好是我们不能只是停止和启动监听器。在下面的代码中,我们在停止当前侦听器后完全启动另一个侦听器。
from pynput.keyboard import Key,Listener;import pyautogui as pa,time as t
musics=['medo1=link1','medo2=link2','medo3=link3','medo4=link4','medo5=link5']
last5=['a','a','a','a','a']
loopedOnce=False
def execute_commands(music_command):
pa.press('backspace', presses=99)
pa.typewrite('b.p ' + music_command.split('=')[1])
t.sleep(0.03)
pa.press("enter")
pa.typewrite('b.loop all')
t.sleep(0.1)
pa.press("enter")
def on_press(key,listener):
if key==Key.esc:return
global last5,loopedOnce
d='aaaaa'
try:last5.append(key.char);last5.pop(0);d=''.join(last5)
except:pass
for m in musics:
if d in m:
listener.stop()
execute_commands(m)
last5=['a','a','a','a','a']
loopedOnce=True
break
# Collect events until released
while not(loopedOnce):
with Listener(on_press=lambda key: on_press(key, listener)) as listener: listener.join()
loopedOnce=False