如何获取 PyGTK 或 GTK 或其他编程语言中打开的窗口列表?在 Ubuntu 中?
编辑:
我想要获取桌面上打开目录的路径列表!
欢迎来到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 阅读
您可能想使用 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()
无论出于何种原因,我无法发表评论,但我想将其添加为桑迪答案的附录。
这里有一段代码,列出了控制台上的当前窗口:
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()
谢谢桑迪!
解析命令行输出通常不是最好的方法,您依赖于程序输出不变,这可能因版本或平台而异。以下是使用 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
请注意,此列表将包含您通常不会归类为“窗口”的窗口,但这对于您想要执行的操作并不重要。
我真的不知道如何检查一个窗口是否是 GTK 窗口。但如果您想检查当前打开的窗口数量,请尝试“wmctrl -l”。当然要先安装。
来自PyGTK参考:
gtk.gdk.window_get_toplevels()
函数返回所有的列表 PyGTK 已知的顶级窗口 默认屏幕。顶层窗口是 根窗口的子窗口(参见gtk.gdk.window_get_toplevels()
功能)。gtk.gdk.get_default_root_window()