如何用python-xlib管理我的应用窗口?
我想找到一种适用于整个Linux系统(只要它使用X11)的方式来控制我用Python编写的应用程序的窗口大小和位置。经过我的研究,发现大家都推荐使用python-xlib,但这个库的文档实在是太少了。
我想实现的功能有:
- 定义窗口在屏幕上的位置
- 设置窗口的最小和最大大小
- 启用或禁用窗口的大小调整
- 为窗口保留屏幕空间
- 控制窗口在其他窗口的上方或下方
- 选择是否在任务栏中显示(也就是窗口列表)
- 设置窗口是否有边框
- 设置窗口的类型标志(普通窗口、弹出窗口、对话框、启动画面、停靠窗口、被忽略的窗口)
注意:我不想用Xlib来创建窗口,而是想告诉X如何处理我用某个图形界面库(比如PyQt)创建的窗口。
我该如何着手呢?我知道这个问题比较复杂,你能给我一些提示吗?我该在这个模块的哪里寻找答案呢?
编辑:n.m.的回答提供了很好的资源,还有另一个Unix StackExchange上的问答,里面有个很好的例子,展示了如何控制X显示的应用程序窗口。
2 个回答
1
我昨天刚发现这个,觉得比用各种工具如 xdotool
、wmctrl
、gtk
和 tkinter
来移动窗口要好得多:
def x11_move_window(window_id_dec, x, y, width, height):
""" Use x11 library to move window From:
https://gist.github.com/chipolux/13963019c6ca4a2fed348a36c17e1277
"""
import Xlib.display
d = Xlib.display.Display()
window = d.create_resource_object('window', window_id_dec)
window.configure(x=x, y=y, width=width, height=height, border_width=0,
stack_mode=Xlib.X.Above)
d.sync()
注意,如果你用 wmctrl
获取了窗口的ID,你需要在调用 x11_move_window
之前把它从十六进制转换成十进制:
window_id_hex = \
os.popen('wmctrl -l | grep gone_fishing.png').read().strip().split()[0]
window_id_dec = int(window_id_hex, 16)
2
你需要了解的第一个关键词是 ICCCM。你应该熟悉 ICCCM 手册(可以查看 http://tronche.com/gui/x/icccm/),还有 FreeDesktop 的相关扩展(可以查看 http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html)。至于你的问题
我该如何获取我的窗口?
我不是很明白你的意思。你调用 create_window
这个函数,它会返回你的窗口对象。或者你是指其他的什么吗?