[Help] Carregando imagem em um canvas no Tkinter

3,233 views
Skip to first unread message

Seiji Miyamoto

unread,
Nov 22, 2012, 1:48:09 PM11/22/12
to python...@googlegroups.com
Galera não estou conseguindo abrir imagem no canvas com Tkinter, meu código:
--------------------------------------------------------------------------------------------
from Tkinter import*
from PIL import Image, ImageTk
import tkMessageBox

#Criando uma janela
app = Tk()
app.title('GUI test')
app.geometry('700x700')

#Canvas para imagens
w = Canvas(app)
image = Image.open("C:/Python27/lena.bmp") # endereço da imagem
w.create_image((0,0), image = ImageTk.PhotoImage(image))
w.pack()

#faz com que o programa fique rodando até que alguém o feche
app.mainloop()
---------------------------------------------------------------------------------------------
o que me aparece é simplesmente uma janela em branco sem nada.
aproveitando, eu consigo por exemplo carregar uma imagem enorme, mostrar ela, sem que a janela tenha que cresçer junto? a imagem se redimensiona pra se adequar ao tamanho da janela?

Thiago Borges

unread,
Nov 22, 2012, 6:36:31 PM11/22/12
to python...@googlegroups.com
Tente renomear image para outra coisa tipo image_
Pode estar dando conflito com alguma variável que do Tk.

Outra possibilidade é testar "0, 0" no lugar da tupla:
w.create_image(0, 0, image = ImageTk.PhotoImage(image))

Por fim, tente colocar essa imagem em outro ponto tipo 50, 50.

Avise se funcionar e a solução final caso resolva.
Abraço,
Thiago Gabriel 


--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

Seiji Miyamoto

unread,
Nov 23, 2012, 5:40:00 AM11/23/12
to python...@googlegroups.com
Opa Thiago tudo bem?
então, eu tentei fazer as alterações que você sugeriu mas ainda assim não foi
substitui "image" por "img" e també tentei mudar a posição:

w.create_image(50,50, image = ImageTk.PhotoImage(img))

mas ainda assim não me aparece nada :(
não sei se tem alguma coisa relacionada, mas a imagem da lena  tem 512x512 pixels.

Willie

unread,
Nov 23, 2012, 9:13:43 AM11/23/12
to python...@googlegroups.com
Pelo que entendi você quer mostrar na tela a imagem: 'lena.bmp', nessa caso basta fazer:

from Tkinter import *
import ImageTk # não precisa importar o Image, a não ser q vc queira processar a imagem etc
app = Tk()
app.geometry("700x700")
app.title('GUI test')
w = Canvas(app)
_image = ImageTk.PhotoImage(file=r"C:\Python27\lena.bmp")
w.create_image(0, 0, image=_image, anchor=NW)
w.pack()
w.image = _image
app.mainloop()

Diz se funciona...

Seiji Miyamoto

unread,
Nov 24, 2012, 5:14:32 AM11/24/12
to python...@googlegroups.com
Uhuuu Bacana Willie!!! Funcionou!!!
Mas deixe me aproveitar e tirar outra duvida, tem como fazer com que a imagem dê um "resize" pra preencher o canvas de forma que ela apareça  inteira? no meu teste aqui a imagem apareceu, mas ficou cortada, só um pedaço dela ficou visível, a imagem em questão tem o tamanho de 512x512 (no meu projeto vou usar uma imagem de 2000x2000).
Outra duvida, como faço pra setar o tamamanho do canvas?
eu tentei:
w.geometry("512x512")

mas o python diz que o canvas não tem essa propriedade.
ps. na verdade vou precisar processar a imagem sim, mas na GUI eu só preciso exibi-la, no método eu estou usando numpy pra fazer a parte do processamento, mas isso o usuário não precisa saber ou ver :)
vlw pela ajuda galera

Vida longa e próspera. 

Seiji Miyamoto

unread,
Nov 25, 2012, 4:24:58 PM11/25/12
to python...@googlegroups.com
Galera consegui alterar o tamanho do canvas, mas ainda não consegui fazer o resize da imagem para caber inteira no canvas.
Fiz o seguinte:
na hora de criar o canvas alterei algumas propriedades:

canvasImg = Canvas(self.fr0, width = 512, height = 512)

mas por exemplo, se eu usar uma imagem maior que o canvas ela ainda fica cortada.

Aproveitando deixe me tirar outra duvida.

ao abrir uma imagem eu criei uma função onde ao clicar no botão "abrir imagem" ela carrega uma imagem pré selecionada

def carregaImagem():
     canvasImg.delete(1.0,END)
     _image = ImageTk.PhotoImage(file="C:/Python27/tps.bmp")
          
     canvasImg.create_image(0,0,image=_image)
            
     canvasImg.pack()
     canvasImg.image = _image
     return

minha pergunta é: tem como ao invés de ter que deixar sempre uma imagem pré selecionada nessa função, permitir que o próprio usuário a busque no sistema de arquivos?
tipo abrir uma janela de "abrir arquivo" e o próprio usuário acha a imagem no sistema.
enquanto isso vou pensando em algumas outras soluções.
Abraços, vida longa e próspera.

Dyesten Paulon Torres

unread,
Nov 26, 2012, 6:00:47 AM11/26/12
to python...@googlegroups.com
Bom dia Seiji,

tente o seguinte:

from Tkinter import filedialog
imgFoto = filedialog.askopenfilename(filetypes=[('all files', '.*'), ("Imagem de bitmap","*.bmp"), ("Imagem PNG", "*.png"),
                                                  ("Imagem GIF", "*.gif"), ("Imagem JPEG", "*.jpg")])




--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com



--

Atenciosamente,
Dyesten Paulon

Willie

unread,
Nov 26, 2012, 3:17:46 PM11/26/12
to python...@googlegroups.com
Tem uma maneira bem interessante de modificar o tamanho da janela:
após carregar a imagem você terá uma instancia de Tkinter.PhotoImage ou ImageTk.PhotoImage
O photoIMage do Tkinter tem dois métodos: wdg.width() e wdg.height() eles retornar o width e o height da imagem,
assim você altera o tamanho do canvas de acordo com esses valores:
ca = Canvas(root)
ca["width"] = imagem.width()
ca["height"] = imagem.height()
# tambem funcioma se você fizer:
ca.config(width=imagem.width(), height=imagem.height())

Sobre a coisa de redimencionar a imagem quando a janela mudar de tamanho você pode alterar o
tamanho da imagem usando os métodos: zoom e subsample das instancias de PhotoImage (não
disponíveis para os da ImageTk, embora vc possa modificar os códigos da lib).

O Tkinter é uma das GUIs com mais documentação que já vi.
VOcê pode achar muitas coisas interessantes com os livros:
Reference to Tkinter e Introduction to Tkinter, assim como o módulo C de uma série que ensina python...

Seiji Miyamoto

unread,
Nov 28, 2012, 5:09:34 AM11/28/12
to python...@googlegroups.com
Opa, valeu pelas dicas Dyesten e Willie, eu vou tentar aplicar essas soluções e assim que puder eu posto o resultado :)
Abraços!!!

Seiji Miyamoto

unread,
Nov 30, 2012, 3:58:53 PM11/30/12
to python...@googlegroups.com
Opa Dyesten, como vai?
eu tentei importar:

from Tkinter import filedialog

e me ocorreu o seguinte erro:

Traceback (most recent call last):
  File "C:\Python27\estudando python\TeA v0.2.py", line 3, in <module>
    from Tkinter import filedialog
ImportError: cannot import name filedialog

Estou fazendo da maneira correta?
Abraços.

Seiji Miyamoto

unread,
Nov 30, 2012, 4:01:44 PM11/30/12
to python...@googlegroups.com
Entendi Willie eu vou tentar, o problema é que minha imagem tem 2000x2000 pixels e nem cabe na tela :)
então vou tentar redimensionar essa imagem usando a PIL assim fica fácil por no canvas, eu só achei que talvez uma forma automática de se fazer isso ^^

Abraços!!!

Dyesten Paulon Torres

unread,
Nov 30, 2012, 6:49:51 PM11/30/12
to python...@googlegroups.com
Seiji,
peço desculpas, eu acabei usando esse metodo no Python 3.2, pensei também fosse possivel utilizar o mesmo no 2.7 dentro do Tkinter.

Porém dei uma olhada na internet e achei este link com um exemplo de filedialog, porém não testei:
http://fossies.org/dox/Python-2.7.3/FileDialog_8py_source.html

Você vai tentar salvar essa imagem no banco e tentar recupera-la depois direto do banco?




--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com



--

Atenciosamente,
Dyesten Paulon

Seiji Miyamoto

unread,
Dec 5, 2012, 1:27:33 PM12/5/12
to python...@googlegroups.com
Alô galera vim trazer pra vocês o resultado que consegui depois de todas as dicas!
no final acabei nem usando o filedialog Dyesten, seria um "tchan" a mais, mas tudo bem, cheguei a uma solução bastante agradável e foi graças a ajuda de todos vocês, que ao discutir o tema sempre estiveram me ajudando a ter novas ideias e tbm a utilizar melhor o potencial da linguagem.
Bom, vamos ao que interessa:
O que fiz foi simplesmente utilizar uma caixa de texto cujo o objetivo seria receber o endereço de onde a imagem está:

        nomeEnd = StringVar(None)
        valorEnd = Entry(self.fr01, textvariable = nomeEnd)
        valorEnd.pack(side = "top",padx=15, pady = 0)

e então na função de chamada da imagem eu passo o endereço como referência: 

def carregaImagem():
      
     canvasImg.delete(1.0,END)

     endereco = valorEnd.get() <- aqui
                    
     _image = ImageTk.PhotoImage(file= endereco) <- e depois aqui
                  
     canvasImg.create_image(0,0,image=_image)
                 
     canvasImg.pack()
     canvasImg.image = _image
     canvasImg.config(scrollregion=canvasImg.bbox(ALL))
     return

Com relação ao "resize", eu ainda não implementei, mas vou usar a PIL para ajustar a imagem de acordo com o tamanho do Canvas para que ela fique em um tamanho bom e aceitável.

É isso ai galera, obrigado pela ajuda!
Abraços!!!

Dyesten Paulon Torres

unread,
Dec 5, 2012, 1:42:48 PM12/5/12
to python...@googlegroups.com
bacana Seiji, vlw.
Reply all
Reply to author
Forward
0 new messages