Embutindo imagens nos scripts Python para aplicações Tkinter
Arquivos gráficos geram uma dependência na aplicação cujo tratamento (de existência ou MD5) pode não valer a pena dependendo do tamanho da aplicação. O que fazer para evitar que o usuário exclua, renomeie, corrompa ou modifique um arquivo de imagem? Este artigo visa introduzir uma solução para este problema.
Parte 3: Organização de uma aplicação real e conclusão
"Sujar" o código com uma série de códigos malucos é uma péssima ideia. Uma boa ideia é encapsular todas as imagens num módulo único como "resource.py" cujo conteúdo poderia ser:
Uma outra ideia é utilizar um dicionário ou a persistência em Shelve :
Ou:
Além dessas técnicas é possível ainda carregar uma imagem direto da internet usando urllib . Com isso pode-se obter um nível desejado de segurança na consistência dos seus arquivos de imagem para que você tenha certeza que sua aplicação está rodando exatamente com os arquivos que você planejou.
### RESOURCE.py ###
GREEN_CHECK = "iVBORw0KGgoAAAANSUhEUgAAADcAAAA3CAYAAACo29JGAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29\
mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJsSURBVHja7JrrbYMwEIAvqAu4I7Qj0BHMCGQEGAF\
GgBGaEcIIZYRkBVZgBArSIbmubTAPc0Y56X7EhITP9wYuXdfBWSWAE8sl/D4Vz0DT9Fo+kg7eTgIVIxj\
rte21GiB9h2MIFQtrFVrPa8uJ1gK0WIpw4DPcXbLWs9fraDFfs2XY60Phhl8ymG9wMYKFwlqOFlOKL25\
Z9JpJa1Gvtekk6nAM44sLaw1a6zl1MmW4DwQLJbBIFV8+wQ1AP0KaHzNihCnf296SY+JYBUYRjqPFRKk\
x1be2P0YJLtGARb6PPAm2UqDoOrye53Rg0RJXpAQXK8DGOtau/fHg4ORxl9ZamzpGFS5UJA/YEuwoOB3\
YrJaKMtzYUjFpPReHTF/h7ggI0jxW7vFngWOwcOtaRgEuk6bnMTNe9/xTF3AxDpuypFtmxiPgPhRFGjD\
Gqr13NXAQZ0wRZ7mLWAgUY/0QHx2qKrvZ3PcIXceZbhLnip2O8QJtO4cY/t/QGd2xcQUXSLMU08SN7ph\
NnO1Wz0xwDLWZuOBsRZy1ruJMhmtxRz8ndjZTxNDc7zh1R11CyScAiwnrqo7Xrt3RVApyQ3fO4e8NUlF\
0jzFzOEh0de464XqqNa5xxyc1uMbgSlyKK12yaY9yxzkdSmm4j5FIVmOW5x8OZ9r5BIG4BDrH8iTgBrl\
NWK8wWB2ow7WG7r3Q1LQGN4U83BIrkLDaXLjGYvYiYzWbee628fdIwdUze0Mv4eZc+O3ourYWznTxFRA\
TGzhTWUhh4rUJ6nAq6wyf36nF2lK4WnDNFDZ6jraXLHlVo0TIJxCXy+sd5xccPfkVYADDOZXimxZ6tAA\
AAABJRU5ErkJggg=="
LOGO = "..."
SPLASH_SCREEN = "..."
GREEN_CHECK = "iVBORw0KGgoAAAANSUhEUgAAADcAAAA3CAYAAACo29JGAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29\
mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJsSURBVHja7JrrbYMwEIAvqAu4I7Qj0BHMCGQEGAF\
GgBGaEcIIZYRkBVZgBArSIbmubTAPc0Y56X7EhITP9wYuXdfBWSWAE8sl/D4Vz0DT9Fo+kg7eTgIVIxj\
rte21GiB9h2MIFQtrFVrPa8uJ1gK0WIpw4DPcXbLWs9fraDFfs2XY60Phhl8ymG9wMYKFwlqOFlOKL25\
Z9JpJa1Gvtekk6nAM44sLaw1a6zl1MmW4DwQLJbBIFV8+wQ1AP0KaHzNihCnf296SY+JYBUYRjqPFRKk\
x1be2P0YJLtGARb6PPAm2UqDoOrye53Rg0RJXpAQXK8DGOtau/fHg4ORxl9ZamzpGFS5UJA/YEuwoOB3\
YrJaKMtzYUjFpPReHTF/h7ggI0jxW7vFngWOwcOtaRgEuk6bnMTNe9/xTF3AxDpuypFtmxiPgPhRFGjD\
Gqr13NXAQZ0wRZ7mLWAgUY/0QHx2qKrvZ3PcIXceZbhLnip2O8QJtO4cY/t/QGd2xcQUXSLMU08SN7ph\
NnO1Wz0xwDLWZuOBsRZy1ruJMhmtxRz8ndjZTxNDc7zh1R11CyScAiwnrqo7Xrt3RVApyQ3fO4e8NUlF\
0jzFzOEh0de464XqqNa5xxyc1uMbgSlyKK12yaY9yxzkdSmm4j5FIVmOW5x8OZ9r5BIG4BDrH8iTgBrl\
NWK8wWB2ow7WG7r3Q1LQGN4U83BIrkLDaXLjGYvYiYzWbee628fdIwdUze0Mv4eZc+O3ourYWznTxFRA\
TGzhTWUhh4rUJ6nAq6wyf36nF2lK4WnDNFDZ6jraXLHlVo0TIJxCXy+sd5xccPfkVYADDOZXimxZ6tAA\
AAABJRU5ErkJggg=="
LOGO = "..."
SPLASH_SCREEN = "..."
Uma outra ideia é utilizar um dicionário ou a persistência em Shelve :
IMAGENS = {
"logo" ; "...",
}
"logo" ; "...",
}
Ou:
import shelve
resource = shelve.open("./resource")
resource["LOGO"] = "..." # escrevendo
LOGO = resource["LOGO"] # lendo
resource.close()
resource = shelve.open("./resource")
resource["LOGO"] = "..." # escrevendo
LOGO = resource["LOGO"] # lendo
resource.close()
Além dessas técnicas é possível ainda carregar uma imagem direto da internet usando urllib . Com isso pode-se obter um nível desejado de segurança na consistência dos seus arquivos de imagem para que você tenha certeza que sua aplicação está rodando exatamente com os arquivos que você planejou.