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编写爬虫小程序
May 14 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
Python sep参数使用方法详解
Feb 12 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
python实现将中文日期转换为数字日期
Jul 14 Python
python中封包建立过程实例
Feb 18 Python
Pytorch中Softmax和LogSoftmax的使用详解
Jun 05 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
咖啡常见的种类
2021/03/03 新手入门
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php二维数组转成字符串示例
2014/02/17 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
载入进度条 效果
2006/07/08 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
浅析javascript 定时器
2014/12/23 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
python实现按任意键继续执行程序
2016/12/30 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
PHP开发的一般流程
2013/08/13 面试题
高二政治教学反思
2014/02/01 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
学生通报表扬范文
2015/05/04 职场文书
vue里使用create, mounted调用方法
2022/04/26 Vue.js