# File: anilabel.py # This deviates from the original Tcl demo; an animated # GIF is used rather than a flat GIF whose characters # are manipulated. # Even with an animated GIF, you still must 'play' # the image; rotating through the animation frames. # # Source for rotating earth gif # http://www.animatedgif.net/earthglobe/earthglobe.shtml from tkinter import * from tkinter import ttk from demopanels import MsgPanel, SeeDismissPanel class AniLabelDemo(ttk.Frame): def __init__(self, isapp=True, name='anilabeldemo'): ttk.Frame.__init__(self, name=name) self.pack(expand=Y, fill=BOTH) self.master.title('Animated Label Demo') self.isapp = isapp self._create_widgets() def _create_widgets(self): if self.isapp: MsgPanel(self, ["Four animated labels are displayed below; each of the labels ", "on the left is animated by making the text message inside it ", "appear to scroll, and the label on the right is an animated ", "GIF, animated by changing the frame being dispalyed."]) SeeDismissPanel(self) self._create_demo_panel() def _create_demo_panel(self): demoPanel = Frame(self) demoPanel.pack(side=TOP, fill=BOTH, expand=Y) left = ttk.LabelFrame(demoPanel, text='Scrolling Text') right = ttk.LabelFrame(demoPanel, text='GIF Image') left.pack(side=LEFT, expand=True, padx=10, pady=10, fill=BOTH) right.pack(side=LEFT, expand=True, padx=10, pady=10, fill=BOTH) self._fill_panels(left, right) # start the text animations for w, txt, interval in self.__anilabels: self._animate_label_text(w, txt, interval) # start image animation self._animate_label_image(self.__lblImg, 150) def _fill_panels(self, left, right): # This method of scrolling text looks better with a fixed-width font lblA = ttk.Label(left, relief=RIDGE, font='fixedFont', width=15, padding=(0,5)) lblB = ttk.Label(left, relief=GROOVE, font='fixedFont', width=15, padding=(0,5)) lblC = ttk.Label(left, relief=FLAT, font='fixedFont', width=15) lblA.pack(side=TOP, expand=Y, padx=10, pady=10, anchor=W) lblB.pack(side=TOP, expand=Y, padx=10, pady=10, anchor=W) lblC.pack(side=TOP, expand=Y, padx=10, pady=10, anchor=W) # save the labels, their text and their animation intervals self.__anilabels = ((lblA, '* Slow Animation * ', 300), (lblB, '* Fast Animation * ', 80), (lblC, 'This is a longer scrolling text in a widget that will not show the whole message at once. ', 150)) # a label to hold the image in the right hand panel self.__lblImg = Label(right, bd=0) self.__lblImg.pack(side=TOP, expand=Y, padx=10, pady=10) def _animate_label_text(self, w, txt, interval): w.configure(text=txt) # Schedule the start of the animation loop self.after(interval, self._scroll_text, w, interval) def _scroll_text(self, w, interval): # the core animation routine, it continually re-calls # itself for each widget after the given time interval self.after(interval, self._scroll_text, w, interval) # do a marquee-like scroll by chopping a character off # the front of the label and adding it back on the end txt = w.cget('text') newTxt = txt[1:] + txt[0] w.configure(text=newTxt) def _animate_label_image(self, w, interval): img = PhotoImage(file='images//01_13_b_e0.gif') w.configure(image=img) w.image=img # Schedule the start of the animation loop w.frame = 0 self.after(interval, self._play_gif, w, interval) def _play_gif(self, w, interval): # animates the GIF by rotating through # the GIF animation frames try: opt = "GIF -index {}".format(w.frame) w.image.configure(format=opt) except TclError: w.frame = 0 self._play_gif(w, interval) return w.frame += 1 self.after(interval, self._play_gif, w, interval) if __name__ == '__main__': AniLabelDemo().mainloop()
Monday, August 27, 2012
Tkinter Animated Labels Demo
This code is based on the Tcl anilabel.tcl demo. It displays three labels with scrolling text and an animated GIF which is animated by rotating through it's animation frames.
Labels:
Tkinter Animation,
Tkinter Demos,
Tkinter Label