在Linux上的python中侦听全局键组合

 余小刚玩guitarvp_996 发布于 2023-01-18 13:37

我刚刚写了一个小程序,每隔几分钟从flickr下载一个新壁纸.

现在我想添加"喜欢"壁纸的功能,所以它会比非喜欢或不喜欢的壁纸更频繁地出现.

我想为这个功能分配一个全局键盘快捷键.

例如:如果按ctrl + 7,它将在Python中执行某种"喜欢"的功能.

是否有任何库(在JavaScript中,例如有一个库,我可以在其中定义快捷方式shortcut("ctrl-b", someFunction);)

否则,我该怎么做呢?我见过这个类似的问题,但它已经过时了.

1 个回答
  • 我不知道任何旨在扩展的库.然而,正如你的链接所说,pykeylogger的后端提供了一个如何做到的例子,但它似乎有点过于复杂,你需要.

    pykeylogger使用python-xlib模块捕获X显示器上的按键.有人已经创建了一个如何在pastebin上进行此操作的较轻的示例.下面是它原样复制的来源.

    from Xlib.display import Display
    from Xlib import X
    from Xlib.ext import record
    from Xlib.protocol import rq
    
    disp = None
    
    def handler(reply):
        """ This function is called when a xlib event is fired """
        data = reply.data
        while len(data):
            event, data = rq.EventField(None).parse_binary_value(data, disp.display, None, None)
    
            # KEYCODE IS FOUND USERING event.detail
            print event.detail
    
            if event.type == X.KeyPress:
                # BUTTON PRESSED
                print "pressed"
            elif event.type == X.KeyRelease:
                # BUTTON RELEASED
                print "released"
    
    # get current display
    disp = Display()
    root = disp.screen().root
    
    # Monitor keypress and button press
    ctx = disp.record_create_context(
                0,
                [record.AllClients],
                [{
                        'core_requests': (0, 0),
                        'core_replies': (0, 0),
                        'ext_requests': (0, 0, 0, 0),
                        'ext_replies': (0, 0, 0, 0),
                        'delivered_events': (0, 0),
                        'device_events': (X.KeyReleaseMask, X.ButtonReleaseMask),
                        'errors': (0, 0),
                        'client_started': False,
                        'client_died': False,
                }])
    disp.record_enable_context(ctx, handler)
    disp.record_free_context(ctx)
    
    while 1:
        # Infinite wait, doesn't do anything as no events are grabbed
        event = root.display.next_event()
    

    您将不得不扩展处理程序以满足您的需要,而不仅仅是打印到屏幕,然后将其转换为单独的线程.

    (痛苦的)替代方案是直接听键盘,而不依赖于外部库或X会话.在linux中,一切都是文件,您的键盘输入将在/ dev/input中,您可以将其作为文件读取,例如open('/dev/input/even2', 'rb'),在后台.这不建议,因为它需要升级权限,找出哪个设备是键盘,然后创建自己的键映射.只是想让你知道必要时有什么可能.

    编辑:还使用Python gtk3在X上找到了全局键绑定,这似乎有更多示例优点.

    2023-01-18 13:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有