我当前正在使用多处理程序,因此我可以在运行其他代码时获得用户输入。此版本的代码对我来说在ubuntu 19.04上运行,但是对我的朋友而言,它在Windows上不起作用。
import getch
import time
from multiprocessing import Process, Queue
prev_user_input = ' '
user_input = ' '
# Getting input from the user
queue = Queue(1)
def get_input():
char = ' '
while char != 'x':
char = getch.getch()
queue.put(char)
# Starting the process that gets user input
proc = Process(target=get_input)
proc.start()
while True:
# Getting the users last input
while not queue.empty():
user_input = queue.get()
# Only print user_input if it changes
if prev_user_input != user_input:
print(user_input)
prev_user_input = user_input
time.sleep(1/10)
如何使此代码在Windows上工作?
用户输入也落后一个输入。如果用户按下按钮,则仅在按下另一个按钮后才打印。有关如何解决此问题的解决方案也将有所帮助。
编辑1: 他正在使用Python 3.7.4,而我正在使用3.7.3。
我按照建议尝试了此代码
import msvcrt
import time
from multiprocessing import Process, Queue
prev_user_input = ' '
user_input = ' '
# Getting input from the user
queue = Queue(1)
def get_input():
char = ' '
while char != 'x':
char = msvcrt.getch()
queue.put(char)
# Starting the process that gets user input
if __name__ == '__main__':
proc = Process(target=get_input)
proc.start()
while True:
# Getting the users last input
while not queue.empty():
user_input = queue.get()
# Only print user_input if it changes
if prev_user_input != user_input:
print(user_input)
prev_user_input = user_input
time.sleep(1/10)
但是没有打印字符。
编辑2:
我在Windows上使用msvcrt
模块,在ubuntu上使用getch
模块。抱歉,您在帖子的前面没有对此进行澄清。
答案 0 :(得分:0)
以下内容适用于Windows。它包含了我在您的问题下的评论中建议的所有更改,包括关于单独的内存空间的最后一个更改。
使用ubuntu的getch()
版本,类似的东西也应该工作,尽管我尚未对其进行测试。 on主过程创建Queue
并将其作为参数传递给get_input()
目标函数,因此它们都使用同一对象交换数据。
我还decode()
msvcrt.getch()
返回的bytes对象,将其转换为(1个字符)Unicode UTF-8字符串。
import msvcrt
import time
from multiprocessing import Process, Queue
prev_user_input = ' '
user_input = ' '
def get_input(queue):
char = ' '
while char != b'x':
char = msvcrt.getch()
queue.put(char.decode()) # Convert to utf-8 string.
if __name__ == '__main__':
# Getting input from the user.
queue = Queue(1)
# Starting the process that gets user input.
proc = Process(target=get_input, args=(queue,))
proc.start()
while True:
# Getting the users last input
while not queue.empty():
user_input = queue.get()
# Only print user_input if it changes
if prev_user_input != user_input:
print(user_input)
prev_user_input = user_input
time.sleep(1/10)
要隐藏操作系统差异并提高代码的可移植性,您可以执行如下所示的import
处理,这也使您可以像在代码中所做的那样定义get_input()
函数在您的问题中:
import os
import time
from multiprocessing import Process, Queue
try:
import msvcrt
getch = msvcrt.getwch # Wide char variant of getch() that returns Unicode.
except ModuleNotFoundError: # Not Windows OS - no msvcrt.
from getch import getch
prev_user_input = ' '
user_input = ' '
def get_input(queue):
char = ' '
while char != 'x':
char = getch()
queue.put(char)
if __name__ == '__main__':
# For getting input from the user.
queue = Queue(1)
# Starting the process that gets user input.
.
.
.