2015-09-04 10 views
5

Użyłem Wnck, by sprawdzić, czy okno zostało stworzone tak:Jak sprawdzić, czy zostało utworzone okno dialogowe GTK +?

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 

Jednakże, ponieważ dialogi nie pojawi się na liście zadań, nie mogę znaleźć je w ten sposób. Jaki jest właściwy sposób sprawdzenia, czy są wyświetlane (i modalne/nie modalne)?

Odpowiedz

1

Metoda Wnck.Screen.get_windows zwraca wszystkie okna, w tym także okna dialogowe. Nie ma rozróżnienia, ponieważ funkcja zwraca każdą aktualnie zmienioną mapą Wnck.Window. Źródłem idzie tak:

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

gdzie screen->priv wskazuje na struct zawierających wykazy okien (odwzorowanych, ułożone), wskaźnik do aktywnego okna, etc. Niektóre WnckWindow może mieć WNCK_WINDOW_DIALOG zestaw i być dialogowe .

Klasa WnckWindow zapewnia również funkcję transient_is_most_recently_activated() wiedzieć, czy nacisk powinien udać się do przejściowej okna potomnego, gdy wybrany w WnckTaskList lub zminimalizowanie przejściowy okno z jego rodzica. Na przykład, aby wiedzieć pogoda My Application okno ma ostatnio aktywowany przejściowy:

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

Skrypt poniżej łapie dialogi jak inne odwzorowanych Windows (bez względu na to, czy są one modalne/blokami lub aplikacja są z) .

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

Używanie Gdk zamiast Wnck, robisz to samo na nieco niższym poziomie.

+0

Dziękuję za odpowiedź, ale AFAIK to: _ "The Wnck.Screen.get_windows metoda powraca wszystkie okna, w tym okna dialogowe. "_ nie jest prawdą. Jeśli okno dialogowe znajdowało się na liście okien zwróconych przez funkcję, nigdy nie opublikowałem tego pytania. Teraz minęło trochę czasu, ale jedyny inny błąd, który mogę sobie wyobrazić, to, że muszę trochę poczekać, zanim otrzymam listę okien, ale ponieważ nie chodzi o to, że dialog jest teraz widoczny, nie sądzę, że stworzenie dialogu powinno zająć tyle czasu. Czy znasz inne powody, dlaczego dialog nie byłby na tej liście okien? – Zelphir

+0

Należy również zauważyć, że okna dialogowe nie pojawiają się na żadnym pasku zadań w moim systemie. Więc jeśli wnck używa jakiejś kontroli paska zadań, to nie będzie działać w ten sposób. – Zelphir

+0

Udało mi się uruchomić twój przykład i teraz jestem przekonany, że w moim pytającym teście musi być jakiś inny błąd, który sprawia, że ​​dialog nie pojawia się na liście. Może znajdę to działając na twoim przykładzie. – Zelphir

0

Biorąc częściowo z this answer przez Eye of Hell który mówi jak się otwarte okna, można to zrobić:

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

Przepraszam, ale pytam o okna dialogowe, a nie o okna. Używałem już funkcji w OP do sprawdzania okien, ale nie działa ona w oknach dialogowych (lub gdzieś jest inny błąd). – Zelphir

+0

@Zelphir: Dialogi działają dla mnie. – zondo

Powiązane problemy