10

如何获取 PyGTK 或 GTK 或其他编程语言中打开的窗口列表?在 Ubuntu 中?

编辑:

我想在桌面上获取列表路径打开​​的目录!

4

6 回答 6

13

欢迎来到2013!这是使用Wnck其现代 GObject Introspection 库的代码,而不是现在已弃用的 PyGTK 方法。您还可以查看我关于 wnck 的其他答案

from gi.repository import Gtk, Wnck

Gtk.init([])  # necessary only if not using a Gtk.main() loop
screen = Wnck.Screen.get_default()
screen.force_update()  # recommended per Wnck documentation

# loop all windows
for window in screen.get_windows():
    print window.get_name()
    # ... do whatever you want with this window

# clean up Wnck (saves resources, check documentation)
window = None
screen = None
Wnck.shutdown()

至于文档,请查看Libwnck 参考手册。它不是特定于 python,但使用 GObject Introspection 的全部意义在于在所有语言中拥有相同的 API,这要归功于gir绑定。

此外,Ubuntu 附带了两者wnck及其对应gir的绑定,但如果您需要安装它们:

sudo apt-get install libwnck-3-* gir1.2-wnck-3.0

这也将安装libwnck-3-dev,这不是必需的,但会安装有用的文档,您可以使用DevHelp阅读

于 2013-05-22T23:37:06.073 回答
10

你可能想使用 libwnck:

http://library.gnome.org/devel/libwnck/stable/

我相信在 python-gnome 或一些类似的包中有 python 绑定。

运行 GTK+ 主循环后,您可以执行以下操作:

导入 wnck
window_list = wnck.screen_get_default().get_windows()

该列表中窗口上的一些有趣方法是 get_name() 和 activate()。

当您单击按钮时,这会将窗口的名称打印到控制台。但由于某种原因,我不得不单击该按钮两次。这是我第一次使用 libwnck,所以我可能遗漏了一些东西。:-)

导入 pygtk
pygtk.require('2.0')
导入 gtk, wnck

类WindowLister:
    def on_btn_click(self, widget, data=None):
        window_list = wnck.screen_get_default().get_windows()
        如果 len(window_list) == 0:
            打印“未找到 Windows”
        在 window_list 中获胜:
            打印 win.get_name()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.button = gtk.Button("列出窗口")
        self.button.connect("点击", self.on_btn_click, 无)

        self.window.add(self.button)
        self.window.show_all()

    定义主要(自我):
        gtk.main()

如果 __name__ == "__main__":
    lister = WindowLister()
    lister.main()
于 2009-09-04T19:01:40.483 回答
4

无论出于何种原因,我无法发表评论,但我想将其添加为桑迪答案的附录。

这是列出控制台上当前窗口的一段代码:

import pygtk
pygtk.require('2.0')
import gtk, wnck

if __name__ == "__main__":
    default = wnck.screen_get_default()

    while gtk.events_pending():
        gtk.main_iteration(False)

    window_list = default.get_windows()
    if len(window_list) == 0:
        print "No Windows Found"
    for win in window_list:
        if win.is_active():
            print '***' + win.get_name()
        else:
            print win.get_name()

谢谢桑迪!

于 2011-02-12T01:15:48.610 回答
3

解析命令行输出通常不是最好的方法,您依赖于程序输出不变,这可能因版本或平台而异。以下是使用 Xlib 的方法:

import Xlib.display

screen = Xlib.display.Display().screen()
root_win = screen.root

window_names = []
for window in root_win.query_tree()._data['children']:
    window_name = window.get_wm_name()
    window_names.append(window_name)

print window_names

请注意,此列表将包含您通常不会归类为“窗口”的窗口,但这与您尝试执行的操作无关。

于 2009-09-04T20:47:15.637 回答
2

PyGTK 参考

gtk.gdk.window_get_toplevels()

gtk.gdk.window_get_toplevels() 函数在默认屏幕上返回 PyGTK 已知的所有顶级窗口的列表。顶层窗口是根窗口的子窗口(参见 gtk.gdk.get_default_root_window() 函数)。

于 2009-09-04T18:37:30.610 回答
2

我真的不知道如何检查一个窗口是否是 GTK 的。但是,如果您想检查当前打开了多少个窗口,请尝试“wmctrl -l”。当然是先安装。

于 2009-09-04T18:46:50.903 回答