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实现rest请求api示例
Apr 22 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
详解python 注释、变量、类型
Aug 10 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python如何将两个txt文件内容合并
Oct 18 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 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获取字符串的编码格式的方法(函数)
2013/06/21 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
浅谈Python中的字符串
2020/06/10 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
C# .NET面试题
2015/11/28 面试题
五四青年节优秀演讲稿范文
2014/05/28 职场文书
水利水电专业自荐信
2014/07/08 职场文书
学校安全管理责任书
2014/07/23 职场文书
读群众路线的心得体会
2014/09/03 职场文书
工伤事故证明
2014/10/20 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书