Trabalhando em um projeto que usa um pequeno teclado e uma tela de tinta eletrônica que será executada em um raspberry pi Zero. Eu tentei alguns pacotes de teclado para python (pynput, pyxhook) e escrevi / testei simples registradores de pressionamento de tecla que funcionam bem no meu desktop (ubuntu)
No entanto eu tento executá-los no pi sem monitorar ambas as bibliotecas morrem
DisplayConnectionError: Can't connect to display ":0": [Errno 111] Connection refused
Eu sei que pelo menos o pyxhook tem a capacidade de capturar o movimento do mouse, de modo que faz sentido o porquê de "precisar" de acesso ao monitor. Mas tudo que eu quero é uma maneira de capturar a entrada do teclado em um processo em execução em segundo plano, mas sem monitor conectado
As bibliotecas também podem retornar a janela atual que tem foco como parte do evento principal, e essa pode ser a outra razão pela qual o monitor está tão vinculado.Eu tentei
$export DISPLAY=":0"
não ajudou.
aqui é um código simples para o pynput, funciona com o monitor, mas não quando ele é executado sem a cabeça (executando-o a partir do SSH)
#!/usr/bin/env python
from pynput import keyboard
def on_press(key):
print('Key {} pressed.'.format(key))
if str(key) == 'Key.esc':
print('Exiting...')
return False
with keyboard.Listener(on_press = on_press) as listener:
listener.join()
Existe alguma maneira de fazer isso funcionar, ou possivelmente uma maneira diferente de abordar isso?
rastreamento de pilha completa do programa acima falhando
Traceback (most recent call last):
File "./keylog.py", line 3, in <module>
from pynput import keyboard
File "/usr/local/lib/python2.7/dist-packages/pynput/__init__.py", line 23, in <module>
from . import keyboard
File "/usr/local/lib/python2.7/dist-packages/pynput/keyboard/__init__.py", line 49, in <module>
from ._xorg import KeyCode, Key, Controller, Listener
File "/usr/local/lib/python2.7/dist-packages/pynput/keyboard/_xorg.py", line 38, in <module>
from pynput._util.xorg import (
File "/usr/local/lib/python2.7/dist-packages/pynput/_util/xorg.py", line 38, in <module>
_check()
File "/usr/local/lib/python2.7/dist-packages/pynput/_util/xorg.py", line 36, in _check
display = Xlib.display.Display()
File "/usr/local/lib/python2.7/dist-packages/Xlib/display.py", line 89, in __init__
self.display = _BaseDisplay(display)
File "/usr/local/lib/python2.7/dist-packages/Xlib/display.py", line 71, in __init__
protocol_display.Display.__init__(self, *args, **keys)
File "/usr/local/lib/python2.7/dist-packages/Xlib/protocol/display.py", line 90, in __init__
self.socket = connect.get_socket(name, protocol, host, displayno)
File "/usr/local/lib/python2.7/dist-packages/Xlib/support/connect.py", line 87, in get_socket
return mod.get_socket(dname, protocol, host, dno)
File "/usr/local/lib/python2.7/dist-packages/Xlib/support/unix_connect.py", line 113, in get_socket
raise error.DisplayConnectionError(dname, str(val))
Xlib.error.DisplayConnectionError: Can't connect to display ":0": [Errno 111] Connection refused