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对Access读写操作
Mar 30 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
Pandas的Apply函数具体使用
Jul 21 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 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边学边教》(01.开篇――准备工作)
2006/12/13 PHP
php session劫持和防范的方法
2013/11/12 PHP
学习php中的正则表达式
2014/08/17 PHP
javascript 写类方式之七
2009/07/05 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
vue设置默认首页的操作
2020/08/12 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
粗略分析Python中的内存泄漏
2015/04/23 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
pandas 数据类型转换的实现
2020/12/29 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
视图的作用
2014/12/19 面试题
会议主持词
2014/03/17 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
pytorch中的 .view()函数的用法介绍
2022/03/17 Python