Estoy tratando de obtener el título de la ventana activa. La aplicación es una tarea en segundo plano, por lo que si el usuario tiene Eclipse abierto, la función devuelve "Eclipse - blabla", por lo que no obtiene el título de la ventana de mi propia ventana. Estoy desarrollando esto en Python 2.6 usando PyQt4.Obtiene el título activo de la ventana en X
Mi solución actual, prestado y ligeramente modificada de una vieja respuesta aquí en SO, tiene el siguiente aspecto:
def get_active_window_title():
title = ''
root_check = ''
root = Popen(['xprop', '-root'], stdout=PIPE)
if root.stdout != root_check:
root_check = root.stdout
for i in root.stdout:
if '_NET_ACTIVE_WINDOW(WINDOW):' in i:
id_ = i.split()[4]
id_w = Popen(['xprop', '-id', id_], stdout=PIPE)
for j in id_w.stdout:
if 'WM_ICON_NAME(STRING)' in j:
if title != j.split()[2]:
return j.split("= ")[1].strip(' \n\"')
Funciona para la mayoría de las ventanas, pero no todos. Por ejemplo, no puede encontrar mis ventanas de chat kopete, o el nombre de la aplicación que estoy desarrollando actualmente.
Mi siguiente intento se ve así:
def get_active_window_title(self):
screen = wnck.screen_get_default()
if screen == None:
return "Could not get screen"
window = screen.get_active_window()
if window == None:
return "Could not get window"
title = window.get_name()
return title;
Pero por alguna razón ventana siempre es Ninguno.
¿Alguien tiene una forma mejor de obtener el título actual de la ventana, o cómo modificar uno de mis métodos, que funciona para todas las ventanas?
Editar:
En caso de que alguien se pregunta este es el camino me encontré con que parece que funciona para todas las ventanas.
def get_active_window_title(self):
root_check = ''
root = Popen(['xprop', '-root'], stdout=PIPE)
if root.stdout != root_check:
root_check = root.stdout
for i in root.stdout:
if '_NET_ACTIVE_WINDOW(WINDOW):' in i:
id_ = i.split()[4]
id_w = Popen(['xprop', '-id', id_], stdout=PIPE)
id_w.wait()
buff = []
for j in id_w.stdout:
buff.append(j)
for line in buff:
match = re.match("WM_NAME\((?P<type>.+)\) = (?P<name>.+)", line)
if match != None:
type = match.group("type")
if type == "STRING" or type == "COMPOUND_TEXT":
return match.group("name")
return "Active window not found"
hay un propósito a la copia de la salida estándar a la salida estándar root_check si no está vacío? – enthdegree
echa un vistazo a la solución de Alex Spurlings más abajo, él ha tomado esa parte. – dutt