Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

2.13. keyboard

	
pip install keyboard	
	
	

2.13.1. 读取键盘值

读取键盘值

		
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()		
		
		

2.13.2. 功能键

		
>>> keyboard.get_hotkey_name(['+', 'left ctrl', 'shift'])
'ctrl+shift+plus'

>>> keyboard.get_hotkey_name(['+', 'left ctrl', 'f13'])
'ctrl+f13+plus'		
		
		

2.13.3. 上下索道缆车开关门

		
#!/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.")