2015-09-04 16 views
5

Ich habe Wnck verwendet um zu überprüfen, ob ein Fenster wie folgt erstellt wurde:Wie kann getestet werden, ob der GTK + -Dialog erstellt wurde?

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 

Da jedoch Dialoge werden nicht in der Liste der Aufgaben, ich kann sie auf diese Weise nicht finden. Was ist eine geeignete Art zu prüfen, ob sie angezeigt werden (und modal/nicht modal)?

Antwort

1

Die Methode Wnck.Screen.get_windows gibt alle Fenster einschließlich Dialoge zurück. Es gibt keine Unterscheidung, da die Funktion Wnck.Window zurückgibt, die derzeit zugeordnet ist. Die Quelle geht so:

* 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; 
} 

wo screen->priv verweist auf eine struct einige Listen der Fenster (abgebildet, gestapelt), einen Zeiger auf das aktive Fenster enthält, usw. Einige WnckWindowWNCK_WINDOW_DIALOG Satz haben kann und ein Dialog sein .

Die WnckWindow-Klasse bietet auch eine Funktion transient_is_most_recently_activated() zu wissen, ob der Fokus auf ein transientes Kind Fenster, wenn in einem WnckTaskList oder zu minimieren, um die transienten Fenster mit seinen Eltern ausgewählt gehen sollte. Zum Beispiel, um zu wissen, ob My Application Fenster ein zuletzt aktivierte transiente hat:

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

Das Skript unten fängt die Dialoge als andere kartiert Fenster (egal ob sie modal/nicht-modal oder die Anwendung sie sind) .

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

Mit Gdk anstelle von Wnck machen Sie dasselbe auf einer etwas niedrigeren Ebene.

+0

Dank für Ihre Antwort danken, aber afaik dies: _ "Die Wnck.Screen.get_windows Methode zurückgibt alle Fenster einschließlich Dialoge. "_ ist nicht wahr. Wenn der Dialog in der Liste der von der Funktion zurückgegebenen Fenster enthalten war, hätte ich diese Frage nie gestellt. Jetzt ist es eine Weile her, aber der einzige andere Fehler, den ich mir vorstellen kann, ist, dass ich etwas warten muss, bevor ich die Fensterliste erhalte, aber da es nicht darum geht, dass der Dialog für jetzt sichtbar ist, denke ich nicht Die Erstellung des Dialogs sollte so lange dauern. Kennen Sie andere Gründe, warum der Dialog nicht in dieser Liste von Fenstern wäre? – Zelphir

+0

Beachten Sie auch, dass Dialoge in keiner Taskleiste auf meinem System angezeigt werden. Wenn wnck also eine Art Taskleistenprüfung verwendet, funktioniert das nicht so. – Zelphir

+0

Ich konnte Ihr Beispiel ausführen und bin nun davon überzeugt, dass es in meinem Pytest einen anderen Fehler geben muss, der dazu führt, dass der Dialog nicht in der Liste erscheint. Vielleicht kann ich es mit Ihrem Beispiel arbeiten. – Zelphir

0

teilweise von this answer von Eye of Hell Taking, der sagt, wie die geöffneten Fenster zu bekommen, können Sie dies tun:

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

Sorry, aber ich erkundige mich nach Dialogen und nicht nach Fenstern. Ich habe bereits die Funktion im OP verwendet, um nach Fenstern zu suchen, aber es funktioniert nicht in Dialogen (oder irgendwo ist ein anderer Fehler). – Zelphir

+0

@Zelphir: Dialoge funktionieren für mich. – zondo

Verwandte Themen