如何在PyGTK,GTK或其他编程语言中获得已打开窗口的列表?在Ubuntu上?
编辑:
我想获取桌面上已打开目录的路径列表!
如何在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参考手册。它不是特定于Python的,但使用GObject Introspection的整个重点是通过gir
绑定在所有语言中具有相同的API。
此外,Ubuntu默认安装了wnck
和其对应的gir
绑定,但如果需要安装它们:
sudo apt-get install libwnck-3-* gir1.2-wnck-3.0
这也将安装libwnck-3-dev
,虽然不是必需的,但会安装有用的文档,您可以使用DevHelp进行阅读。
wnck.screen_get_default()
。虽然这个答案比另一个答案更新,但我认为这应该是被采纳的答案,因为旧的那个不再起作用了。 - Zelphir Kaltstahl你可能需要使用 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 "没有找到窗口" for win in window_list: print win.get_name()
def __init__(self): self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.button = gtk.Button("列出窗口") 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()
screen.force_update()
。请参阅http://developer.gnome.org/libwnck/stable/getting-started.html中的常见陷阱。 - Bruce van der Kooij无论出于何种原因,我无法发布评论,但我想将此作为对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()
解析命令行输出通常不是最好的方法,因为你依赖于程序输出不会改变,而这可能会因版本或平台而有所不同。以下是使用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
来自PyGTK参考文献:
gtk.gdk.window_get_toplevels()
gtk.gdk.window_get_toplevels()
函数返回一个列表,其中包含默认屏幕上所有已知的顶级窗口。 顶级窗口是根窗口(请参见gtk.gdk.get_default_root_window()
函数)的子窗口。
我真的不知道如何检查一个窗口是否是GTK窗口。但是如果你想要检查当前有多少个窗口打开,可以尝试使用"wmctrl -l"命令。当然,首先需要安装它。