2011-07-27 14 views
6

gubię w wersji 3 .. w python2 + gdk2 jest: Jak uzyskać okno Gdk z Xid?

#!/usr/bin/env python2 
import gtk 

gtk.gdk.window_process_all_updates() 
window_xid = 54525964 
gdk_window = gtk.gdk.window_foreign_new(window_xid) 

który jest dość dużo prosto do przodu. Ale potem, horror:

#!/usr/bin/env python3 
from gi.repository import xlib 
from gi.repository import Gdk 
from gi.repository import GdkX11 

Gdk.Window.process_all_updates() 
xlib_window = "???????" 
gdk_display = GdkX11.X11Display.get_default() 
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xlib_window) 

xlib mnie zabija .. jestem w stanie nic zrobić z nim. Czy ktoś wcześniej z nim pracował?

Dokumentacja mam przez to już kilka razy: Gdk3, Xlib

Pierwsze okno z jego XID był najszybszy sposób, aby uzyskać zrzut ekranu w python2 Chyba będę musiał spróbować w inny sposób w python3 .. jakieś pomysły? może peek_children z okna głównego? ale skąd mam wiedzieć, czy to okno, którego chcę?

Odpowiedz

9

A Window w X11 jest taki sam jak XID. Jest tylko typedef z jednego do drugiego.

Tak więc kod C gdk_x11_window_foreign_new_for_display() akceptuje tylko Window lub XID, który jest w zasadzie liczbą całkowitą. Działa to również w pythonie za pomocą introspekcji:

#!/usr/bin/env python3 
from gi.repository import Gdk 
from gi.repository import GdkX11 

Gdk.Window.process_all_updates() 
xlib_window = 0x2a00005 # from xwininfo command 
gdk_display = GdkX11.X11Display.get_default() 
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xlib_window) 
print gdk_window.get_geometry() 
+0

Awesome! Wielkie dzięki. Kiedy po raz pierwszy wypróbowałem to, myślę, że nie zostały jeszcze zaimplementowane. Po prostu drobna zmiana dla Pythona3, jednak dyrektywa 'print()' potrzebuje nawiasów. Poza tym działa jak urok. Dzięki jeszcze raz! – demula