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实现简单socket通信的方法
Apr 19 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
python实现扫描日志关键字的示例
Apr 28 Python
Python中一些不为人知的基础技巧总结
May 19 Python
PyCharm配置mongo插件的方法
Nov 30 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
详解Django3中直接添加Websockets方式
Feb 12 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
浅谈PHP中的
2016/04/23 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
tagName的使用,留一笔
2006/06/26 Javascript
jquery 插件 人性化的消息显示
2008/01/21 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
Python XML RPC服务器端和客户端实例
2014/11/22 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
python实现二维数组的对角线遍历
2019/03/02 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python 星号(*)的多种用途
2020/09/21 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
运动会广播稿30字
2014/01/21 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书