无法使Python宏工作,只是无限循环

问题描述 投票:0回答:2

我的目标是制作一个脚本,当您键入“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 内的终端。

python listener pyautogui
2个回答
1
投票

我的猜测,您遇到的问题似乎是由于脚本输入自身造成的,导致无限循环。当您的脚本键入命令时,它还会捕获这些按键,从而导致重复执行。要解决此问题,您需要在脚本发送自动按键时暂时禁用侦听器。

您可以修改脚本以在执行自动打字期间禁用侦听器。这是脚本的更新版本,进行了必要的更改:

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()

0
投票

问题是你的监听器正在监听它自己,至于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
© www.soinside.com 2019 - 2024. All rights reserved.