Caminho de referência à imagem no Label tkinter

Estou treinando POO em um projeto pessoal que estou desenvolvendo em mostrar uma janela chamada por um botão em que mostre “amostras” de texto de um idioma, mostrando uma bandeira e um texto desse idioma. O problema é que o texto aparece, porém, a imagem que eu quero que apareça na janela não é mostrada, apesar do caminho estar correto em relação ao arquivo main.py. No PyCharm, quando você coloca o mouse encima de um caminho relativo à um arquivo que seja imagem corretamente ele mostra um pop-up com uma prévia da imagem. Não sei se devo fazer uma referência partindo da posição do arquivo ````main.pyoucomandos_botao_init_.py```. Ele está estruturado desta forma:

inserir a descrição da imagem aqui

Exemplos
main.py

from uteis.comandos_botao import *
from tkinter import *
import tkinter.ttk as ttk
from ttkthemes import ThemedStyle

root = Tk()

style_alt = ThemedStyle(root)
style_alt.set_theme('breeze')

botao = ttk.Button(root, text="Hindi", command=bt_hindi)
botao.grid(row=0, column=0)

root.mainloop()

uteis\__init__.py

from tkinter import *

from uteis.textos import *


class JanelaIdioma():
    def __init__(self, idioma, texto, bandeira):
        self.idioma = idioma
        self.texto = texto
        self.bandeira = bandeira

    def criar_janela(self):
        if self.idioma == "Hindi":
            self.texto = hindi

            root_hindi = Toplevel()

            bandeira = Label(root_hindi, image=self.bandeira)
            bandeira.grid(row=0, column=0)

            letreiro_hindi = Label(root_hindi, text=self.texto, font=("Arial", 36, "bold"))
            letreiro_hindi.grid(row=1, column=0)

comandos_botao\__init__.py

from uteis import *
from uteis.textos import *


def bt_hindi():
    bandeira_hindi = PhotoImage(file='img/india.png')
	janela = JanelaIdioma("hindi", hindi, bandeira_hindi).criar_janela()

textos\__init__.py

hindi = "ऐसा कोई नहीं है जो खुद दर्द को प्यार करता हो, जो ऐसा करने के पीछे हो और चाहता हो, बस क्योकि यह दर्द होता है..."

Sei que são muitos códigos e caso estiver confuso, o projeto inteiro está no GitHub por aqui.

Pelo que vejo, seu comandos_botao_ init _.py está dentro da pasta uteis, que está dentro da pasta principal do projeto.

O que eu faria em comandos_botao_ init _.py seria o seguinte (se atentando no import do Path e do caminho relativo “…/…/img/india.png”)

import tkinter as t
from pathlib import Path

path = Path(__file__).parent / "../../img/india.png"

root = t.Tk()
img = t.PhotoImage(file=path)
root.mainloop()
  • …/…/ volta duas pastas em relação ao diretório atual.
  • PhotoImage recebe como file o caminho utilizado em path "…/…/img/india.png"

@Martin_Hermes_Anscha Obrigado pela resposta.

Segui as suas sugestões porém a janela ainda aparece sem a imagem:

Testei seu código e note que agora aparece um espaço maior acima do texto (o que antes não acontecia).

A imagem está sendo referenciada sem erros. O problema é que ela não é renderizada. Deve ser algo do Tkinter, algum comando faltante, etc. Nisso não vou conseguir dar suporte.

Contudo, se servir de ajuda, para mostrar uma imagem usei isso aqui (pronto de um tópico de um fórum):

import tkinter as t
from pathlib import Path

path = Path(__file__).parent / "../../img/img.png"

root = t.Tk()
img = t.PhotoImage(file=path)
text = t.Text(root)
text.insert(t.END, "Olá, aqui está a imagem:\n")
text.image_create(t.INSERT, image=img)
text.insert(t.END, "  Obrigado!")
text.pack()
root.mainloop()

@Martin_Hermes_Anscha Obrigado pela resposta.

Consegui descobrir o problema. De alguma forma o nome img na classe HomePage no __init__.py fica no garbage collector e o Label não conseguia se lembrar dele, mostrando um fundo em branco de uma imagem que deveria estar ali. Então tive que salvar uma referência em uteis\__init__.py logo após a criação do Label da seguinte forma:

bandeira.image = self.bandeira

Isso solucionou o meu problema juntamente com a sua sugestão da biblioteca pathlib. Grato!

1 curtida