代码之家  ›  专栏  ›  技术社区  ›  blueyed

如何通过id获取Xlib.display.Window实例?

  •  6
  • blueyed  · 技术社区  · 11 年前

    我找到了以下代码( http://pastebin.com/rNkUj5V8 ),但我宁愿使用直接查找:

    import Xlib
    import Xlib.display
    
    def get_window_by_id(winid):
        mydisplay = Xlib.display.Display()
        root = mydisplay.screen().root # should loop over all screens
        inspection_list = [root]
    
        while len(inspection_list) != 0:
            awin = inspection_list.pop(0)
            if awin.id == winid:
                return awin
            children = awin.query_tree().children
            if children != None:
                inspection_list += children
    
        return None
    
    # use xwininfo -tree to click on something (panel was good for me)
    # until you find a window with a name, then put that id in here
    print get_window_by_id(0x1400003)
    print get_window_by_id(0x1400003).get_wm_name()
    

    我已经尝试直接实例化一个Window对象,但是 get_attributes 失败:

    w = Xlib.xobject.drawable.Window(Xlib.display.Display(), 67142278)
    w.get_attributes()
    
    /usr/lib/python2.7/dist-packages/Xlib/display.pyc in __getattr__(self, attr)
        211             return types.MethodType(function, self)
        212         except KeyError:
    --> 213             raise AttributeError(attr)
        214 
        215     ###
    
    AttributeError: send_request
    
    1 回复  |  直到 11 年前
        1
  •  10
  •   Dan D.    11 年前

    使用 dpy.create_resource_object('window', 0x1400003) 哪里 dpy 是一个 Display 对象以获取 Window 对象。

    示例用法:

    >>> import Xlib
    >>> import Xlib.display
    >>> dpy = Xlib.display.Display()
    >>> win = dpy.create_resource_object('window', 0x277075e)
    >>> win.get_wm_class()
    ('gnome-terminal', 'Gnome-terminal')