python - 如何使用 pygtk 获取 gnome2 桌面上所有窗口的列表?

标签 python gtk pygtk gnome window-management

我对一些 gtk 和 gnome 概念有点困惑。我试图在我的 gnome2 桌面上获取非最小化窗口的列表,但在阅读 pygtk 文档并检查结果后,我无法理解结果。

下面的两个片段似乎都不起作用。

首先我尝试了这个..

>>> gtk.gdk.window_get_toplevels()
[<gtk.gdk.Window object at 0xb74339b4 (GdkWindow at 0x8a4c170)>]

>>> gtk.gdk.window_get_toplevels()[0].get_children()
[]

然后这个

>>> d = gtk.gdk.DisplayManager()   
>>> d.get_default_display().get_screen(0).get_root_window().get_children() 
[<gtk.gdk.Window object at 0x89dcc84 (GdkWindow at 0x8a4c170)>, <gtk.gdk.Window object at 0x89dccac (GdkWindow at 0x8a4c0c0)>] 

如控制台输出所示,第二个选项返回两个窗口。但我一直无法弄清楚它们是什么。他们都没有 child ,无论我的桌面上有多少个窗口,我总是得到这两个窗口。

谁能解释典型的基于 gtk 的桌面环境的对象层次结构? 我不明白为什么上面的代码不起作用。

请不要发布资源到 wnck、xlib、qt 等的替代解决方案。我更感兴趣的是了解我做错了什么,而不是获得检查其他库的建议。

最佳答案

您的约束就像是在说“我想只用一根香蕉来制作一个 CD 播放器。请不要发布诉诸激光的替代解决方案。” GTK 无法做到这一点,您使用了错误的工具来完成这项工作。

这里解释了“窗口”的实际含义以及您的代码为何不起作用:

首先,您需要了解 gtk.Windowgtk.gdk.Window 之间的区别。 GTK 窗口是顶级 GTK 小部件,可以包含其他小部件。它通常链接到桌面上的一个窗口,但不一定是 - 在 GTK 3 中有一个 OffscreenWindow

另一方面,GDK 窗口是平台相关的。在 X 桌面上,它是 X 窗口的薄包装,不一定是顶级桌面窗口。在其他系统上,它的存在是为了抽象出窗口系统。 GDK 窗口接收事件,所以一些 GTK 非窗口部件有它们自己的 GDK 窗口。 “Window”对于这些对象来说确实是一个糟糕的名字,但它是从 X 继承而来的,可能不会改变。

每个 GTK 进程只知道它的自己的窗口。您可以使用 gtk.window_list_toplevels() 获取您自己应用程序的顶级 GTK 窗口列表。 .获取这些窗口的子窗口应该返回它们包含的 GTK 小部件。但是,您不能进入其他进程窗口的小部件层次结构。例如,如果另一个进程有一个带有子窗口部件的窗口,而该子窗口部件是您的进程不知道的自定义窗口部件怎么办?它应该将什么报告为该小部件的类型?

使用 gtk.gdk.window_get_toplevels() 获取顶层 GDK 窗口列表据我所知,这与获取顶级 X 窗口的列表基本相同。您无法知道它们是什么类型的窗口 - 它们可能是 Gnome 面板,或者它们可能是 Qt 窗口,或者它们可能是与桌面窗口不对应的其他东西。

Libwnck(link 对其功能的概述)可以为您提供非最小化窗口及其标题的列表,但不允许您查看其中的内容。没有办法做到这一点。 Libwnck 在内部使用 GDK,所以从技术上讲,您可以使用 GDK 来完成它,但是如果已经有一个库可以为您做这件事,您为什么还要费心呢?如果您真的想自己动手,请查看 libwnck 源代码。

关于python - 如何使用 pygtk 获取 gnome2 桌面上所有窗口的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9353114/

相关文章:

python - 如何在 Python 中计算 Jaccard 指数?

Python 策略模式 : Dynamically import class files

c - 如何创建一个新线程以使 pcap_loop() 和 gtk_main() 兼容?

python - 使用PyGTK/win32,如何在其父窗口附近放置一个新窗口,但不在屏幕外?

python - 反转 'update_comment',参数为 '(' ',)' not found. 1 pattern(s) tried: [' comment\\/(?P<news_pk>[0-9]+)$']

javascript - 如何使用 JavaScript 在 GTK 中创建剪贴板对象

c - 传递 GtkWidget 参数

python - pygtk:确定键是修饰符

python - 为独立 HTML 桌面应用程序安装 Webkit

python - Matplotlib Colorbar 科学记数法偏移量