-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgifplayer.py
117 lines (80 loc) · 3.04 KB
/
gifplayer.py
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
# Please Note: I did not write this file. The true credit belongs to Miguel Martinez Lopez.
from Tkinter import PhotoImage
from ttk import Label
from PIL import Image, ImageTk
class AnimatedGIF(Label, object):
def __init__(self, master, path, forever=True):
self._master = master
self._loc = 0
self._forever = forever
self._is_running = False
im = Image.open(path)
self._frames = []
i = 0
try:
while True:
photoframe = ImageTk.PhotoImage(im.copy().convert('RGBA'))
self._frames.append(photoframe)
i += 1
im.seek(i)
except EOFError: pass
self._last_index = len(self._frames) - 1
try:
self._delay = im.info['duration']
except:
self._delay = 100
self._callback_id = None
super(AnimatedGIF, self).__init__(master, image=self._frames[0])
def start_animation(self, frame=None):
if self._is_running: return
if frame is not None:
self._loc = 0
self.configure(image=self._frames[frame])
self._master.after(self._delay, self._animate_GIF)
self._is_running = True
def stop_animation(self):
if not self._is_running: return
if self._callback_id is not None:
self.after_cancel(self._callback_id)
self._callback_id = None
self._is_running = False
def _animate_GIF(self):
self._loc += 1
self.configure(image=self._frames[self._loc])
if self._loc == self._last_index:
if self._forever:
self._loc = 0
self._callback_id = self._master.after(self._delay, self._animate_GIF)
else:
self._callback_id = None
self._is_running = False
else:
self._callback_id = self._master.after(self._delay, self._animate_GIF)
def pack(self, start_animation=True, **kwargs):
if start_animation:
self.start_animation()
super(AnimatedGIF, self).pack(**kwargs)
def grid(self, start_animation=True, **kwargs):
if start_animation:
self.start_animation()
super(AnimatedGIF, self).grid(**kwargs)
def place(self, start_animation=True, **kwargs):
if start_animation:
self.start_animation()
super(AnimatedGIF, self).place(**kwargs)
def pack_forget(self, **kwargs):
self.stop_animation()
super(AnimatedGIF, self).pack_forget(**kwargs)
def grid_forget(self, **kwargs):
self.stop_animation()
super(AnimatedGIF, self).grid_forget(**kwargs)
def place_forget(self, **kwargs):
self.stop_animation()
super(AnimatedGIF, self).place_forget(**kwargs)
if __name__ == "__main__":
from Tkinter import Tk, Label
root = Tk()
# Add the path to a GIF to make the example working
l = AnimatedGIF(root, "/root/Downloads/hightech.gif")
l.pack()
root.mainloop()