Получить текущее название окна с Python и Xorg
Вопрос
После того, как Stackoverflow ответил на мой предыдущий вопрос здесь о моей проблеме Wiimote Left / Щелкните правой кнопкой мыши, я могу ли я переместить курсор мыши, теперь могу оставить / щелкнуть правой кнопкой мыши на вещах. У меня сейчас есть еще один вопрос.
Что я использую в Python, чтобы получить название текущего активного окна? После Googleing 'X11 Python Window Title', «Linux Python Window Title» и подобных, все, что я нашел, это Win32 и Tkinker (опять же?), Что мне не нужно.
Если бы вы могли помочь, это было бы потрясающе!
Решение
РЕДАКТИРОВАТЬ
лучший способ:
import gtk
import wnck
import glib
class WindowTitle(object):
def __init__(self):
self.title = None
glib.timeout_add(100, self.get_title)
def get_title(self):
try:
title = wnck.screen_get_default().get_active_window().get_name()
if self.title != title:
self.title = title
print title
except AttributeError:
pass
return True
WindowTitle()
gtk.main()
Альтернативный способ:
from subprocess import PIPE, Popen
import time
title = ''
root_check = ''
while True:
time.sleep(0.6)
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]:
title = j.split()[2]
print "current window title: %s" % title
Другие советы
Решение на основе XPROP Killown можно уплотнить в одном (хотя и длительном) утверждении:
import subprocess
def GetActiveWindowTitle():
return subprocess.Popen(["xprop", "-id", subprocess.Popen(["xprop", "-root", "_NET_ACTIVE_WINDOW"], stdout=subprocess.PIPE).communicate()[0].strip().split()[-1], "WM_NAME"], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].strip().split('"', 1)[-1][:-1]
Проблема выяснить, какое окно активно или что такое название? Получение заголовка окна легко:
MainWindow.title()
, где MainWindow - это имя окна. Нет представления о активном окне, хотя. Никогда не было нескольких окон.
Я думаю, что Python-WNCK может быть полезен, если вы хотите обрабатывать Windows & Workspaces и такие. Я не могу найти документы Python немедленно, но, согласно документам для библиотеки libwnck C, которая она охватывает, она имеет wnck_screen_get_active_window () метод.
Мое решение:
import wnck
disp=Display()
default_screen=wnck.screen_get_default()
default_screen.force_update()
active_window=disp.create_resource_object('window', default_screen.get_active_window().get_xid())
title=active_window.get_wm_name()
Я заметил, что WNCK требует цикла событий GTK для обновления активного окна. Там нет такой проблемы с XLib:
import Xlib
import Xlib.display
disp = Xlib.display.Display()
window = disp.get_input_focus().focus
# Get active window class and name
window.get_wm_class()
window.get_wm_name()