【问题标题】:How to manage my application window with python-xlib?如何使用 python-xlib 管理我的应用程序窗口?
【发布时间】:2011-09-04 15:50:05
【问题描述】:

我想找到一种 linux 范围的(只要它使用 X11)方法来控制我的应用程序的窗口几何形状,我使用 Python 进行编程。我所有的研究都指向使用python-xlib,而这恰好记录得很差。

我想要实现的是:

  • 定义窗口在屏幕上的位置
  • 定义最小和最大尺寸
  • 启用/禁用窗口大小调整
  • 为窗口保留屏幕空间
  • 将窗口保持在上方/下方
  • 是否跳过任务栏(又名窗口列表)
  • 设置窗口装饰/未装饰
  • 设置窗口标志(正常、弹出、对话、启动、停靠、忽略)

注意:我不想用 Xlib 创建,而是想告诉 X 如何处理我用一些 GUI 库(例如 PyQt)创建的窗口。

我该怎么做呢?我意识到这个问题是一个相当大的问题:您至少对我如何抓住我的窗户有提示吗?在模块的哪里可以找到我的答案?

编辑: n.m. 的回答提供了很好的资源,还有another Q&A on Unix StackExchange 提供了一个很好的例子,说明如何控制 X 显示的应用程序窗口。

【问题讨论】:

    标签: python linux window x11 xlib


    【解决方案1】:

    您需要知道的第一个关键字是 ICCCM。您需要熟悉 ICCCM 手册(请参阅http://tronche.com/gui/x/icccm/)和 FreeDesktop 扩展(请参阅http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html)。至于你的问题

    我怎样才能抓住我的窗户?

    我不太明白。您调用 create_window 并且该函数返回您的 Window 对象。还是你的意思是别的?

    【讨论】:

    • 谢谢,我会查看文档。通过“抓住窗口”我的意思是:我想在 Python 中使用 PyGI、PyQt、PyWx 或 Kivy 创建我的窗口,然后我想在 X 正在管理的那些窗口中找到这个窗口,并告诉 X 这个窗口应该是按我的意愿处理,例如。在屏幕上保留了空间。所以我不想用 xlib 创建窗口,我只想告诉 X 窗口管理器如何处理它。我想我得到了some interesting clues from this post
    • 哈! ICCM 看起来就像我需要开始的。我现在仍然需要一些 Python-xlib 特定信息。
    • create_window 返回一个 Window 类的 Python 对象,其中应该包含一个低级窗口句柄,也就是窗口 ID(某个整数)。你可能永远不应该直接使用这个句柄。该库应该将所有必要的服务包装在 Window 类的方法中,并且可能在其他一些接受 Window 对象作为参数的函数中。
    【解决方案2】:

    昨天刚发现这个,我认为与使用各种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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      相关资源
      最近更新 更多