Python 如何在PyGTK或Ubuntu中的GTK中打开列表窗口?
如何使用PyGTK或GTK或其他编程语言获取列表打开的窗口?在Ubuntu中 编辑: 我要在桌面上打开目录列表路径 来自: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窗口。但如果您想检查当前打开
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