更改while循环外while循环的条件变量的状态

2024-04-27 03:50:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试启动和停止一个while循环按一个键(开始)和停止通过释放键。在

所以像这样:

from pynput import keyboard
global condition
condition = False

def on_press(key):
    global condition
    if key == keyboard.Key.cmd_r:
        print('pressed cmd_r'.format(key))
        condition = True
    else:
        print('incorrect character {0}, press cmd_r'.format(key))


def on_release(key):
    global condition
    print('{0} released'.format(key))
    if key == keyboard.Key.cmd_r:
        condition = False
        #keyboard.Listener.stop
        #return False


with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

while condition==True:
    print "Condition true"

我不知道为什么这样不行?。。 应该在我脑子里?在


Tags: keycmdfalseformatreleaseifondef
2条回答

问题是当您调用listener.join()时,您的代码会在此时等待线程完成。但它永远不会完成,因为它总是在倾听!相反,您需要调用listener.start(),以便线程在后台运行,您可以自由地执行您想做的事情。在

在线程之间共享变量是不被普遍接受的,因此我在这里创建了一个经过修改的侦听器类,它在按下键时将变量key_pressed与其自身相关联,而在释放变量{}。然后,您可以通过调用listener.key_pressed在单独的循环中随时检查该变量,从而对该变量执行任何操作

from pynput import keyboard
import time


class MyListener(keyboard.Listener):
    def __init__(self):
        super(MyListener, self).__init__(self.on_press, self.on_release)
        self.key_pressed = None

    def on_press(self, key):
        self.key_pressed = key

    def on_release(self, key):
        self.key_pressed = None


listener = MyListener()
listener.start()

while True:
    time.sleep(0.1)
    print listener.key_pressed

请注意,如果没有像上面那样使用time.sleep包含延迟,则会使缓冲区过载并导致输出延迟。如果你想快点的话,就稍微延迟一下,但不是零。在

您可能需要一些类似主循环的东西,其中可以包含特殊的while循环来实现这一点。在

更新1-如何?(错误)

while True:
    # main loop
    while condition:
        # your special loop
        # do something...
    time.sleep(0.1) # sleep 0.1 seconds

“主循环”是一个无限循环,每0.1秒执行一次包含的指令。因此,您可以继续检查condition。如果condition == True你的“特殊循环”将要执行并且在condition == False时停止,那么“主循环”将继续执行。在

更新2-实施(正确)

好的,我已经运行了代码,我发现“主循环”解决方案不在这里。目前,我有一个基于多线程的快速、经过测试的解决方案:

^{pr2}$

相关问题 更多 >