我需要找到窗口的位置和大小,但是我不知道如何。例如,如果我尝试:
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}
我需要找到窗口的位置和大小,所以我的问题是:“ y”,“ x”和“ border_width”始终为0;更糟糕的是,返回的“高度”和“宽度”没有窗口框架。
在这种情况下,在我的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脚本的输出的明显解决方法不正确。
您可能正在使用父窗口管理器,并且由于这个ID,所以窗口的x和y为零。检查父窗口的坐标(这是窗口管理器框架)
极少发布以下解决方案as a comment:
from ewmh import EWMH
ewmh = EWMH()
def frame(client):
frame = client
while frame.query_tree().parent != ewmh.root:
frame = frame.query_tree().parent
return frame
for client in ewmh.getClientList():
print frame(client).get_geometry()
我在这里复制它是因为answers should contain the actual answer,并且为了防止出现link rot。
这是我想出的效果很好:
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。