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 相关文章推荐
Windows环境下python环境安装使用图文教程
Mar 13 Python
Python3模拟登录操作实例分析
Mar 12 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
Nov 30 Python
利用python中集合的唯一性实现去重
Feb 11 Python
python matplotlib包图像配色方案分享
Mar 14 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
Ubuntu中配置TensorFlow使用环境的方法
Apr 21 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
python 如何调用 dubbo 接口
Sep 24 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 Python
Python之多进程与多线程的使用
Feb 23 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笔试题
2009/08/04 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
原生javaScript实现图片延时加载的方法
2014/12/22 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
python实现中文输出的两种方法
2015/05/09 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python数据结构之翻转链表
2017/02/25 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
Python装饰器用法实例总结
2018/05/26 Python
Windows下安装Scrapy
2018/10/17 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
公司周年庆活动方案
2014/08/25 职场文书
财务管理专业自荐书
2014/09/02 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
人事文员岗位职责
2015/02/04 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript