linux下python抓屏小程序

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/python
'''
'''
  
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()