经过一番研究,我找到了使用 Python-Xlib 的解决方案。
在生成窗口的代码中,可以获得窗口ID,它是X上窗口的参考。根据所使用的GUI工具包,获取该ID的方法可能会有所不同。 Qt4提供QWidget.winId(),Gtk+2有自己的方式为窗口预留空间,我没有尝试过Gtk+3,但有人告诉我应该有window_id属性。
由于只有在窗口显示后才能调用 X 为窗口保留空间,所以在大多数情况下,需要在进入主事件循环后进行查询。
下面的示例显示了使用 PyQt4 的 Qt4 案例示例。为了在窗口显示后获取窗口,在 QApplication 进入其主循环之前启动一个线程,并且该线程不断轮询 X,直到它设法“抓住”窗口。在下面的示例中,屏幕顶部保留了空间,高度与我们为其保留空间的 QWidget 的高度相同。
def fix_window(self):
set = False
while set == False:
try:
window = myXwindow.Window(self.parent().winId())
if window != None:
height = self.parent().height()
window.reserve_space(0, 0, height, 0)
set = True
else:
self.sleep(1)
except:
raise
在上面的示例中,myXwindow 是使用 Python-Xlib 的自定义模块。以下是该模块的内容,其中 Xlib 向 X 查询 Display() 并随后创建一个窗口对象,该对象是一个抽象模型,以引用 X 显示的窗口。更改此模型的属性后,我们可以 Display()。 sync() 以应用更改。预留空间的方法是change_property(),其中根据Freedesktop.org Standards传递一系列参数。
class Window(object):
def __init__(self, windowID):
self._display = Display()
self._window = self._display.create_resource_object('window', windowID)
def reserve_space(self, left=0, right=0, top=0, bottom=0):
LEFT = left
RIGHT = right
TOP = top
BOTTOM = bottom
self._window.change_property(self._display.intern_atom('_NET_WM_STRUT'),
self._display.intern_atom('CARDINAL'),
32, [LEFT, RIGHT, TOP, BOTTOM])
self._display.sync()
注意:保持创建窗口对象的同一 Display() 实例很重要,以便更改窗口属性,因此将其存储到变量中。