Source code for pitop.keyboard.keyboard_button
from os import environ
from pitop.common.current_session_info import get_first_display
[docs]
class KeyboardButton:
def __init__(self, key):
"""This class is designed to simulate a button press similar to the
button in the gpiozero, but with a key press from your keyboard."""
self.key = key
self.pressed_method = None
self.released_method = None
self.__key_pressed = False
if not environ.get("DISPLAY"):
environ["DISPLAY"] = str(get_first_display())
from .vendor.pynput.keyboard import Listener
self.listener = Listener(on_press=self.__on_press, on_release=self.__on_release)
self.listener.start()
def __on_press(self, key):
received_key = None
try:
received_key = key.char
except AttributeError:
received_key = key
received_key = str(received_key)
if "Key." in received_key:
received_key = received_key.replace("Key.", "")
if received_key == self.key:
self.__key_pressed = True
if self.pressed_method is not None:
self.pressed_method()
def __on_release(self, key):
self.__key_pressed = False
received_key = None
try:
received_key = key.char
except AttributeError:
received_key = key
received_key = str(received_key)
if "Key." in received_key:
received_key = received_key.replace("Key.", "")
if received_key == self.key:
if self.released_method is not None:
self.released_method()
@property
def when_pressed(self):
"""Get or set the 'when pressed' button state callback function. When
set, this callback function will be invoked when this event happens.
:type callback: Function
:param callback: Callback function to run when a button is
pressed.
"""
@when_pressed.setter
def when_pressed(self, method=None):
if method is None:
raise Exception("Error: no method assigned")
self.pressed_method = method
@property
def when_released(self):
"""Get or set the 'when released' button state callback function. When
set, this callback function will be invoked when this event happens.
:type callback: Function
:param callback: Callback function to run when a button is
released.
"""
@when_released.setter
def when_released(self, method=None):
if method is None:
raise Exception("Error: no method assigned")
self.released_method = method
@property
def is_pressed(self) -> bool:
"""Get or set the button state as a boolean value.
:rtype: bool
"""
if self.__key_pressed is True:
return True
else:
return False