本文实例讲述了linux下python抓屏实现方法。分享给大家供大家参考。具体实现代码如下:
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
|
#!/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程序设计有所帮助。