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