如何在Ubuntu中获取PyGTK或GTK打开的窗口列表?

11 投票
6 回答
10417 浏览
提问于 2025-04-15 14:04

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

编辑:

我想获取桌面上打开的文件夹路径列表!

6 个回答

4

不管出什么原因,我无法发评论,但我想把这个作为对Sandy回答的补充。

这里有一段代码,可以在控制台上列出当前打开的窗口:

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()

谢谢你,Sandy!

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 的主要目的就是让不同编程语言之间有相同的接口,这要归功于 gir 绑定。

另外,Ubuntu 系统自带了 wnck 及其对应的 gir 绑定,但如果你需要安装它们的话:

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

这也会安装 libwnck-3-dev,虽然这个不是必须的,但它会安装一些有用的文档,你可以通过 DevHelp 来阅读。

10

你可能想用libwnck这个库:

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

我记得在python-gnome或者类似的包里有Python的接口。

一旦你启动了GTK+的主循环,你可以这样做:

import wnck
window_list = wnck.screen_get_default().get_windows()

在那个列表中,有一些有趣的方法,比如get_name()和activate()。

当你点击按钮时,这会把窗口的名字打印到控制台上。不过奇怪的是,我得点两次按钮才行。这是我第一次用libwnck,可能还有些地方没弄明白。:-)

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

class WindowLister:
    def on_btn_click(self, widget, data=None):
        window_list = wnck.screen_get_default().get_windows()
        if len(window_list) == 0:
            print "No Windows Found"
        for win in window_list:
            print win.get_name()

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

        self.button = gtk.Button("List Windows")
        self.button.connect("clicked", self.on_btn_click, None)

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

    def main(self):
        gtk.main()

if __name__ == "__main__":
    lister = WindowLister()
    lister.main()

撰写回答