使用Pynput.mouse时无法中断While循环

时间:2019-02-19 17:10:56

标签: python while-loop break pynput

我有一个相对简单的程序,它监听鼠标的点击,并在按住鼠标按钮时打印“ 1”。不幸的是,即使有一条if语句检查鼠标是否被单击,如果放开鼠标,它也会一直打印“ 1”,如果没有,则应该停止循环。我正在使用pynput.mouse模块进行鼠标交互。

这是我的代码:

import time
from pynput.mouse import Listener

def clicked(x, y, button, pressed):
    if pressed == True:
        while button == button.left:
            print("1")
            time.sleep(1)
            if pressed == False:
                break




with Listener(on_click=clicked) as listener:
    listener.join()

我的理论是,一旦循环开始,它将停止监听鼠标的单击,因此它永远无法停止循环。是否有必要为循环创建一个新线程?如果可以,我该怎么办?

谢谢!

2 个答案:

答案 0 :(得分:2)

由于pressed在循环内不会发生变化,因此您当前的逻辑使您无法脱离循环。有一个 not 语句,用于检查是否单击了鼠标:仅有的if语句用于检查您在进入函数时是否单击了鼠标。 pressed在函数中没有改变。

查看关键逻辑:

if pressed == True:
    while ...
        ...
        if pressed == False:
            break

这里没有什么可以更改pressed的值;第一个if保证它在循环中的任何位置True

是的,您需要设置在循环中运行的另一个侦听器。您已经知道了构建块:在函数中创建一个新块并将其绑定到另一个破坏循环的操作。例如,您可能“作弊”并将其pressed重设为全局变量。

如果需要整体处理程序解决方案,还可以在其他答案中研究如何执行此操作。按键和按键释放已经足够经常了。

答案 1 :(得分:0)

import pyautogui, random, time
import pynput 

keys = ['w', 's', 'a', 'd']


def on_press(key):
    p = True
    if key == pynput.keyboard.Key.esc:
        return False

    else:
        while p == True:
            press = keys[random.randint(0,3)]
            pyautogui.keyDown(press)
            pyautogui.keyUp(press)
            p = False            

        
with pynput.keyboard.Listener(on_press=on_press) as  L:
    L.join()

这样的代码将代替您所做的工作。 顺便说一句,这只是一个例子。随时访问我的GitHub页面:github.com/ironnicko