4

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()呼び出しは[]、空のリストを返します。2番目のget_windows()呼び出しは、開いているウィンドウのリストを返します。ではpdb、を押しcて続行し、何もしません(pdbで)。

コメントアウトするpdbと、両方のget_windows()呼び出しが戻り[]ます。get_windows()pdbの前に何度も呼び出しを繰り返すと、何もありません。get_windows()pdbの後で何度も呼び出しを繰り返すと、完全なリストが継続的に表示されます。

この呼び出しが空のpdbの後でのみ機能するのはなぜですか?pdbなしで動作させるにはどうすればよいですか?

4

2 に答える 2

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)>]
于 2011-03-19T20:08:46.660 に答える
0

私はwnckを使用していませんが、get_windowへの2つの呼び出しの間にpdbの時間があれば、Windowsリストが初期化されるのに十分だと思います。get_windowを呼び出す前に、少し遅れてスリープを使用してみてください。

于 2011-03-18T13:22:24.117 に答える