linux下python抓屏實現方法

來源:互聯網
上載者:User

linux下python抓屏實現方法

   本文執行個體講述了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程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.