我的目标是从窗口制作屏幕截图而不显示它。
代码:Xvfb
- 所有内容都适用于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()
答案 0 :(得分:2)
所有基于X11的代码(Qt,KDE,gtk,wxWindows,...)使用DISPLAY
变量来定义要使用的显示。 See the docs了解详情。
问题在于,在第一次X11调用(或多或少)时,每个进程检查一次变量。
因此,在您的情况下,您创建一个窗口,然后尝试设置DISPLAY
变量。 X11无法将现有窗口从一个实例移动到另一个实例。
您需要做的是将上面的代码拆分为两个进程。一个启动Xvfb
并设置DISPLAY
变量,另一个呈现UI。