使用Python和Xorg获取当前窗口标题
在StackOverflow上,有人回答了我之前关于Wiimote左右点击问题的提问。现在我不仅可以移动鼠标光标,还能左右点击东西了。现在我又有一个问题。
我想知道在Python中怎么获取当前活动窗口的标题。我在网上搜索了“X11 Python窗口标题”、“Linux Python窗口标题”等类似的关键词,结果只找到了win32和tkinter(又来了?),这并不是我需要的。
如果你能帮忙,那就太好了!
7 个回答
3
killown 提出的基于 xprop 的解决方案可以简化成一个单一的(虽然比较长)语句:
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]
6
我注意到,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()
12
编辑
最佳方法:
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