使用pynput.keyboard.listener的Python多线程技术

2 人关注

我正在建造一辆自动驾驶的遥控汽车。汽车由树莓派(客户端)控制,树莓派向我的电脑(服务器)发送图像数据,电脑处理图像帧并响应汽车的操作(全部使用python套接字)。这一切运行得非常好。我现在想在Python中添加一个按键监听器,这样我就可以在所有套接字的交互过程中手动控制汽车了。我想用多线程来做这件事。下面是我认为应该如何工作。

import cv2
from pynput import keyboard
from Server import Server
###Keyboard Listener###
def keyPress(key): #send keypress to client
    server.sendCommand((str(key)))
with keyboard.Listener(on_press=keyPress) as listener: #new listener thread
    listener.join() #activate thread
###Server/ client interaction###
host, port = '10.78.1.195', 8000  # home
server = Server(host, port) #server object
server.connect() #connect
while server.isOpened(): #do while the server is open
    frame = server.getStreamImage() #get an image from the client each frame
    server.sendCommand("0") #send a command to the server (arbituary for now, but will be a neural network ouotput
    cv2.imshow("t", frame)  # show image
    # cv2.imshow("tttttt", nnInput)  # show image CONFIGURE PERSPECTIVE TRANSFORM AFTER CAMERA MOUNT
    if cv2.waitKey(1) == ord('q'): #quit if q pressed
        server.sendCommand('q')  # tell client to close
        server.close()  # break if 'q' pressed
cv2.destroyAllWindows() #close opencv windows

如果你想要任何客户端或服务器的代码,我很乐意展示它。我没有加入它,因为它工作得很好。

所以,在我看来,while循环和键盘监听器应该平行运行,我不知道为什么它们没有。在这种配置下,按键被跟踪,但服务器/客户端的互动从未开始。我试着重新编排代码,但我似乎无法让这些操作平行发生。

如果有一个更简单或资源密集度更低的方法,我愿意接受新的想法。这只是对我来说最有意义的做法。我真的只是想让代码尽可能的干净。

我的python版本是3.7。我运行的是Ubuntu 19.10,pynput是1.4.5版本。

如果我可以提供任何其他信息,请提出。非常感谢您!

python-3.x
linux
multithreading
opencv
pynput
marc.soda
marc.soda
发布于 2019-12-06
1 个回答
h_r_b_y
h_r_b_y
发布于 2019-12-29
已采纳
0 人赞同

不要使用 with 语句来初始化你的监听器,而是尝试一下。

listener = keyboard.Listener(on_press=keyPress)