0

私の目標は、ウィンドウを表示せずにスクリーンショットを作成することです。

コード: すべてのXvfb-things は QT ( example ) で動作しますが、GTK での使用方法を完全には理解していないようです。

import gtk,webkit,gobject,sys,os,time
web=webkit.WebView()
url = 'http://google.com/'
web.open(url)
win=gtk.Window()
win.add(web)

silence_xvfb=True
display='1'
screen='0'
xvfb_timeout=3
pidfile = '/tmp/.X%s-lock' % display
redirect = '> /dev/null 2>&1'
if not silence_xvfb:
    redirect = ''
cmd = ' '.join(['Xvfb', ':'+display, '-screen', screen, '1600x1200x24', redirect])
os.system(cmd+' &')

start = time.time()
while(True):
    diff = time.time() - start
    if(diff > xvfb_timeout):
        raise SystemError("Timed-Out waiting for Xvfb to start - {0} sec".format(xvfb_timeout))
    if(os.path.isfile(pidfile)):
        break
    else:
        time.sleep(0.05)

os.putenv('DISPLAY', ':%s' % display)

def drawWindow(win):
    width, height = win.get_size()
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height)

    screenshot = pixbuf.get_from_drawable(win.window, win.get_colormap(), 
                                          0, 0, 0, 0, width, height)

    screenshot.save('screenshot.png', 'png')
    print 'screenshot saved'

win.show_all()
gobject.timeout_add(5000, drawWindow, win)
gtk.main()
4

1 に答える 1

2

すべての X11 ベースのコード (Qt、KDE、gtk、wxWindows など) は、DISPLAY変数を使用して、使用するディスプレイを定義します。詳細については、ドキュメントを参照してください。

問題は、変数が最初の X11 呼び出し時にプロセスごとに 1 回検査されることです (多かれ少なかれ)。

したがって、あなたの場合、ウィンドウを作成してから、DISPLAY変数を設定しようとします。X11 は、既存のウィンドウをあるインスタンスから別のインスタンスに移動することはできません。

必要なことは、上記のコードを 2 つのプロセスに分割することです。1 つは変数を開始Xvfbして設定し、もう 1 つDISPLAYは UI をレンダリングします。

于 2012-08-24T12:56:06.460 に答える