2015-09-04 15 views
5

Ho usato Wnck per verificare se una finestra si è creato in questo modo:Come testare se la finestra di dialogo GTK + è stata creata?

screen = Wnck.Screen.get_default() 
    screen.force_update() # recommended per Wnck documentation 
    window_list = screen.get_windows() 

    for window in window_list: 
     print(window.get_name()) 
     if window.has_name(): 
      if window.get_name() == self.xld_main_window.get_title(): 
       window_found = True 
       break 
    assert window_found, 'The Gtk.Window named {window_name} has not been found.'\ 
     .format(window_name=self.xld_main_window.get_title()) 

    # clean up Wnck (saves resources, check documentation) 
    window = None 
    screen = None 

Tuttavia, dato che le finestre di dialogo non si presentano nella lista di compiti, non riesco a trovare in quel modo. Qual è un modo appropriato per verificare se sono visualizzati (e modali/non modali)?

risposta

1

Il metodo Wnck.Screen.get_windows restituisce tutte le finestre comprese le finestre di dialogo. Non c'è alcuna distinzione poiché la funzione restituisce qualsiasi Wnck.Window attualmente mappato. La fonte è questa:

* The #WnckScreen represents a physical screen. A screen may consist of 
* multiple monitors which are merged to form a large screen area. The 
* #WnckScreen is at the bottom of the libwnck stack of objects: #WnckWorkspace 
* objects exist a #WnckScreen and #WnckWindow objects are displayed on a 
* #WnckWorkspace. 
* 
* The #WnckScreen corresponds to the notion of 
* <classname>GdkScreen</classname> in GDK. 

GList* 
wnck_screen_get_windows (WnckScreen *screen) 
{ 
    g_return_val_if_fail (WNCK_IS_SCREEN (screen), NULL); 

    return screen->priv->mapped_windows; 
} 

dove screen->priv punti ad un struct contenente alcune liste delle finestre (mappati, impilati), un puntatore alla finestra attiva, ecc Alcuni WnckWindow possono avere WNCK_WINDOW_DIALOG insieme ed essere una finestra .

La classe WnckWindow fornisce anche una funzione transient_is_most_recently_activated() di sapere se l'attenzione dovrebbe andare a una finestra figlio transiente quando selezionato in un WnckTaskList o per ridurre la finestra transitorio con il suo genitore. Ad esempio, per conoscere wether My Application finestra ha un transitorio attivato più di recente:

screen = Wnck.Screen.get_default() 
screen.force_update() # recommended per Wnck documentation 
window_list = screen.get_windows() 

for window in window_list: 
    if window.get_name() == 'My Application': 
     print(window.transient_is_most_recently_activated()) 

Lo script di seguito cattura le finestre di dialogo come altre finestre mappati (non importa se sono modali/non-modale o l'applicazione sono da) .

import gi 
gi.require_version('Gtk', '3.0') 
gi.require_version('Wnck', '3.0') 
from gi.repository import Gtk, Wnck 

class DialogExample(Gtk.Dialog): 

    def __init__(self, parent): 
     Gtk.Dialog.__init__(self, "My Dialog", parent, 0, #or Gtk.DialogFlags.MODAL 
      (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
      Gtk.STOCK_OK, Gtk.ResponseType.OK)) 

     self.set_default_size(100, 100) 

     label = Gtk.Label("This is a dialog to display additional information") 

     box = self.get_content_area() 
     box.add(label) 
     self.show_all() 

class DialogWindow(Gtk.Window): 

    def __init__(self): 
     Gtk.Window.__init__(self, title="Dialog Example") 
     self.set_border_width(6) 
     button = Gtk.Button("Open dialog") 
     button.connect("clicked", self.on_button_clicked) 
     self.add(button) 

    def on_button_clicked(self, widget): 
     dialog = DialogExample(self) 
     response = dialog.run() 

     if response == Gtk.ResponseType.OK: 
      print("The OK button was clicked") 
     elif response == Gtk.ResponseType.CANCEL: 
      print("The Cancel button was clicked") 

     screen = Wnck.Screen.get_default() 
     screen.force_update() # recommended per Wnck documentation 
     window_list = screen.get_windows() 

     for window in window_list: 
      print(window.get_name()) 

     window, window_list = (None,)*2 
     screen = None 

     dialog.destroy() 

win = DialogWindow() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 

window = None 
screen = None 
Gtk.main() 

Utilizzando Gdk anziché Wnck, si sta facendo la stessa cosa a un livello leggermente inferiore.

+0

Grazie per la risposta, ma AFAIK questo: _ "Il metodo restituisce Wnck.Screen.get_windows tutte le finestre incluse le finestre di dialogo. "_ non è vero. Se la finestra di dialogo fosse in quell'elenco di finestre restituite dalla funzione, non avrei mai postato questa domanda. Ora è passato un po 'di tempo, ma l'unico altro errore che posso immaginare è che dovrei aspettare un po' prima di ottenere l'elenco delle finestre, ma dal momento che non si tratta della finestra di dialogo che è visibile per ora, non penso che la creazione del dialogo dovrebbe richiedere così tanto tempo. Conoscete altri motivi, perché la finestra di dialogo non si troverà in quella lista di finestre? – Zelphir

+0

Nota anche che le finestre di dialogo non appaiono in nessuna barra delle applicazioni sul mio sistema. Quindi se wnck usa qualche tipo di controllo sulla barra delle applicazioni, non funzionerà in questo modo. – Zelphir

+0

Sono riuscito a ottenere il tuo esempio e ora sono convinto che ci deve essere qualche altro errore nel mio test di pytest, il che fa sì che la finestra di dialogo non compaia nell'elenco. Forse posso trovarlo lavorando con il tuo esempio. – Zelphir

0

Prendendo parte da this answer da Eye of Hell che dice come ottenere le finestre aperte, si può fare questo:

from gtk import gdk 

name = "MyDialog" 

root = gdk.get_default_root_window() 
matches = [] 
for id in root.property_get("_NET_CLIENT_LIST"): 
    window = gdk.window_foreign_new(id) 
    if window and window.property_get("WM_NAME")[2] == name: 
     matches.append(window) 

for match in matches: 
    print(match, match.get_modal_hint()) 
+0

Mi spiace, ma mi sto informando sui dialoghi e non su Windows. Ho già usato la funzione nell'OP per verificare la presenza di Windows, ma non funziona sulle finestre di dialogo (o c'è un altro errore da qualche parte). – Zelphir

+0

@Zelphir: i dialoghi funzionano per me. – zondo

Problemi correlati