2009-09-04 21 views

risposta

9

probabilmente si desidera utilizzare libwnck:

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

Credo che ci siano binding Python in python-gnome o qualche pacchetto simile.

volta che hai la GTK + mainloop esecuzione, è possibile effettuare le seguenti operazioni:

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

Alcuni metodi interessanti su una finestra da quella lista sono get_name() e attivare().

Questo stamperà i nomi delle finestre sulla console quando si fa clic sul pulsante. Ma per qualche ragione ho dovuto fare clic sul pulsante due volte. Questa è la mia prima volta che utilizzo libwnck, quindi probabilmente mi manchi qualcosa. :-)

 
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 "No Windows Found" 
     for win in window_list: 
      print 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, None) 

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

    def main(self): 
     gtk.main() 

if __name__ == "__main__": 
    lister = WindowLister() 
    lister.main() 
+1

wnck.screen_get_default(). Get_windows() - restituisce la lista vuota :( – john

+0

Nel mio test rapido, ho dovuto aprire una finestra gtk + (nel mio processo python) prima che la chiamata potesse funzionare – Sandy

+1

Puoi dare un semplice esempio di codice ? thx – john

2

Da the PyGTK reference:

gtk.gdk.window_get_toplevels()

La funzione gtk.gdk.window_get_toplevels() restituisce un elenco di tutte le finestre principali noti per PyGTK sullo schermo predefinita. Una finestra di livello superiore è un elemento figlio della finestra radice (vedere la funzione gtk.gdk.get_default_root_window() ).

+0

Restituisce solo una finestra - "('UTF8_STRING', 8, 'wnd.py')", e ho tre finestre aperte gedit – john

+1

Ricevo lo stesso problema dopo il test - la funzione non ha funzionato come riferimento suggerito che lo farebbe. La tua migliore scommessa per ora è probabilmente quella di usare la chiamata a wmctrl -l come suggerito da NawaMan; a parte questo, l'unica cosa che posso pensare è usare direttamente il modulo X11. –

1

Non so davvero come controllare se una finestra è una GTK. Ma se vuoi controllare quante finestre sono attualmente aperte prova "wmctrl -l". Installatelo prima di tutto.

2

Analisi uscita di linea di comando di solito non è il modo migliore, si è dipendenti da che i programmi di uscita non cambiano, che potrebbero variare da versione o dalla piattaforma. Ecco come farlo 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 

Nota che questa lista conterrà finestre che normalmente non si classificano come 'finestre', ma questo non importa per ciò che si sta cercando di fare.

4

Per qualsiasi motivo, non posso pubblicare un commento, ma vorrei aggiungere questo come addendum alla risposta di Sandy.

Ecco un pezzo di codice che elenca le finestre attuali sulla console:

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

Grazie Sandy!

9

Benvenuti nel 2013! Ecco il codice che utilizza Wnck e le sue moderne librerie di introspezione GObject invece del metodo PyGTK ora deprecato.Si può anche verificare my other answer about 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() 

Per quanto riguarda la documentazione, controlla la Libwnck Reference Manual. Non è specifico per Python, ma l'intero punto di utilizzo di GObject Introspection è di avere la stessa API in tutte le lingue, grazie ai binding gir.

Inoltre, le navi Ubuntu sia con wnck e il suo corrispondente gir vincolante, fuori dalla scatola, ma se è necessario installarli:

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

Questo sarà anche installare libwnck-3-dev, che non è necessario, ma installerà utile documentazione che è possibile leggere utilizzando DevHelp

+0

Questa soluzione ha funzionato per me, mentre la risposta accettata ha sollevato un errore affermando che non c'è 'wnck.screen_get_default()'. Anche se questa risposta è più recente dell'altro, penso che questa dovrebbe essere la risposta accettata, dal momento che quella vecchia non funziona più. – Zelphir

Problemi correlati