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动态加载变量示例分享
Feb 17 Python
python海龟绘图实例教程
Jul 24 Python
Django中login_required装饰器的深入介绍
Nov 24 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
Python Tkinter实现简易计算器功能
Jan 30 Python
Django rest framework实现分页的示例
May 24 Python
Python中的 enum 模块源码详析
Jan 09 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
详解python算法之冒泡排序
Mar 05 Python
python实现维吉尼亚加密法
Mar 20 Python
详解Python的三种可变参数
May 08 Python
Python : turtle色彩控制实例详解
Jan 19 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
在UpdatePanel内jquery easyui效果失效的解决方法
2010/04/11 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
js 利用className得到对象的实现代码
2011/11/15 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
Python与shell的3种交互方式介绍
2015/04/11 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
售后主管岗位职责
2013/12/08 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
广播体操口号
2014/06/18 职场文书
礼貌问候语大全
2015/11/10 职场文书
python常见的占位符总结及用法
2021/07/02 Python