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 操作MySQL详解及实例
Apr 30 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
python requests 测试代理ip是否生效
Jul 25 Python
python绘制散点图并标记序号的方法
Dec 11 Python
python运行时强制刷新缓冲区的方法
Jan 14 Python
bluepy 一款python封装的BLE利器简单介绍
Jun 25 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
Python类class参数self原理解析
Nov 19 Python
基于 Python 实践感知器分类算法
Jan 07 Python
Python字符串常规操作小结
Apr 03 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根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
laravel框架的安装与路由实例分析
2019/10/11 PHP
js传值 判断
2006/10/26 Javascript
js获取提交的字符串的字节数
2009/02/09 Javascript
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
javascript中的float运算精度实例分析
2010/08/21 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
python 异常处理总结
2016/10/18 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
html5 外链式实现加减乘除的代码
2019/09/04 HTML / CSS
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
函授本科自我鉴定
2014/02/04 职场文书
文艺演出策划方案
2014/06/07 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
redis实现共同好友的思路详解
2021/05/26 Redis
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
vue 给数组添加新对象并赋值
2022/04/20 Vue.js