¿Cómo obtener una lista de ventanas abiertas en PyGTK o GTK en Ubuntu?

¿Cómo obtener una lista de ventanas abiertas en PyGTK o GTK u otro lenguaje de progtwigción? en Ubuntu?

editar:

Quiero obtener la lista de rutas abiertas directorios en el escritorio!

Probablemente quieras usar libwnck:

http://library.gnome.org/devel/libwnck/stable/

Creo que hay enlaces de python en python-gnome o algún paquete similar.

Una vez que tenga el mainkop GTK + en funcionamiento, puede hacer lo siguiente:

 importar wnck
 window_list = wnck.screen_get_default (). get_windows ()

Algunos métodos interesantes en una ventana de esa lista son get_name () y activar ().

Esto imprimirá los nombres de las ventanas en la consola cuando haga clic en el botón. Pero por alguna razón tuve que hacer clic en el botón dos veces. Esta es la primera vez que uso libwnck, así que probablemente me esté perdiendo algo. 🙂

 importación pygtk
 pygtk.require ('2.0')
 importar gtk, wnck

 clase WindowLister:
     def on_btn_click (self, widget, data = None):
         window_list = wnck.screen_get_default (). get_windows ()
         si len (window_list) == 0:
             Imprimir "No se encuentra Windows"
         para ganar en window_list:
             imprimir win.get_name ()

     def __init __ (self):
         self.window = gtk.Window (gtk.WINDOW_TOPLEVEL)

         self.button = gtk.Button ("List Windows")
         self.button.connect ("clicked", self.on_btn_click, Ninguno)

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

     def main (self):
         gtk.main ()

 si __name__ == "__main__":
     lister = WindowLister ()
     lister.main ()

¡Bienvenidos al 2013! Aquí está el código que utiliza Wnck y sus modernas bibliotecas de introspección GObject en lugar del método PyGTK ahora en desuso. También puede consultar mi otra respuesta sobre 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() 

En cuanto a la documentación, consulte el manual de referencia de Libwnck . No es específico para python, pero el objective principal de usar GObject Introspection es tener la misma API en todos los idiomas, gracias a los enlaces gir .

Además, Ubuntu se envía con wnck y su correspondiente enlace gir fuera de la caja, pero si necesita instalarlos:

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

Esto también instalará libwnck-3-dev , que no es necesario pero instalará documentación útil que puede leer usando DevHelp

Por alguna razón, no puedo publicar un comentario, pero me gustaría agregar esto como un apéndice a la respuesta de Sandy.

Aquí hay un trozo de código que lista las ventanas actuales en la consola:

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

Gracias Sandy!

Realmente no sé cómo comprobar si una ventana es una GTK. Pero si desea comprobar cuántas ventanas están abiertas actualmente, intente “wmctrl -l”. Instálalo primero por supuesto.

De la referencia de PyGTK :

gtk.gdk.window_get_toplevels()

La función gtk.gdk.window_get_toplevels() devuelve una lista de todas las ventanas de nivel superior conocidas por PyGTK en la pantalla predeterminada. Una ventana de nivel superior es un elemento secundario de la ventana raíz (consulte la función gtk.gdk.get_default_root_window() ).

El análisis de la salida de la línea de comandos no suele ser la mejor manera, depende de que la salida de los progtwigs no cambie, lo que podría variar de la versión o plataforma. Aquí está cómo hacerlo usando 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 

Tenga en cuenta que esta lista contendrá ventanas que normalmente no clasificaría como “ventanas”, pero eso no importa para lo que esté tratando de hacer.