| 知乎专栏 |
pip install keyboard
读取键盘值
root@debian:~# cat test.py
import keyboard
while True:
k = keyboard.read_key()
print(k)
按键按下时触发
root@debian:~# cat test.py
import keyboard
def callback(x):
print(x)
print()
keyboard.on_press(callback)
keyboard.wait()
按键释放触发
root@debian:~# cat test.py
import keyboard
def callback(x):
print(x)
print()
keyboard.on_release(callback)
keyboard.wait()
>>> keyboard.get_hotkey_name(['+', 'left ctrl', 'shift']) 'ctrl+shift+plus' >>> keyboard.get_hotkey_name(['+', 'left ctrl', 'f13']) 'ctrl+f13+plus'
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##############################################
# Home : https://www.netkiller.cn
# Author: Neo <netkiller@msn.com>
# Upgrade: 2023-07-28
##############################################
try:
import random, os, sys
import logging, logging.handlers
import keyboard
from paho.mqtt import publish, client
from datetime import datetime
from optparse import OptionParser
# from queue import Queue
module = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "/common"
sys.path.insert(0, ".")
sys.path.insert(0, module)
from config import ConfigFile
except ImportError as err:
print("ImportError: %s" % (err))
exit()
class Door(ConfigFile):
sensor = {}
# sensor["up"] = "欢迎乘坐华山缆车"
# sensor["down"] = "缆车加速运行,请坐稳扶好"
sensor["up"] = "亲爱的游客朋友们,感谢您选择乘坐华山北峰缆车,与我们一同领略华山的壮丽景色!在您的旅程结束之际,我们衷心祝愿您带着美好的回忆离开。华山北峰的壮丽山川和丰富的历史文化将永远留在您心中。再次感谢您的光临,祝您一路顺风,期待与您再次相会!"
sensor["down"] = "尊敬的游客,欢迎您踏上华山北峰缆车之旅!这是一段令人心驰神往的征程,将带您登上壮丽的北峰,领略壮丽的自然风光和宏伟的山峰。让我们一起享受这段难忘的缆车之旅吧!祝您旅途愉快!你还有什么问题要问我吗?你可以这么问,华少华少,华山有几座山峰。"
mutex = False
def __init__(self, debug=False) -> None:
usage = "usage: %prog [options] start|stop|restart"
self.parser = OptionParser(usage)
self.parser.add_option(
"-c",
"--config",
dest="config",
help="config file",
default="/srv/config.ini",
metavar="/srv/config.ini",
)
self.parser.add_option(
"-l",
"--logfile",
dest="logfile",
help="log file",
default=None,
metavar="/tmp/" + os.path.basename(__file__).replace(".py", ".log"),
)
self.parser.add_option("", "--debug", action="store_true", dest="debug", help="debug mode")
self.parser.add_option("-d", "--daemon", dest="daemon", action="store_true", help="run as daemon")
self.parser.add_option("", "--demo", dest="demo", action="store_true", help="run as demo")
(self.options, self.args) = self.parser.parse_args()
super().__init__(cfgfile=self.options.config, logfile=self.options.logfile)
if self.options.logfile:
logging.basicConfig(level=logging.NOTSET, format="%(asctime)s %(levelname)-8s %(message)s", datefmt="%Y-%m-%d %H:%M:%S", filename=self.options.logfile, filemode="w")
else:
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format="%(asctime)s %(levelname)-8s %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
self.logging = logging.getLogger()
self.host = self.option("door", "host")
self.port = 1883
self.username = self.option("door", "username")
self.password = self.option("door", "password")
self.topic = self.option("door", "topic")
# self.queue = Queue(maxsize=10)
def broadcast(self, msg):
try:
client_id = f"{__name__}-{random.randint(0, 1000)}"
auth = {"username": self.username, "password": self.password}
publish.single(self.topic, payload=msg, qos=2, retain=False, hostname=self.host, port=self.port, client_id=client_id, keepalive=60, will=None, auth=auth, tls=None, protocol=client.MQTTv5, transport="tcp")
self.logging.info(f"Broadcast topic: {self.topic}, msg: {msg}")
except Exception as err:
self.logging.error(f"MQTT {repr(err)}")
exit()
def press(self, x):
if self.mutex:
self.broadcast(self.sensor["down"])
self.mutex = False
self.logging.info("release %s" % x)
def release(self, x):
self.mutex = True
self.broadcast(self.sensor["up"])
self.logging.info("press %s" % x)
def run(self):
self.broadcast("缆车门传感器准备就绪")
try:
# keyboard.on_press(press)
# keyboard.on_release(release)
keyboard.on_press_key("menu", self.press)
keyboard.on_release_key("menu", self.release)
keyboard.wait()
except Exception as err:
self.logging.error("Run %s" % err)
exit()
def daemon(self):
pid = os.fork()
if pid > 0:
sys.exit(0)
def main(self):
if self.options.debug:
print("=" * 50)
print(self.options, self.args)
print("=" * 50)
if self.options.daemon:
self.daemon()
# print(self.args)
# if not self.args:
# self.parser.print_help()
# exit()
# else:
self.run()
if __name__ == "__main__":
try:
door = Door()
door.main()
except KeyboardInterrupt:
print("Crtl+C Pressed. Shutting down.")