python中的非阻塞raw_input()

2024-09-22 16:39:56 发布

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

经过一段时间的钻研,我仍然没有找到一个很好的答案,我希望这是一个相当普遍的需要。基本上,我需要一个主线程来执行“stuff”,直到它接收到输入,然后对该输入执行操作,然后返回到原始的“stuff”。每次我的问题似乎是我的程序执行似乎完全停止在原始输入,无论我在线程或其他地方调用它。警告一下,我对python还不是很在行,但我希望这不会太难实现。这是我在玩的东西(从我的另一个问题中,我的线程问题得到了轻松的回答)

所以我试图写一个程序,寻找键盘按下,然后根据用户输入的内容在主程序中做一些事情。我试着在一个线程中运行键盘监听,然后比较主循环中变量中的内容,但是我似乎从来没有得到线程键盘输入。在下面的代码中,print may update行永远不会发生,只是main while循环中的else块。我需要做什么才能让主循环知道用户按下的键?

import threading
import time

kbdInput = ''
playingID = ''

def kbdListener():
    global kbdInput
    kbdInput = rawInput()
    print "maybe updating...the kbdInput variable is: ",kbdInput

listener = threading.Thread(target=kbdListener)

while True:
    print "kbdInput: ",kbdInput
    print "playingID: ",playingID
    if playingID != kbdInput:
        print "Recieved new keyboard Input. Setting playing ID to keyboard input value"
        playingID = kbdInput
    else:
        print "No input from keyboard detected. Sleeping 2 seconds"
    time.sleep(2)

Tags: 用户import内容time键盘线程elseprint
3条回答

除了MydKnight的答案(启动线程)之外,您还需要将rawInput更改为raw_input,并且它需要处于某种while循环中,否则您只会得到一个raw_input()日志。

如果您真的想让while循环永远运行下去,那么您需要创建一个新线程并在每次旧线程完成时启动它。

我更新了问题中的示例以使其生效:

import threading
import time

kbdInput = ''
playingID = ''
finished = True

def kbdListener():
    global kbdInput, finished
    kbdInput = raw_input("> ")
    print "maybe updating...the kbdInput variable is: {}".format(kbdInput)
    finished = True

while True:
    print "kbdInput: {}".format(kbdInput)
    print "playingID: {}".format(playingID)
    if playingID != kbdInput:
        print "Received new keyboard Input. Setting playing ID to keyboard input value"
        playingID = kbdInput
    else:
        print "No input from keyboard detected. Sleeping 2 seconds"
    if finished:
        finished = False
        listener = threading.Thread(target=kbdListener)
        listener.start()
    time.sleep(2)

您创建了一个线程,但忘记启动它:

listener = threading.Thread(target=kbdListener)
listener.start()

相关问题 更多 >