使用Xlib在python中获取窗口位置和大小

时间:2012-10-08 04:00:01

标签: python xlib

我需要找到窗口位置和大小,但我无法弄清楚如何。例如,如果我尝试:

id.get_geometry()    # "id" is Xlib.display.Window

我得到这样的东西:

data = {'height': 2540,
'width': 1440,
'depth': 24,
'y': 0, 'x': 0,
'border_width': 0
'root': <Xlib.display.Window 0x0000026a>
'sequence_number': 63}

我需要找到窗口位置和大小,所以我的问题是:&#34; y&#34;,&#34; x&#34;和&#34; border_width&#34;总是0;更糟糕的是,&#34;身高&#34;和&#34;宽度&#34;没有窗框返回。

在我X屏幕上的这种情况下(尺寸为4400x2560)我预计x = 1280,y = 0,宽度= 1440,高度= 2560.

换句话说,我正在寻找python等价物:

#!/bin/bash
id=$1
wmiface framePosition $id
wmiface frameSize $id

如果您认为Xlib不是我想要的,请随意在python中提供非Xlib解决方案,如果它可以将window id作为参数(如上面的bash脚本)。在python代码中使用bash脚本输出的明显解决方法感觉不对。

3 个答案:

答案 0 :(得分:1)

你可能正在使用重新显示窗口管理器,因为这个id窗口的x和y为零。检查父窗口的坐标(窗口管理器框架)

答案 1 :(得分:0)

Liss发布了以下解决方案as a comment

NSInteger *lastID = [[NSUserDefaults standardUserDefaults] integerForKey:@"lastID"]==nil ? @1 : [[NSUserDefaults standardUserDefaults] integerForKey:@"lastID"];

我在这里复制它是因为answers should contain the actual answer,并且是为了阻止link rot

答案 2 :(得分:0)

这是我想出的效果很好的方法:

from collections import namedtuple

import Xlib.display


disp = Xlib.display.Display()
root = disp.screen().root

MyGeom = namedtuple('MyGeom', 'x y height width')


def get_absolute_geometry(win):
    """
    Returns the (x, y, height, width) of a window relative to the top-left
    of the screen.
    """
    geom = win.get_geometry()
    (x, y) = (geom.x, geom.y)
    while True:
        parent = win.query_tree().parent
        pgeom = parent.get_geometry()
        x += pgeom.x
        y += pgeom.y
        if parent.id == root.id:
            break
        win = parent
    return MyGeom(x, y, geom.height, geom.width)

完整示例here