Resumo : neste tutorial, você aprenderá como usar o widget Tkinter PhotoImage para exibir uma imagem em outro widget.
Introdução ao widget Tkinter PhotoImage
No Tkinter, alguns widgets podem exibir uma imagem como Label
e Button
. Esses widgets recebem um image
argumento que lhes permite exibir uma imagem.
No entanto, você não pode simplesmente passar o caminho de um arquivo de imagem para o image
argumento. Em vez disso, você precisa criar um PhotoImage
objeto e passar o image
argumento para ele.
Para criar um novo PhotoImage
objeto, você usa a seguinte sintaxe:
photo_image = tk.PhotoImage(file=path_to_image)
Linguagem de código: Python ( python )
Nesta sintaxe, você passa o caminho da imagem para o file
argumento para criar um novo PhotoImage
objeto.
Alternativamente, você passa um bytes
objeto que contém dados de imagem para o data
argumento.
Após criar um PhotoImage
objeto, você pode utilizá-lo em outros widgets que aceitam um image
argumento:
label = ttk.Label(root, image=photo_image)
Linguagem de código: Python ( python )
É importante observar que você mantém a referência ao PhotoImage
objeto no escopo enquanto a imagem for mostrada. Caso contrário, a imagem não aparecerá.
O exemplo a seguir tenta exibir uma imagem com o caminho './assets/python.png'
na janela raiz:
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
super().__init__()
python_image = tk.PhotoImage(file='./assets/python.png')
ttk.Label(self, image=python_image).pack()
if __name__ == "__main__":
app = App()
app.mainloop()
Linguagem de código: Python ( python )
Se você executar o programa, notará que a janela não mostra a imagem.
Por que?
Isso porque o python_image
é destruído assim que __init__()
termina. Como o programa não tem referência ao PhotoImage
objeto, a imagem desaparece mesmo que você a tenha compactado no layout.
Para corrigir esse problema, você precisa ter certeza de que python_image
não sai do escopo após o __init__()
término do método. Por exemplo, você pode mantê-lo na instância da App
classe como self.python_image
:
import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Tkinter PhotoImage Demo')
self.geometry('320x150')
self.python_image = tk.PhotoImage(file='./assets/python.png')
ttk.Label(self, image=self.python_image).pack()
if __name__ == "__main__":
app = App()
app.mainloop()
Linguagem de código: Python ( python )
Formatos de arquivo Tkinter PhotoImage
Atualmente, o PhotoImage
widget suporta os formatos de arquivo GIF, PGM, PPM e PNG a partir do Tkinter 8.6.
Para oferecer suporte a outros formatos de arquivo, como JPG, JPEG ou BMP, você pode usar uma biblioteca de imagens como Pillow para convertê-los em um formato que o PhotoImage
widget entenda.
Na verdade, a biblioteca Pillow possui um widget compatível com Tkinter PhotoImage
localizado no PIL.ImageTk
módulo.
O seguinte pip command
instala a Pillow
biblioteca:
pip install Pillow
Linguagem de código: Python ( python )
Para usar a biblioteca Pillow, siga estas etapas:
Primeiro, importe as classes Image
e ImageTk
:
from PIL import Image, ImageTk
Linguagem de código: Python ( python )
Segundo, abra o arquivo de imagem e crie um novo PhotoImage
objeto:
image = Image.open('./assets/python.jpg')
python_image = ImageTk.PhotoImage(image)
Linguagem de código: Python ( python )
Terceiro, atribua o ImageTk.PhotoImage
objeto à opção de imagem:
image_label = ttk.Label(root, image=python_image)
Linguagem de código: Python ( python )
O programa a seguir ilustra como usar o PhotoImage
widget da biblioteca Pillow:
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Tkinter PhotoImage Demo')
self.image = Image.open('./assets/python.jpg')
self.python_image = ImageTk.PhotoImage(self.image)
ttk.Label(self, image=self.python_image).pack()
if __name__ == '__main__':
app = App()
app.mainloop()
Linguagem de código: Python ( python )
Resumo
- Use o widget Tkinter
PhotoImage
para exibir uma imagem para umLabel
ouButton
. - Tkinter
PhotoImage
suporta apenas os formatos de arquivo GIF, PGM, PPM e PNG. - Use o
PhotoImage
widget doPIL.ImageTk
módulo para oferecer suporte a outros formatos de arquivo.