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

问题描述 投票:0回答:6

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

编辑:

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

python ubuntu gtk pygtk window-management
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 参考手册 /(Gitlab Gnome 的存储库)。它不是特定于 python 的,但使用 GObject Introspection 的全部目的是在所有语言中拥有相同的 API,这要归功于

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+ 主循环运行后,您可以执行以下操作:

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

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

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

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

窗口列表类:
    def on_btn_click(自身,小部件,数据=无):
        window_list = wnck.screen_get_default().get_windows()
        如果 len(window_list) == 0:
            打印“未找到 Windows”
        对于 window_list 中的胜利:
            打印 win.get_name()

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

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

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

    def main(自身):
        gtk.main()

如果 __name__ == "__main__":
    列表器 = WindowLister()
    列表器.main()

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

谢谢桑迪!


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

请注意,此列表将包含您通常不会归类为“窗口”的窗口,但这对于您想要执行的操作并不重要。


2
投票

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


2
投票

来自PyGTK参考

gtk.gdk.window_get_toplevels()

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

© www.soinside.com 2019 - 2024. All rights reserved.