9
24
2011
8

通过PyGObject调用GDK截图

本文来自依云's Blog,转载请注明。

Linux 下截个图挺麻烦的。最开始我想学 scrot 使用 Xlib,结果因为看不懂而放弃,转而使用GDK。搜到了TualatriX的这篇《几十行代码构造一个截屏软件》。虽然才不到50行的 C 代码,但我还是觉得有点长。

本来准备像上次的《使用Xtest模拟鼠标点击》一样写成 Python 模块的,后来从 Vayn 那里看到原来可以通过 PyGObject 来调用 GTK 及 GDK 等等(hello world 程序)。于是我也用这种方式完成了截图的代码,才十几行,原理和TualatriX的完全一样。

import mimetypes
from gi.repository import Gdk

def screenshot(filename, rect=None, filetype=None):
  screen = Gdk.Screen.get_default()
  if rect is None:
    rect = (0, 0, screen.width(), screen.height())
  if filetype is None:
    t = mimetypes.guess_type(filename)[0]
    if t is None:
      raise ValueError('cannot guess filetype for filename: %s' % filename)
    filetype = t.split('/')[1]

  rootwin = screen.get_root_window()
  pixbuf = Gdk.pixbuf_get_from_window(rootwin, *rect)
  pixbuf.savev(filename, filetype, (), ())

不过没有找到PyGObject的文档。官方说可以自己从 gir 文件生成,但是那个脚本在最新版的代码中才有,而那个代码也要求Glib非常新,我的 Arch 上都没有那么新,于是作罢。所以用法除了自己按 GDK 的文档猜就是 Google 了。那个savev的参数我都找到mono的文档去了。。。

PyGObject 默认是使用 GTK 3。也可以指定使用 GTK 2:

import gi
gi.require_version("Gdk", "2.0")
gi.require_version("Gtk", "2.0")
from gi.repository import Gdk, Gtk

/usr/lib/girepository-1.0/下还有一些typelib文件,说明这些库都有 GObject Introspection 支持,可以用包括 Python 3 在内的任何其支持的语言访问。不过我调用 xlib 时出错了:

>>> from gi.repository import xlib
>>> d = xlib.open_display()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.2/site-packages/gi/types.py", line 44, in function
    return info.invoke(*args)
glib.GError: Could not locate XOpenDisplay: `XOpenDisplay': python3: undefined symbol: XOpenDisplay

GObject Introspection 这个东西挺好的,除了文档。文档啊,就算不能支持 Python 的 docstring,至少也弄个 HTML 版出来啊,现在只有堆 XML 文件叫我怎么情何以堪啊,现在用 PyGObject 写代码就像在猜谜。。。

最后,代码的 github 链接

Category: python | Tags: gtk linux python | Read Count: 16205
Avatar_small
sinners 说:
Sep 25, 2011 12:27:09 AM

为什么要写一个这样的程序,scrot不是挺好用的?

Avatar_small
依云 说:
Sep 25, 2011 04:42:44 PM

因为我要在程序里调用,scrot 还是只适合交互式使用,而且截图的时候还要滴一声。

vt 说:
Oct 22, 2011 11:27:08 PM

刚醒……把字体展示加强了一下,不过暂时没办法判断字体支不支持中文

http://p.vim-cn.com/cqC/py

Avatar_small
依云 说:
Oct 23, 2011 02:26:34 PM

see: http://lilydjwg.is-programmer.com/2011/10/23/use-fontconfig-to-query-font.30393.html

poet 说:
Nov 04, 2011 03:46:57 PM

如果只是要交互式截图的话,Kubuntu 里面直接按 PrntScrn 按钮就可以截图了。或者是直接弄个快捷方式启动 KSnapshot,注意这个软件即便不使用 KDE 也可以正常截图的。

按说 Ubuntu 应该也是同样的截图热键的。

Avatar_small
依云 说:
Nov 04, 2011 06:52:19 PM

我要的是非交互的截图。

yueduz 说:
Oct 13, 2012 12:46:47 AM

我一pygobject创建了一个全屏窗口,但是我如何才能在窗口打开时自动调用一个函数,如何在窗口内捕捉鼠标移动.帮帮我吧!大侠.搜了两天才搜到你这里来.

Avatar_small
依云 说:
Oct 13, 2012 01:21:15 AM

我也不怎么会啊。你参考下深度截图看看。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com