26 Feb Using GIF images in Python GUI scripts
Knocked My Socks Off!
My coworkers and I attended our first JAMF Nation conference this past October. The last session I attended on the first day knocked my socks off. Bryson Tyrrell of JAMF showed off an iPhone ordering script he wrote in Python and Tk. I’ve written some Tk, but it was a long time ago and I remember it being an uncomfortable experience. It seems a lot has changed. His script included an image that would dynamically change based on user interaction. It was so cool I knew I needed to make use of this technique as soon as I could.
The script I’m currently working on will be used to populate inventory data in our Casper management system, collating data from LDAP, MySQL and the JSS. Being able to include images takes the look-and-feel to another level. Showing the user what the appropriate asset tag looks like should increase the likelihood that the correct data will be input.
Encoding an Image
Here is a simple script that will properly encode a GIF image to be included in a script:
#!/usr/bin/python import base64 import sys def main(): filepath = sys.argv[1] print '*' * 10 + ' copy after this line ' + '*' * 10 print "variablename='''\\\n" + base64.encodestring(open(filepath, "rb").read( )) + "'''" print '*' * 10 + ' copy before this line ' + '*' * 10 if __name__ == '__main__': main()
The following image of Swoop is shown encoded below.
./image_encoder_simple.py ~/Desktop/swoop.gif ********** copy after this line ********** variablename='''\ R0lGODlh4QDhAPZCAAAAACUlJU1NTVNTU2lpaXV1dcAAAMAAB8AAC8AAEMEAE8EAFcEAGMIAHMIA HcIAIMIAIcMAJMMAJsMAKMMAKcQKLMQPLsUSMMciO8cjPMgrQso1Sss6TsxCVM5LXM5OXtBVZNJf bdNicNVsedVwetd0gNl8h4iIiJKSkqysrLi4uLq6utuFj96QmeCYoOGcpOSmreevtuext+u+w8rK ytLS0u3DyO7IzPHQ1PPY3PPZ3ODg4Pbg4/jn6frt7/zz9Pz19v77/P///wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5 BAAAAAAALAAAAADhAOEAAAf+gEKCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWm p6ipqqunPDYxMC0tMDI4P6y4ubqcPzYsGwzBwRISwgwdMrvKy8yHPzEfw8XBCNXDFxfFIM3c3as6 I8PBGSUwODw/6Tw3LNnYDCbe8vOfOiAMxQgdMD2MIxLYJMgYOMOGDnT0Eipk9GPEAWLweEDSYOGd OGr6SMDQsbCjQhvELCAY0S9SCYDYUqq8QGGahBAxbnmcuczFAQsSLOCglKHiyp8pcTI4AMIGzaOs XCBgqUGmJBgMgEpdSYFBhmRIs5K6ceCCBQuVbCDwObWsVwYadibq0QPHqxf+LUiMEEF3BAkXMGZI 1MpXUE8LDG5QerHUrGFsFBCwEKTjxgsWIDJME0aMWEsJl4VVMFGyL00dSytO6nHvsOl3gCnnPK0S < ... > AILnbeIwlGzED2QQ0QQ8YDDXPJoFEBACMTo0kTfIAD3TR4EGNGAEMajXDV4Angx0IyeDbEQNVKAC GuygBkLYAQ1G6sEYWKAB17RALhGQARDIcAY40EEOeHCDrYVgoNtDakUnQYMTDEAFKACAEAgQAKB+ UAYbqJNkUCoBlSagAWtV6S0byYAQXLUSNUCBEFAgABV7CGAAYs2hDqSUgC9ahRkaeIFIJ1GDEwjh BCoAQAoE0Ncj3sAEGkBAAzba0aONDgQvaF4xapACIaRgBwT4QQEie8YezIAFHxhqW1Way7Sq1SAZ GMEoUIvbjfiABzaQAQyK2YIXwCAGNriBZ3OL3OQqd7nMba5znwtdYQQCADs= ''' ********** copy before this line **********
Using your Image
Here is a simple Tk script that will display our encoded image:
#!/usr/bin/python from Tkinter import * import ttk def main(): # encoded image swoop = '''\ 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 ''' # setting up the Tk environment root = Tk() root.title("Swoop!") mainframe = ttk.Frame(root, padding=(12, 12, 12, 12)) mainframe.grid(column=0, row=0) root.columnconfigure(0, weight=1) root.rowconfigure(0, weight=1) mainframe.columnconfigure(1, weight=1) # define the image asset_label=ttk.Label(mainframe) asset_photoimage=PhotoImage(data=swoop) asset_label['image'] = asset_photoimage asset_label.grid(column=1, row=1) root.mainloop() if __name__ == '__main__': main()
Here’s what the running script looks like:
Other Options
I’m currently using TKinter/ttk as they are included in the stock Python install, but support is limited to GIF and PGM/PPM formats. However, there are a couple other options when it comes to displaying images in python. The Python Imaging Library (PIL) offered many more image formats, but development appears to have ceased. Pillow forked PIL and is under active development.
Bryson3Gps
Posted at 00:15h, 27 FebruaryGreat sample write-up! I’m glad you rolled the idea of the session to borrow the code and concepts to apply to your own solutions. I’ve been using Pillow for an internal Gravatar-like service I’ve been writing for us and it’s powerful library.
Todd McDaniel
Posted at 18:26h, 29 FebruaryThank you for your kind words, and your very inspiring presentation!