使用Python和Xorg获取当前窗口标题

8
在stackoverflow上回答了我之前在这里提出的Wiimote左/右键单击问题后,我不仅可以移动鼠标光标,现在我还可以左/右键单击物品。我现在有一个问题。
我应该在Python中使用什么来获取当前活动窗口的标题?在谷歌搜索“X11 Python Window Title”,“Linux Python Window Title”和类似的内容之后,我发现的都是win32和tkinker(再次?),这不是我需要的东西。
如果你能帮忙,那就太棒了!
7个回答

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

这仅仅给我它正在运行的窗口的标题。:( - dbdii407
只需在代码中加入一个“time.sleep()”方法,并切换到其他窗口,即可获得当前窗口的标题。这种方法可以获取当前窗口的标题,而不仅仅是程序正在运行的窗口。 - killown
实际上,我确实设置了time.sleep(3),但标题仍然是相同的。 - dbdii407

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

这很简短也很好!当然,全面描述的名称/类名并不总是像人们希望的那样具有描述性。 - matanster
3
对我来说,这两个都返回None。 - Rena

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]

我遇到了错误:TypeError: 需要字节类似的对象,而不是'str'。 - sangorys

2

使用ewmh

from ewmh import EWMH
wm = EWMH()
win = wm.getActiveWindow()
win_name = win.get_wm_name()
print(win_name)

0

我的解决方案:

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

0

如果你想处理Windows和工作区等方面,我认为python-wnck可能会很有用。我无法立即找到Python文档,但根据它包装的libwnck C库的文档,它具有wnck_screen_get_active_window()方法。


-1

问题是要找出哪个窗口是活动的还是窗口的标题是什么? 获取窗口的标题很简单:

MainWindow.title()

其中MainWindow是窗口的名称。对于活动窗口,我不确定。从来没有过多个窗口。


我需要获取当前活动窗口的名称,就是前台窗口的名称。 - dbdii407
MainWindow是什么?它是一个包、类、对象还是变量? - Nagabhushan S N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接