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 = '''\
R0lGODlh4QDhAPZCAAAAACUlJU1NTVNTU2lpaXV1dcAAAMAAB8AAC8AAEMEAE8EAFcEAGMIAHMIA
HcIAIMIAIcMAJMMAJsMAKMMAKcQKLMQPLsUSMMciO8cjPMgrQso1Sss6TsxCVM5LXM5OXtBVZNJf
bdNicNVsedVwetd0gNl8h4iIiJKSkqysrLi4uLq6utuFj96QmeCYoOGcpOSmreevtuext+u+w8rK
ytLS0u3DyO7IzPHQ1PPY3PPZ3ODg4Pbg4/jn6frt7/zz9Pz19v77/P///wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAAAAAAALAAAAADhAOEAAAf+gEKCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWm
p6ipqqunPDYxMC0tMDI4P6y4ubqcPzYsGwzBwRISwgwdMrvKy8yHPzEfw8XBCNXDFxfFIM3c3as6
I8PBGSUwODw/6Tw3LNnYDCbe8vOfOiAMxQgdMD2MIxLYJMgYOMOGDnT0Eipk9GPEAWLweEDSYOGd
OGr6SMDQsbCjQhvELCAY0S9SCYDYUqq8QGGahBAxbnmcuczFAQsSLOCglKHiyp8pcTI4AMIGzaOs
XCBgqUGmJBgMgEpdSYFBhmRIs5K6ceCCBQuVbCDwObWsVwYadibq0QPHqxf+LUiMEEF3BAkXMGZI
1MpXUE8LDG5QerHUrGFsFBCwEKTjxgsWIDJME0aMWEsJl4VVMFGyL00dSytO6nHvsOl3gCnnPK0S
8AHBnmfiiPo1Ug8SCFCyPkx2t1QKG2LLjnqBweJGM0Lg8828+UoLHYR3LFH43YcbTgf90AEjBILl
znkD/WrhcmXMvVdKaCE94QzAP6tK4AAiRIgOGYZRCM8aJ0RjF2wAAgkkmGBCCSN8gEEw6RUHQ3vz
jDDWVF9RYCF5/PnWAQgm0IJDD9klggNQDKgFYTM6LLhbgxmaRQEJlJCgW0oHhHiiLjIwwGKLPKZE
DFaO/BDNcxZkcCMzLVT+1+OSJMLYyA0tASVBPEfuUgJxTGb5E1qdORPOjgwAWSUr4WhpZnyBIQLV
jFt2OWYqV54pZ2sIiCnEDBroWJYFGLzJCgtYzjmnBQe8IMgNefrEAAYsSjCCn6rMoKSggxrXgZ6A
WWBDC4GmxMCDkLbSKaWCrlacBIYK0QGLDLgZqigbsEmqnIoywJ4gP+j5HAOvmvLCqLOeCdh62c0m
5Qe9ktIDsMFmCVgGoBYCg6zZUJlsKCZQ2yyPOCGwwQyJnERiDNeGsuy2ZgYzQg6LbMAqbOV6woK2
6DInlAUvuHrIfiTqG28lP7xQXL0tChUCvIyc+xNgNv47CQ8n6Upwc0L+aZBvJDwAW5vDltzwgQH0
TnxYMRaYYGIkxsZnJMeTzAAMvz+ZKrJU04iA8CQ3aLwyy4/IkN9XUhogwgdAz+xjMCHM0LAkMwBL
wc48L+IzpjFHJAQFO247DQgxcdL0eFBHfYgNwLA4bAsyzSuyUAyIIMPSl3wtldiI6BBNRenBF60g
zFIq1AUkgCtKyvHBzTILCMDcGj57CwJVs+UxgEAGLZwsSsZStUr3IDfg1CiqiLhLamoSgMBPKgpv
ye7miLOYmAlLgzboNBmwgF0hPcxQguGayKwSA4JH/QMwmW/AUSJqO1tVVCPI4GYPMphwwXevkUIR
iS6I/YNk4zGQ/SL+f3E7DQUiwLCXITocwADW76Qqyj9ShiA29/FJsLoiOvRt2lf5XBDCRo0o2jui
MwoXMEsCUUvec5rSiMeJJyjLk4AGTCCD8wmiBzEIniGUwy8KtMCCoCDcShAAwnhJTCUSYIG/CPED
ECiOQv6R3EtecDtC8CAGI8DAdwh4CBiMwIXFsdMgdOA+TAThhEHRALkc9gMDTIV2GwKBFEGwAclc
AxsCRMxkMhCCFtyghIMIgfpywr9FfE0CThJEDl6gHAYY4GaW+MALgxIVIfYqBCHzSkssdKEseiWG
kjtGh26wQmnNyAJvVEQPQnOBC8qQX+vZhAH3ZBUN9mpZWaOKeSb+M44NiMAFMfgQJUADkK9swHng
qwgD9kJGHwVHEzyYECU3YLlQzcCJZimSCEZQAhOwoAUZ/BDvIpGBEWCNTyKCjbjCJAgR6IoCIzDK
JnoyspEM80QxwGVZ0nQKiojkfD/AwQvuoQ9BxCAqjnKcBlYVxE64II8oZMASexUDWU6FAccrRbaK
s0RADaMiBnCkVxrJOXQ+ihM5e6KsGPABHyRLUlkjzylyxJKDOjAliRTCXxDQmXNZoAKdOGfm2JEb
9QAvWTnbUUVeYooedEU0QsgYWWp3vGXOUwjeJCEnPqAtfMZUBGMhi0isFaob2BMoCLBkKBhVnL0c
oAOlhJpIoUn+iH3KcxMJlcoBCIGDRP2Oh7ac1HMQqE+AMHMQ3lzlIBb5FajZwKCa+AH7FgYdQ7yT
Khko5Ik4tc0ihoKiaKzqfj5FiD9q7oJOhCkmNjBHT910EAo0bAcqF6oONBaLFCiFR8EyiK+RjxAn
AYyYqKlWSwzvskA7BAkeIjPyTMME+TzSIrfZOFBQk6NrpQ1ZBQHYNArBBIO14yN4QD+pJNUQPfil
CUaQJwYJsBinHBNfpVKkUsionWhV5fl6gJLd3gmulGhaJtvmiDV2IDe9AQwGlCodP/4Ojp4A7EEF
ASh+CuEGLSBaNkRAiM1SwgRibQ0FNCCJHrwgU4sz3o1+9cT+EigrNFBLaJEoExA33RaMisCBZDJZ
Hr0qIgYLSq9ibtQV6vKKFKTtB347UAEs9oawhbCqcJ1BnUyyhAIeZsS02GQVDGtln5ljbyeuO2EG
tQYiB0CWIeTriB0bRgIZ8HEkGjKpqgg5KznoWzpHIYMSuxcbH/BiInI1UEYgCokkUjJCLdSaA3xP
OKIbj3dDsSav/Ccg8z1E7tRWgVciwmNHpS4CiMqLIf3uOLF5Ab24OYofrFYCYT4HcU7cXxtI7zso
OUBsCTGD815WPRK4siYAvBLjCIcHJZYSoUWx6b9ozgczMEFzfQePQ8igbKZhAAiuiQnClNqvWonz
wgi6in3+li4DmBZg5HSUnR64AMEjEwgq6rmSjPalBdoSyaZPEYMS+27ZFPjf/YSAg3Cg+TcIIAGv
OcFgOuaYHnKj2a1WgTh+se0l5itEwPLkO0p2YNunqG9KKADWo0B0T35eBQ8+UI0LlA+MMnBmvymZ
AVGbAgQzgvFRxHKYw+LCBhi+QQnk05+oPBYUPcjBDQZiEDcFobUMWDczZmPj9nXjBib4Z8kvcPJO
/EAG/zCG0P9XEor6aNUJIfP+LCDzUPw86BM3SzE0MGNN9CDn+FDpND4ALp7+zqEeycCnpZRXVgQB
By3YQLJ9ow34doIFIAvId3RetQ1E1lYegd+KjNP0SvT+AL8eKEbUDZMaE0h5E+dwSjoa04IRpKZB
OCFSRySFRYjAk38IgMm7g/T3GEBGJHRnu1Vg0PfLvQAYeQSM25uRK2H4jwUziMFARzaOLtYCIYvo
gQ5wMINYlOADVtRPzcsyjRLUEkXK+XJAkM4Nz8tAB07BwVz78x/JfecCGcg+BjBQnKEI3TLD540E
EPCBqnNDB8QbDzINboDw84Y8FKhABWzsfhMzYAMu2HwzWJCAe+pfGTPQf0bjG/6BABZzeAoBAwFW
HNLUEVwxgLsxDfvwf/TQbqVWW/OQPzVXf8LSEuoiA2AHIRgXM8zXDbmygUI1KGO1dS4wbojwA+sw
AzP+UAsg0hGzpR55Rg+xkktFAgw6woErUh6TQT4vcHyFQEQhkB9CF0hclG/KMgNw0QIvEAMAdwh4
pB78pRDO1HESkQMtcCn4cEzOUSGCF0gaAAIsYA45xgMtMD3rgyFEUhUG+AKllzAtgAEGoBrCMAKr
JwjxhhhZSA8XtU128gOOUQKMtYT4QBmKGIYZwCEtIANfJAn2kHVBwT99hEV0BA91qGfhMHgsoQ9G
KARK5yOBKA+xVHMM4FuI4AM8oAMzKAMwMIu0SAsZdAM6wBaduFZABTNCkRsCUh+rMncvVAzANgl1
hlmWN30UcAAlOHt4lhDXsyfr5w3JmBoaYDv6EgT+axQNtLYBKyQLi7CFAbE+H8ACLgAXIDAsnrIB
DSNs1UIP02UWBuCCzFAa5cgCVahn7yQxLWGElyIBb1YIlyJ3B4MIOCACNxEQDESQisMAx7gMLuVi
mCEliNYMPZAf+VgJBuSLB9CA2kFG+DCQQrCDxfFvjMAD6ScBCecXL2ZxudBGQ5EBJCAurcFZ3NAD
kVccH4CAued1KYEAN0M4eiMIV4hI89YIpJYNOchjPqlwIOACejEIQKQSx5WTFVkcwNZ5LzCFNbQI
iGOVFqRoAUEeVhEn2AUJkzQ9DRhLRzYTIqUSFKBmzaABKMFopHh6c8dJ+8AIFjhghCACOYEBUIH+
KZBkfomQc4gxCHEZEHSpEEjkU9ygd5IpCISxGmToE6mBgYQwj6bGN19BQDAAbdjXJTjgAnMxArCn
CIyVDbdyhT4Skd4QWfvVDZR3AdUjCDyQJ3a2Ph1AFxwgeKrUAYUEm8XRD7M1JYQAA1WBRZzoM7lx
HsGQlDakW6TYKQiwj9zgA2KlU9wANBA5CLOxH8Wgj4aAAySwPtmAY2M2V4EFWLX1K8QheFhDDc4F
EAB3XWHyh9XVEemJhd3AV3M5RHqSbobjA6WBEytkdNPzW2Z1fD+Qc7oBHYTUFi+gkSIBR8kJAnr3
DtQ5D6njKfa4C6txAHvxA6uBADf1AzVoCEn+Uh4ElghMxU+rwjCJsHCyFFiE8AIv5XGDIEd+BBja
2QxANnAFpwwipaNCcIUnNQgSMg4qVAgM9pmH0G4WsAFY1JKHMAMDIxRi4llaOohJ5BGRCZOqIEdN
dShj4T1SihKp4Vfw46P9hSU+oaSLYALtdxYg0Bl8dVYEKiUfKg9iujGsFxo8BKRaKpilRmg5oZyI
MI2O9Qga1l0IEC1/FKMh2SDeqRCQ+g4XuQwJFZ5CMJFCWQgiFJR7Y0A4kQjX9Tv/B2B4w1D9MKWt
ljd9shCnWhwjqgt3VSKWOZimOngxpx1d4atVekhh4wg2ECUsATw+EBWiOggmeXQdUaR/lKz+ynBd
CCATeJRCQvBLOHRuNjcIqyKQahIo3joJQYCPgDECGcCUBJkeDACS9NBvkdQNLgQYg9ATJ2VFY5cN
dDkvdkoIjQkYo9hAC+kOLPGY8HicC5FVvzOkrOAu/SkEZ8ER+vOWgwAVA3qsQXGrljAiM0JwhRA+
KQGyCSFwQUFs3MBTMCVXgNEPqZZLlPZdJHsICpSul/ADBZmlLOQ7AzsPGdBiKMSKzIBH+ioIFysE
C0hXO4oZ23AIQImbT9kI/2lnHvCnKMSZOTkqfsoNaoNbOCVaY1tzFBC1gpAtFMB8E3qkl8CjPoIB
DiWmeDkPjekpFGgKj8NNItAS8UCbmXP+U/yKgfHWpJyQI0ADGDzgAS9UWglhTFuSgTqSrlAhGhNp
GJk1CG5pAGCkqF6BrZlAc5jlR8OqEH4UbvRAHiszkfMqBGs5FbkpCDJypXpWHa0LCjwwV5BXuvRw
gygUqMygNk2aryuDlgtTKNXpIIegd302CjqJWjhJDxDrKWaKC1n2FTFKc7UmBITxgxWyPpbkTdEr
ntWBAAdrdV9GqBW4UFXLCiMIY19SqbhyepH3AbU1gldZCLO3Zcoihouzi6ZAAnPEu6gYGoc1UHjH
QocQBEPCADkoCCMYEAAMCdxFuhNMCuzUGqALtj+4unpyDNopA1ECacurG6V6hOZWgpX+IFOlJrG7
ICVu6w12mQ2vxAPEkA26VkGEkAMu8DPFgbaEUCYeaggKuBoG4MIoMyl1a4Jixb8J0QPsI0H90EJ6
IoeJIwFjVBGJ8aHDoxuraAg8ShbG2gkzMLPRioqjcq+s8AMz0AJUlH3ZtwEhkIa2IFAsIQHSJAOn
kjepAQIlNAM3/A6nqJszm7Sf8LpnmxDTGxCyOQoJOUZkBH8eOBQY0DxcijcIIAIlYQMj4IbGsAEf
hD4MJ8YPLAQdqpXv48WNvAt/+A5cGwoICh52ZnmYMX1XdDQjkE9tcQM3kANBMDbeaJXAyyiKAsSb
wKLSam/mOw9impamkDNuunV38QL+LhAXIdBclhg0oFzHgvDLayUDMpLN/rF6sYITB2C0m/ACe4FJ
WLTBu0CWpVa9mtBlijIlQ4oDOJQfWTlWwXABv0kXkRFBvVEM6qYIOVBFInC+i7XJxIETDuYN8+gp
fdgJODAhQyUJPAADH5DFK4tFFWAZ0xcUWCwCSGwKs1ESiokNJwy2C6XQcYUpSwwJz9DJwRDSCjU5
UdoNxiQT1FRm3QC4YywEr3wJsLnMsBQ9areXiygM3wEClDUPP+AtaqQrCUykCwUvG7CrmJBVV4Vy
jSEDMfACMJBBuegRhKFkKnsAeSsKrfo7ggNgoXA9Hbs5hgAYD72/pZwL1voOydD+bY+JVYVRmXS9
nMHwIG+FRZuqDEAdA4sUtJqgqIk82IeQEz4VwY6NC4CLKu5yxsf8wfKcMDzAFkfyK1gTU6lWI0iS
bYAx1OFFGwQcXngUSFbBAu27ECgKGPxlk5ydCxYoJT2HCWpjAZhKCTeQH9MnFAegye1hVTPwrFg0
3Lpwt1uCmJMwgnM9Ca0jl8HQAWloEO0xW/oaAvySnaCqP1+7CUxFwpRQJngjEklzwfMgOhRgfPMJ
vKqQqyj025cwULQ7CRHNJ1rdHtOi0jjAVP29C75LIqw9Cfxds4+QP6W21kcB4V/xAUD22mts3qvM
E4ri0oXQmtQaKkGAQrB5u7v+UFwk+AmtqrOOYFQX2CsbQLS/tgwZLCWDrAnwXB6R4LkhHioRrB7y
k630UleeIDuuDAn9pliQ8uOtEcOqAM9yBgrXU0aOAOFbYt8nUuOtwbK5cNhTkdibcFGXvWTMEtOh
kAOelyAakBICYgJeJOGKkL4OjgtueU8TXQkSk7+KQJa76+GVgHZgiA8hQR6AZBUkQK+WgDlSEVDL
0LSuCQoXFbOMYEAURicbjjPZgg/zN2xyJjkj4OeJ0NsrkQDwjQlQ9UR/vQnCViS84wI9GVPZ/Tsf
AOfaMQOOh178MX4dgOiQAI0/kQAhqAvJs7uhkD4o5M7kVgi7ySZYXAIlzUL+gP4dNs0fgEFLyKg/
CMAMZ9Sp7wDqkdDbwNF0+BhPG/ACEpsDMsACgV40QPhkXyzToGjICI4PFCQravwJPJ4NZQcJ4744
wSDHJICOLEACIgACOvRPeEMpxMDrjxoy6nvi0eHlrQHdngDiASEB3j61QPHRtIweWx4sSMkQFk9d
WqrXyDkq3yQKP8ASlh4JMwyB4kFeidA58CQBN74Mvh4QWJ4JPcDyv3PzawFPMC/rNgJow7fby3DK
mqgsSMSSwb4IHDf0pmEhaPgY67gcR//ZqMCgbq0sPn80dw5ZGSv1In0eHCinzJDgRloKPvD1iL3g
Lkn2g4LsuoCmP0HepPD+Ay9PRyqcvHJ/JizeDc2cDcYsCqdeakDvomM/K54zJ0Ftgsxi1KWgHFsS
5IzQ02vDACWQKe1uGBVA97sgwONR8qFwtb9j+Rm2+IJywiCm+rtR1ZIbuKgQlqWGzhsk9HJy3qLe
IgZA6xdHLThR6o3wAgL4OzsfU44uKNuLO/+6G6i7EMYeP6mggOkRu4kg3vWi5ITA9Rki+Vp4WSw5
SMKfCLe0K09vCDmQ/GZCtpPd+VJS+PSg6J1eey5gA76fCDJQ/I7JCHYP8qD734DAYGFxUWh4iIho
wCPU6PgIGSk5SVlZ+cKQmDgoIcGAYCHygvNjaRopY4DIEGN5k6kZKzv+q8k6KWg42KNBSKspYXIq
PExM2UHhm0jhydDRclN8CVtoIVFauVGRvJ1cPfkicYgAzYPLfeEdrb5e2TN9Tl39+fGiw+5YEm4o
QWIp837IE4KBCBhI6HVoEIOFCw/GAjZp0L4Qjlro44Zgxr2NHG8ggPdw4QUWOO5tQGYIgb1KEg9l
etajUQ8cLS68o8BggwsbOHDYYKGBAUqXJSPZSHAoASNH6LgxGMEx6r0XH0HGqoZAQ4uY0X7cBGEJ
U64LMirBkICMgoiVkW5seGeBwiQRQylQfGRxm4QMUvuuY4GAAoWWVhMuFFGUGAxzFxAkluSulwW+
lnps8JTDUt5CECP+RTbUwAYkH4xnMeDqN/WwFh8+aJBw4ABDtITPSUDQQTSxDAgpfLBEQp8FBtAs
/cjAwEXYaQw0RgKXq4GkDxdlGdCtOntXHjhitBDxtiHCbTg/sDU1453KSjmqXqAA1lSPA3cphUA5
/BokXvv6PQeYSAIwaEcgRz/gAAMJNhk0Hi0UIMDCMLztI4IlxxjCwFKaSWBJU+h0IAkPoGCI3SOv
zIJACwWuKFUPMozgiUPJZHIeJf/kgoCGkqS3T4SnMNCOexL4CMlm6DTgA2QApqQii05KhYMJMfoy
CAIvnEKYBCVYMiE6DOhXiX+T2MCcc5BsIJkFGlCyZGNXPgmnVDb+iICAjLIMJyYlYmGImiSLYUhk
JTUWeRECfTYiYkDBTGInNQi0EmekUfVgUWm1xEfJD+5dwI8l75y2EZrUyPVcdQyUxeh4OBUnaasc
gdNoIhL8FmZ1BxwKiQvTSICpOu4YQgFUkVAnjo6P/KAKhhrg6mqz6rRgkGm9RlKOopYMhiGk6sTA
3ICQeJUQqZLkgBQ6CSzqbLr39ABCJg1imGckIJjKrCN/UsPAY8TwVwgDg+LwjgT1ofIAp8Spi/BG
/7yL4ZuSABzQwJKgI5kE9VZyIzUXSGIkpw5HMsIDCQibcMnr9PDeVY5RIqohB+gLScbUSABzJT/Y
KQHJjxCLYc3+jRiggc8mD30Kz4gMYoGNcG1gCQhDoWPAxzZ72K+ZjwD05SQzeEt019F4UF1AOp85
HgNcK5kIAxnAACYqgq0iyYnAguh13VIFcVksBrAKCZmGtd33phQv9EELMtyggw43yGCCTQ0OyXF1
Eihnd+UbfbbJxpNkoM1EluiaELDMfCJeLcx2iQ4CmVnOejQ89MBC2IY8EOgjNgh+qiUstOmU1IjC
RVnrwgszgwGyA2tAvUb3a+xzI1rFQIUcB1z78NZP4sHTh6j1wZaS6HAAIhSsaQkOODGsCSHDSfwI
1TYJfX38OSQra5OUmACQwKdAy0DnswxnNqVtj3zxK6Ak8hH+C6Vcq0EMQFclgiADD8ymExRkyAZg
EIRK8KtfZzOgB4XwA/RRgG6U8EjaqkeJIOQgBi5gwQhGYIIWwOAGF3PEnuLxwRw64naxaID9JiGl
EzrpVy7xnQ4LaIKCaQIBJZKEBrRnk7FlJ2+5SNoRj3iS9DFgdZPgQaxssoEabmR5jeHbFT3ogwcw
rBqDegQODPAuT3QwKj/oQNgaeMYrkit9w6nhDMqVtg3ArxjpCRsFmJbHK94AjumjWSViED5NlMeM
0bhBByxFgQwALpEeLN5VDDDHRywsJBJoAQ4yOAwd1CRaiNjLJjnpwduhb2SVwEEn7vSABsyKBTCw
QQ500IP+YPJAcTBoAQgAyLBmvBKWHrxBA6DIGQsI7QcfSAD6Zja6hQyEIQbBlvsGcQAUMlOHPciA
EjcxsmXC4JmFoYVCgjbOcYrAmiH54bdKYLx2bsITGdBWPJkZA126bx+lrFcPkshOfXoCBFb75zh9
AILnbeIwlGzED2QQ0QQ8YDDXPJoFEBACMTo0kTfIAD3TR4EGNGAEMajXDV4Angx0IyeDbEQNVKAC
GuygBkLYAQ1G6sEYWKAB17RALhGQARDIcAY40EEOeHCDrYVgoNtDakUnQYMTDEAFKACAEAgQAKB+
UAYbqJNkUCoBlSagAWtV6S0byYAQXLUSNUCBEFAgABV7CGAAYs2hDqSUgC9ahRkaeIFIJ1GDEwjh
BCoAQAoE0Ncj3sAEGkBAAzba0aONDgQvaF4xapACIaRgBwT4QQEie8YezIAFHxhqW1Way7Sq1SAZ
GMEoUIvbjfiABzaQAQyK2YIXwCAGNriBZ3OL3OQqd7nMba5znwtdYQQCADs=
'''
# 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!