linux下python抓屏实现方法


Posted in Python onMay 22, 2015

本文实例讲述了linux下python抓屏实现方法。分享给大家供大家参考。具体实现代码如下:

#!/usr/bin/python
'''by zevolo, 2012.12.20
'''
import gtk.gdk
import gtk
import glib
class MyRect():
  def __init__(self, x = 0, y = 0, w = 0, h = 0):
    self.x = x
    self.y = y
    self.w = w
    self.h = h
  def __init__(self, x, y):
    self.x = min(int(x.x), int(y.x))
    self.y = min(int(x.y), int(y.y))
    self.w = abs(int(y.x - x.x))
    self.h = abs(int(y.y - x.y))
class MyPair():
  def __init__(self, x = 0, y = 0):
    self.x = x
    self.y = y
class MyPoint(MyPair):
  def __init__(self, x = 0, y = 0):
    MyPair.__init__(self, x, y)
class MySize(MyPair):
  def __init__(self, w = 0, h = 0):
    MyPair.__init__(self, x, y)
class MyCapture():
  (event_enter, event_leave) = (0, 1)
  def __init__(self):
    pass
  def capture(self):
    pass
  def handleEvent(self, event):
    if event == event_enter:
      enterSnap()
    elif event == event_leave:
      leaveSnap()
  def enterSnap(self):
    pass
  def leaveSnap(self):
    pass
  def snap(self, window = None, rect = None, name = None):
    pass
class MyCaptureGtk(MyCapture):
  def __init__(self):
    MyCapture.__init__(self)
    self.window = gtk.Window()
    self.window.set_default_size(1,1)
    self.window.connect("button-press-event", self.button_press_cb)
    self.first = None
    self.second = None
    self.window.show()
    #self.window.set_events(gtk.gdk.BUTTON_PRESS_MASK)
  def getWindow(self):
    return self.window
  def button_press_cb(self, widget, event):
    #print "type is %d" % event.type
    if event.type == gtk.gdk.BUTTON_PRESS:
      if event.button == 1: #left button
        print "(%d, %d), (%d, %d), button is %d" % (event.x_root, event.y_root, event.x, event.y, event.button)
        if not self.first:
          self.first = MyPoint(event.x_root, event.y_root)
        else:
          self.second = MyPoint(event.x_root, event.y_root)
          self.snap(None, MyRect(self.first, self.second))
          self.first = None
      elif event.button == 3: #right button
        self.uncapture()
      else:
        pass
  def uncapture(self):
    if self.first:
      print "cancel"
      self.first = None
    else:
      print "exit now"
      gtk.gdk.pointer_ungrab()
      gtk.mainquit()
  def capture(self, time = 0L):
    cursor = gtk.gdk.Cursor(gtk.gdk.display_get_default(), gtk.gdk.CROSSHAIR)
    ret = gtk.gdk.pointer_grab(self.window.window, True,
          gtk.gdk.BUTTON_PRESS_MASK,
          None, cursor, time)
    if ret == gtk.gdk.GRAB_SUCCESS:
      print "left button start, end, right button cancel/exit"
    else:
      print "failed to capture %d, (viewable %d),(frozen %d), (already %d)" \
       % (ret, gtk.gdk.GRAB_NOT_VIEWABLE, gtk.gdk.GRAB_FROZEN, gtk.gdk.GRAB_ALREADY_GRABBED)
  def snap(self, window = None, rect = None, name = None):
    w = window
    if not window:
      #w = gtk.gdk.get_default_root_window()
      d = gtk.gdk.display_get_default()
      w = d.get_default_screen().get_root_window()
    r = rect
    if not r:
      sz = w.get_size()
      r = MyRect(0, 0, sz[0], sz[1])
    print "The size of the window is (%d, %d, %d, %d)" % (r.x, r.y, r.w, r.h)
    n = name
    if not n:
      n = "screenshot.png"
    buf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8, r.w, r.h)
    buf = buf.get_from_drawable(w,w.get_colormap(), r.x, r.y, 0, 0, r.w, r.h)
    if (buf != None):
      buf.save(n, "png")
      print "Screenshot saved to %s." % n
    else:
      print "Unable to get the screenshot."
def timeout(data):
  #print "timeout"
  data.capture()
if __name__ == '__main__':
  cap = MyCaptureGtk()
  w = cap.getWindow()
  w.show()
  glib.timeout_add_seconds(1, timeout, cap)
#cap.snap()
  gtk.main()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
利用python获得时间的实例说明
Mar 25 Python
Python SQLite3数据库操作类分享
Jun 10 Python
python批量生成本地ip地址的方法
Mar 23 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
详解Django中Request对象的相关用法
Jul 17 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Django视图和URL配置详解
Jan 31 Python
windows下python和pip安装教程
May 25 Python
python web框架 django wsgi原理解析
Aug 20 Python
python字符串反转的四种方法详解
Dec 02 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
python获取百度热榜链接的实例方法
Aug 25 Python
python实现的简单抽奖系统实例
May 22 #Python
python实现数组插入新元素的方法
May 22 #Python
Python3处理文件中每个词的方法
May 22 #Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 #Python
在Python中操作时间之mktime()方法的使用教程
May 22 #Python
Python中的localtime()方法使用详解
May 22 #Python
在Python中操作日期和时间之gmtime()方法的使用
May 22 #Python
You might like
PHP - Html Transfer Code
2006/10/09 PHP
php中的时间处理
2006/10/09 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
$()JS小技巧
2007/07/21 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
python调用外部程序的实操步骤
2019/03/04 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
美国最大的宠物药店:1-800-PetMeds
2016/10/02 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
解决方案设计综合面试题
2015/08/31 面试题
劳资专员岗位职责
2013/12/27 职场文书
工作证明英文模板
2014/10/21 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python