python wnck 在 pdb.set_trace() 之前不返回任何数据
在Ubuntu Linux / Gnome系统上,我想用Python的wnck库来获取所有打开窗口的列表。
我的代码是这样的:
#! /usr/bin/python
from pprint import pprint
import wnck
screen = wnck.screen_get_default()
pprint(screen.get_windows())
import pdb ; pdb.set_trace()
pprint(screen.get_windows())
输出结果是这样的:
** (windowlist.py:4501): WARNING **: Trying to register gtype 'WnckWindowState' as enum when in fact it is of type 'GFlags'
** (windowlist.py:4501): WARNING **: Trying to register gtype 'WnckWindowActions' as enum when in fact it is of type 'GFlags'
** (windowlist.py:4501): WARNING **: Trying to register gtype 'WnckWindowMoveResizeMask' as enum when in fact it is of type 'GFlags'
[]
> /home/rory/personal/diriu/windowlist.py(12)<module>()
-> pprint(screen.get_windows())
(Pdb) c
[<wnck.Window object at 0xb61db0cc (WnckWindow at 0x992c000)>,
<wnck.Window object at 0xb61db0f4 (WnckWindow at 0x992c0a8)>,
<wnck.Window object at 0xb61db11c (WnckWindow at 0x992c150)>,
<wnck.Window object at 0xb61db144 (WnckWindow at 0x992c1f8)>,
<wnck.Window object at 0xb61db16c (WnckWindow at 0x992c2a0)>,
<wnck.Window object at 0xb61db194 (WnckWindow at 0x992c348)>,
<wnck.Window object at 0xb61db1bc (WnckWindow at 0x992c3f0)>,
<wnck.Window object at 0xb61db1e4 (WnckWindow at 0x992c498)>,
<wnck.Window object at 0xb61db20c (WnckWindow at 0x992c540)>,
<wnck.Window object at 0xb61db234 (WnckWindow at 0x992c5e8)>,
<wnck.Window object at 0xb61db25c (WnckWindow at 0x992c690)>,
<wnck.Window object at 0xb61db284 (WnckWindow at 0x992c738)>]
第一次调用get_windows()
时,返回的是[]
,也就是一个空列表。第二次调用get_windows()
时,返回的是打开窗口的列表。在pdb
调试器里,我只按了c
继续执行,没有做其他操作(在pdb里)。
如果我把pdb
注释掉,那么两次调用get_windows()
都会返回[]
。如果在进入pdb之前多次调用get_windows()
,也什么都得不到。如果在pdb之后多次调用get_windows()
,我就会不断得到完整的窗口列表。
为什么这个调用在空的pdb之后才有效?我该怎么做才能在没有pdb的情况下也能正常工作?
2 个回答
0
我觉得这个问题和wnck没关系,但我想在使用pdb的时候,调用get_window的两次之间的时间应该足够让窗口列表初始化。你可以试着在调用get_window之前加个延迟,比如用sleep函数。
1
文件 so-wnck.py(来自 如何获取所有标题中包含特定词的窗口?)
import pygtk
pygtk.require('2.0')
import gtk
import wnck
screen = wnck.screen_get_default()
while gtk.events_pending():
gtk.main_iteration()
windows = screen.get_windows()
print (windows)
python so-wnck.py
** (so-wnck.py:2367): WARNING **: Trying to register gtype 'WnckWindowState' as enum when in fact it is of type 'GFlags'
** (so-wnck.py:2367): WARNING **: Trying to register gtype 'WnckWindowActions' as enum when in fact it is of type 'GFlags'
** (so-wnck.py:2367): WARNING **: Trying to register gtype 'WnckWindowMoveResizeMask' as enum when in fact it is of type 'GFlags'
[<wnck.Window object at 0xb7566694 (WnckWindow at 0x97c51f8)>,
<wnck.Window object at 0xb75666bc (WnckWindow at 0x97c52a0)>,
<wnck.Window object at 0xb75666e4 (WnckWindow at 0x97c5348)>,
<wnck.Window object at 0xb756670c (WnckWindow at 0x97c53f0)>,
<wnck.Window object at 0xb7566734 (WnckWindow at 0x97c5498)>,
<wnck.Window object at 0xb756675c (WnckWindow at 0x97c5540)>,
<wnck.Window object at 0xb7566784 (WnckWindow at 0x97c55e8)>]