小编典典

python中的非阻塞raw_input()

python

在SO中研究了一段时间之后,我仍然没有找到一个很好的答案来满足我希望的相当普遍的需求。基本上,我需要一个主线程来执行“填充”,直到它接收到输入,然后对该输入进行操作,然后返回到原始的“填充”。每次我的问题似乎都是我的程序执行似乎完全在原始输入处停止,无论是在线程中还是在其他任何地方调用它。警告我对python还是个新手,但我希望它不要太讨厌实现。这是我在玩的游戏(从我的其他问题中轻松回答了我的穿线问题)

因此,我正在尝试编写一个程序,该程序查找键盘按键,然后根据用户输入的内容在主程序中执行某些操作。我试图在一个线程中监听键盘,然后在主循环中比较变量中的内容,但是我似乎从未得到过线程键盘输入。在下面的代码中,可能永远不会发生打印更新行,而只是主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)

阅读 221

收藏
2020-12-20

共1个答案

小编典典

如果您确实想让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)
2020-12-20