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

Python 如何在PyGTK或Ubuntu中的GTK中打开列表窗口?,python,ubuntu,gtk,pygtk,window-management,Python,Ubuntu,Gtk,Pygtk,Window Management,如何使用PyGTK或GTK或其他编程语言获取列表打开的窗口?在Ubuntu中 编辑: 我要在桌面上打开目录列表路径 来自: gtk.gdk.window\u get\u toplevels() gtk.gdk.window\u get\u toplevels() 函数返回所有 桌面上PyGTK已知的顶级窗口 默认屏幕。顶层窗口是一个 根窗口的子窗口(请参见 gtk.gdk.get_default_root_window() 功能) 我真的不知道如何检查窗口是否是GTK窗口。但如果您想检查当前打开

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

编辑:

我要在桌面上打开目录列表路径

来自:

gtk.gdk.window\u get\u toplevels()

gtk.gdk.window\u get\u toplevels()
函数返回所有 桌面上PyGTK已知的顶级窗口 默认屏幕。顶层窗口是一个 根窗口的子窗口(请参见
gtk.gdk.get_default_root_window()
功能)


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

您可能想使用libwnck:

我相信在PythonGNOME或类似的包中有python绑定

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

import wnck window_list = wnck.screen_get_default().get_windows() 进口wnck window\u list=wnck.screen\u get\u default().get\u windows() 该列表中窗口上的一些有趣的方法是get_name()和activate()

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

进口pygtk pygtk.require('2.0') 进口gtk,wnck 类WindowLister: 单击时的定义(self,widget,data=None): window\u list=wnck.screen\u get\u default().get\u windows() 如果len(窗口列表)==0: 打印“未找到窗口” 对于窗口中的win\u列表: 打印win.get_name() 定义初始化(自): self.window=gtk.window(gtk.window\u顶层) self.button=gtk.button(“列表窗口”) self.button.connect(“单击”,self.on\u btn\u单击,无) self.window.add(self.button) self.window.show_all() def主(自): gtk.main() 如果名称=“\uuuuu main\uuuuuuuu”: lister=WindowLister() lister.main()
解析命令行输出通常不是最好的方法,您依赖于程序输出不改变,这可能因版本或平台而异。以下是如何使用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

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

出于任何原因,我无法发表评论,但我想将此作为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()

谢谢桑迪

欢迎来到2013!下面是使用
Wnck
及其现代GObject内省库而不是现在不推荐的PyGTK方法的代码。您还可以检查:

至于文档,请查看。它并不特定于python,但使用GObject内省的全部意义在于跨所有语言使用相同的API,这要归功于
gir
绑定

此外,Ubuntu附带了
wnck
和相应的
gir
现成绑定,但如果需要安装它们:

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

这也将安装
libwnck-3-dev
,这不是必需的,但将安装有用的文档,您可以使用阅读。它只返回一个窗口-“('UTF8_STRING',8,'wnd.py')”,我有三个打开的gedit窗口,我在测试后遇到了相同的问题-函数没有按照参考建议的那样工作。您现在最好的选择可能是按照NawaMan的建议使用对wmctrl-l的调用;除此之外,我唯一能想到的就是直接使用X11模块.wnck.screen_get_default().get_windows()-返回空列表:(在我的快速测试中,我必须在调用开始工作之前打开一个gtk+窗口(在我的python进程中)。如果你的应用程序是非GUI的,你可以在调用之后执行“gtk.events_pending():gtk.main_iteration()”“wnck.get_screen_default()”刷新事件并能够获取窗口列表。还有
screen.force_update()
。请参阅中的常见陷阱。请澄清:是否要获取所有Nautilus窗口的所有选项卡中显示的目录列表?此解决方案对我有效,而接受的答案出现了一个错误,指出没有
wnck.screen\u get\u default()
。虽然这个答案比另一个新,但我认为这应该是可以接受的答案,因为旧的答案已经不起作用了。
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()
sudo apt-get install libwnck-3-* gir1.2-wnck-3.0