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 09 Python
python中循环语句while用法实例
May 16 Python
Python实现批量下载图片的方法
Jul 08 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
python opencv 直方图反向投影的方法
Feb 24 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
python实现把两个二维array叠加成三维array示例
Nov 29 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
使用python3 实现插入数据到mysql
Mar 02 Python
pandas处理csv文件的方法步骤
Oct 16 Python
pandas提升计算效率的一些方法汇总
May 30 Python
Python编程编写完善的命令行工具
Sep 15 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
php中转义mysql语句的实现代码
2011/06/24 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
jquery+json实现动态商品内容展示的方法
2016/01/14 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
python 控制语句
2011/11/03 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
客服服务心得体会
2013/12/30 职场文书
2015年教师工作总结范文
2015/03/31 职场文书
python实现简单区块链结构
2021/04/25 Python
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA