FotoTkinterImagem

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 Labele Button. Esses widgets recebem um imageargumento que lhes permite exibir uma imagem.

No entanto, você não pode simplesmente passar o caminho de um arquivo de imagem para o imageargumento. Em vez disso, você precisa criar um PhotoImageobjeto e passar o imageargumento para ele.

Para criar um novo PhotoImageobjeto, 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 fileargumento para criar um novo PhotoImageobjeto.

Alternativamente, você passa um bytesobjeto que contém dados de imagem para o dataargumento.

Após criar um PhotoImageobjeto, você pode utilizá-lo em outros widgets que aceitam um imageargumento:

label = ttk.Label(root, image=photo_image)Linguagem de código:  Python  ( python )

É importante observar que você mantém a referência ao PhotoImageobjeto 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 PhotoImageobjeto, a imagem desaparece mesmo que você a tenha compactado no layout.

Para corrigir esse problema, você precisa ter certeza de que python_imagenão sai do escopo após o __init__()término do método. Por exemplo, você pode mantê-lo na instância da Appclasse 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 PhotoImagewidget 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 PhotoImagewidget entenda.

Na verdade, a biblioteca Pillow possui um widget compatível com Tkinter PhotoImagelocalizado no PIL.ImageTkmódulo.

O seguinte pip commandinstala a Pillowbiblioteca:

pip install PillowLinguagem de código:  Python  ( python )

Para usar a biblioteca Pillow, siga estas etapas:

Primeiro, importe as classes Imagee ImageTk:

from PIL import Image, ImageTkLinguagem de código:  Python  ( python )

Segundo, abra o arquivo de imagem e crie um novo PhotoImageobjeto:

image = Image.open('./assets/python.jpg')
python_image = ImageTk.PhotoImage(image)Linguagem de código:  Python  ( python )

Terceiro, atribua o ImageTk.PhotoImageobjeto à 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 PhotoImagewidget 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 PhotoImagepara exibir uma imagem para um Labelou Button.
  • Tkinter PhotoImagesuporta apenas os formatos de arquivo GIF, PGM, PPM e PNG.
  • Use o PhotoImagewidget do PIL.ImageTkmódulo para oferecer suporte a outros formatos de arquivo.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *