tutorial combo application python testing dialog gtk3 wnck

python - combo - ¿Cómo probar si se ha creado el diálogo GTK+?



python gtk3 glade (2)

He usado Wnck para verificar si una ventana se ha creado así:

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

Sin embargo, dado que los cuadros de diálogo no aparecen en la lista de tareas, no puedo encontrarlos de esa manera. ¿Cuál es una forma apropiada de verificar si se muestran (y modal / no modal)?


El método Wnck.Screen.get_windows devuelve todas las ventanas, incluidos los cuadros de diálogo. No hay distinción ya que la función devuelve cualquier Wnck.Window que está mapeada actualmente. La fuente es así:

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

donde screen->priv apunta a una struct contiene algunas listas de las ventanas (asignadas, apiladas), un puntero a la ventana activa, etc. Algunas WnckWindow pueden tener WNCK_WINDOW_DIALOG establecido y ser un diálogo.

La clase WnckWindow también proporciona una función transient_is_most_recently_activated() para saber si el foco debe ir a una ventana secundaria transitoria cuando se selecciona en una WnckTaskList o para minimizar la ventana transitoria con su elemento primario. Por ejemplo, para saber si la ventana My Application tiene un transitorio activado más recientemente:

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

El script a continuación capta los cuadros de diálogo como otras ventanas mapeadas (no importa si son modales / no modales o la aplicación de la que son).

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

Usando Gdk en lugar de Wnck, estás haciendo lo mismo en un nivel ligeramente inferior.


Tomando parcialmente de esta respuesta por Eye of Hell que dice cómo abrir las ventanas, puedes hacer esto:

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