如何用python-xlib管理我的应用窗口?

7 投票
2 回答
3459 浏览
提问于 2025-04-16 18:36

我想找到一种适用于整个Linux系统(只要它使用X11)的方式来控制我用Python编写的应用程序的窗口大小和位置。经过我的研究,发现大家都推荐使用python-xlib,但这个库的文档实在是太少了。

我想实现的功能有:

  • 定义窗口在屏幕上的位置
  • 设置窗口的最小和最大大小
  • 启用或禁用窗口的大小调整
  • 为窗口保留屏幕空间
  • 控制窗口在其他窗口的上方或下方
  • 选择是否在任务栏中显示(也就是窗口列表)
  • 设置窗口是否有边框
  • 设置窗口的类型标志(普通窗口、弹出窗口、对话框、启动画面、停靠窗口、被忽略的窗口)

注意:我不想用Xlib来创建窗口,而是想告诉X如何处理我用某个图形界面库(比如PyQt)创建的窗口。

我该如何着手呢?我知道这个问题比较复杂,你能给我一些提示吗?我该在这个模块的哪里寻找答案呢?

编辑:n.m.的回答提供了很好的资源,还有另一个Unix StackExchange上的问答,里面有个很好的例子,展示了如何控制X显示的应用程序窗口。

2 个回答

1

我昨天刚发现这个,觉得比用各种工具如 xdotoolwmctrlgtktkinter 来移动窗口要好得多:

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 这个函数,它会返回你的窗口对象。或者你是指其他的什么吗?

撰写回答