Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pynput.mouse时无法中断While循环_Python_While Loop_Break_Pynput - Fatal编程技术网

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

Python 使用Pynput.mouse时无法中断While循环,python,while-loop,break,pynput,Python,While Loop,Break,Pynput,我有一个相对简单的程序,可以监听鼠标点击,当按下鼠标按钮时,会打印“1”。不幸的是,当我放开鼠标时,它只会一直打印“1”,即使有一个if语句检查鼠标是否被点击,如果没有点击,应该停止循环。我正在使用pynput.mouse模块进行鼠标交互 这是我的密码: import time from pynput.mouse import Listener def clicked(x, y, button, pressed): if pressed == True: while b

我有一个相对简单的程序,可以监听鼠标点击,当按下鼠标按钮时,会打印“1”。不幸的是,当我放开鼠标时,它只会一直打印“1”,即使有一个if语句检查鼠标是否被点击,如果没有点击,应该停止循环。我正在使用
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()
我的理论是,一旦循环开始,它就会停止聆听鼠标的点击,因此它永远无法停止循环。是否需要为循环创建一个新线程?如果是,我会怎么做


谢谢

您当前的逻辑使其无法退出循环,因为按下的
在循环中不会改变。没有检查鼠标是否被单击的语句:只有
if
语句检查在您输入函数时鼠标是否被单击<代码>按下
在功能内不会改变

看看关键逻辑:

if pressed == True:
    while ...
        ...
        if pressed == False:
            break
此处没有可更改按下的
值的内容
;第一个
if
保证它在循环中的任何地方都是
True

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


如果您想要一个完整的处理程序解决方案,您还可以在其他答案中研究如何做到这一点。按键和按键释放已经做得够频繁了。

您当前的逻辑不可能跳出循环,因为按下的
在循环中不会改变。没有检查鼠标是否被单击的语句:只有
if
语句检查在您输入函数时鼠标是否被单击<代码>按下
在功能内不会改变

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()
看看关键逻辑:

if pressed == True:
    while ...
        ...
        if pressed == False:
            break
此处没有可更改按下的
值的内容
;第一个
if
保证它在循环中的任何地方都是
True

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

如果您想要一个完整的处理程序解决方案,您还可以在其他答案中研究如何做到这一点。按键和按键释放已经足够频繁了

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

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

如果按下
键==True,则只会进入while循环,没有任何东西会改变按下的
的值-因此,如果你已经证明这是不可能的,那么如果按下的
值==False
怎么可能计算为
True
?如果按下的
值==True
,你只会进入while循环,没有任何东西会改变按下的
的值
-那么如果你已经证明这是不可能的,
如果按下==False
怎么可能计算为
True
?我理解我的代码的问题,但作为一个初学者,我很难理解我应该如何解决它。“另一个侦听器”是指检查“pressed”中的更改的新函数还是类似于检查它的“threading.Timer”之类的东西?作为一个全局变量,按下reset
是什么意思?我无法将其设置为全局,因为它已经是单击的
中的一个参数。我很抱歉给你带来困惑,我只是想把事情弄清楚,这样下次遇到这样的问题时就不用再问了。一些示例代码可能会有所帮助。您需要的大部分是教程帮助,超出了堆栈溢出的范围。简单地说,我的建议是:(1)查看其他人如何处理外部事件的启动和释放。(2) 如果您想继续使用当前设置,请嵌入一个新的
侦听器
,并在单击的
中运行。然后按下
可以成为该嵌入函数的全局变量。谢谢,最后一部分为我澄清了问题。祝你过得愉快!我已经理解了我的代码的问题,但是作为一个初学者,我很难理解我应该做什么来修复它。“另一个侦听器”是指检查“pressed”中的更改的新函数还是类似于检查它的“threading.Timer”之类的东西?作为一个全局变量,按下reset
是什么意思?我无法将其设置为全局,因为它已经是单击的
中的一个参数。我很抱歉给你带来困惑,我只是想把事情弄清楚,这样下次遇到这样的问题时就不用再问了。一些示例代码可能会有所帮助。您需要的大部分是教程帮助,超出了堆栈溢出的范围。简单地说,我的建议是:(1)查看其他人如何处理外部事件的启动和释放。(2) 如果您想继续使用当前设置,请嵌入一个新的
侦听器
,并在单击的
中运行。然后按下
可以成为该嵌入函数的全局变量。谢谢,最后一部分为我澄清了问题。祝你过得愉快!