知乎专栏 |
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.")