dut*_*utt 17 python linux pyqt4
我正在尝试获取活动窗口的标题.该应用程序是一个后台任务,因此如果用户打开Eclipse,该函数将返回"Eclipse - blabla",因此它不会获得我自己窗口的窗口标题.我正在使用PyQt4在Python 2.6中开发它.
我现在的解决方案,从SO的旧答案中借用并略微修改,如下所示:
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\"')
Run Code Online (Sandbox Code Playgroud)
它适用于大多数窗口,但不是全部.例如,它找不到我的kopete聊天窗口,或者我正在开发的应用程序的名称.
我的下一次尝试看起来像这样:
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;
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,窗口总是无.
有人有更好的方法来获取当前窗口标题,或者如何修改我的方法之一,适用于所有窗口?
编辑:
如果有人想知道这是我发现似乎适用于所有窗口的方式.
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"
Run Code Online (Sandbox Code Playgroud)
我稍微修改了你的解决方案,因此它应该更有效地运行(它将参数传递给xprop,因此只返回它需要的数据).另外,我不确定是否有必要缓冲xprop的输出,所以我把它拿出来了.如果由于某种原因它找不到活动窗口,它也应该正确返回"找不到活动窗口".
def get_active_window_title(self):
root = Popen(['xprop', '-root', '_NET_ACTIVE_WINDOW'], stdout=PIPE)
for line in root.stdout:
m = re.search('^_NET_ACTIVE_WINDOW.* ([\w]+)$', line)
if m != None:
id_ = m.group(1)
id_w = Popen(['xprop', '-id', id_, 'WM_NAME'], stdout=PIPE)
break
if id_w != None:
for line in id_w.stdout:
match = re.match("WM_NAME\(\w+\) = (?P<name>.+)$", line)
if match != None:
return match.group("name")
return "Active window not found"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9154 次 |
| 最近记录: |