Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyudev设置键盘布局_Python_Linux_Bash_Xinput_Xmodmap - Fatal编程技术网

Python 使用pyudev设置键盘布局

Python 使用pyudev设置键盘布局,python,linux,bash,xinput,xmodmap,Python,Linux,Bash,Xinput,Xmodmap,我编写这个脚本是为了在插件上自动更改usb键盘布局 import pyudev from subprocess import call monitor = pyudev.Monitor.from_netlink(pyudev.Context()) monitor.filter_by('usb') def kbd_event(action, device):

我编写这个脚本是为了在插件上自动更改usb键盘布局

import pyudev                                                                   
from subprocess import call

monitor = pyudev.Monitor.from_netlink(pyudev.Context())
monitor.filter_by('usb')

def kbd_event(action, device):
    if action == 'add':
        call(["setxkbmap", "carpalx"])

observer = pyudev.MonitorObserver(monitor, kbd_event)
observer.start()
setxkbmap-carpalx
如果我在bash中键入它,它会工作,但不会更改上面代码中的布局。所以我在bash中这样做:

setxkbmap carpalx
xmodmap -pke > carpalx2
将上面的调用行更改为
call([“xmodmap”,“/carpalx2”])
,现在脚本可以工作了。我有以下问题:

  • 为什么xmodmap在代码中工作而setxkbmap不工作,但两者都在bash中工作
  • 目前,为每个usb事件调用kbd_事件,并为我插入的每个usb设备运行
    调用([“xmodmap”,“/carpalx2”)
    。如何进一步过滤事件,使布局仅在插入键盘时更改

  • 使用当前代码,每次插入鼠标时键盘布局都会发生变化:)

    您可以通过检查
    ID\u INPUT\u keyboard
    属性来筛选键盘:

    if action == 'add' and device['ID_INPUT_KEYBOARD'] == '1':
        print('a keyboard was added')
    
    关于直接调用
    setxkbmap
    和使用脚本之间的区别,我想X服务器也需要时间来初始化键盘。UDev在键盘完成UDev处理后立即调用回调,但这在X11服务器配置和初始化新键盘之前很容易实现


    检查X.org日志,以及
    setxkbmap
    可能打印的任何错误消息。

    运行
    setxkbmap
    时是否存在异常?尝试使用
    子流程。检查调用()
    。检查输出()
    。看起来它可能类似于
    setxkbmap
    需要一个
    DISPLAY
    环境变量,但是如果没有错误消息,很难判断。我尝试过,但似乎没有例外,setxkbmap和xmodmap都返回0,区别在于setxkbmap没有改变任何东西。当事件发生时,udev可能没有完全初始化键盘,因此setxkdmap无法设置布局?纵观这两个工具的配置,xmodmap似乎在较低的级别上运行。。可能是这种情况吗?可能与X身份验证有关。非常感谢:)我最终了解了sysfs的工作原理,并在您的回答中继续介绍解决方案!