Problems with Images in Python's Tkinter - python

I have been trying to include images in my Tkinter widgets, but nothing seems to work. Here's my code:
from Tkinter import *
from PIL import Image
root = Tk()
image = Image.open('images/myimage.jpg')
root.image = image
b = Radiobutton(root, text='Image',image=image,value='I')
b.pack()
root.mainloop()
The error I get is:
Trac
eback (most recent call last):
File "C:/Users/.../loadimages.py", line 7, in <module>
b = Radiobutton(root, text='Image',image=image,value='I')
File "C:\Python27\lib\lib-tk\Tkinter.py", line 2714, in __init__
Widget.__init__(self, master, 'radiobutton', cnf, kw)
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1974, in __init__
(widgetName, self._w) + extra + self._options(cnf))
TclError: image "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=402x439 at 0x2A6B080>" doesn't exist
Most internet sources suggest keeping a reference to the image to avoid the garbage collector, but I don't see how I could do that more than what I have here. There are also suggestions regarding having multiple Tk instances, but I only have one.
To whoever helps, thanks in advance!

You need to convert the image you open using PIL into a PhotoImage:
from PIL import Image, ImageTk
image = Image.open("images/myimage.jpg")
photoimg = ImageTk.PhotoImage(image)
b = Radiobutton(root, image=photoimg)
See also: Photoimage API

Related

Python tkinter giving me an error when I try to set me logo (GUI WINDOW)

When I try to add an image and set it as my GUI window logo it gives me these errors
Traceback (most recent call last):
File "C:\Users\Meina Jia\PycharmProjects\guwindow\main.py", line 7, in <module>
icon = PhotoImage(file='logo.jpg')
File "C:\Users\Meina Jia\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 4093, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Users\Meina Jia\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 4038, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "logo.jpg"
Process finished with exit code 1
I already changed the file type using code.
from tkinter import *
window = Tk()
window.geometry("420x420")
window.title("Backrooms in A Nutshell")
icon = PhotoImage(file='logo.jpg')
window.iconphoto(True, icon)
window.mainloop()
For this, you will need the Pillow Library.
import tkinter as tk
from PIL import ImageTk, Image
window = tk.Tk()
window.geometry("420x420")
window.title("Backrooms in A Nutshell")
icon = ImageTk.PhotoImage(Image.open('logo.jpg'))
window.iconphoto(True, icon)
window.mainloop()
Note: It is good practice to import a library directly:
Run
import tkinter
instead of
from tkinter import *

Opening an image using ImageTk in Pillow causing an AttributeError and RuntimeError?

I am using Pillow 7.1.2 in Python 3.8.2. I have had problems opening images using the Image.open and ImageTk.PhotoImage methods to open images to use in Tkinter programs. This is the most simple way to import images I can think of which I have written into my scratch file and I am getting an AttributeError and a RuntimeError.
from PIL import Image, ImageTk
image = Image.open("0.gif")
photo = ImageTk.PhotoImage(image)
As far as all sources I can find go, this code should work, but it doesn't. Am I missing something incredibly obvious? The errors are as follows:
Traceback (most recent call last):
File "C:/Users/cassi/AppData/Roaming/JetBrains/PyCharmEdu2020.1/scratches/scratch.py", line 4, in <module>
photo = ImageTk.PhotoImage(image)
File "C:\Users\cassi\PycharmProjects\Temp\venv\lib\site-packages\PIL\ImageTk.py", line 112, in __init__
self.__photo = tkinter.PhotoImage(**kw)
File "C:\Program Files\Python38\lib\tkinter\__init__.py", line 4061, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Program Files\Python38\lib\tkinter\__init__.py", line 3994, in __init__
raise RuntimeError('Too early to create image')
RuntimeError: Too early to create image
Exception ignored in: <function PhotoImage.__del__ at 0x000001ADDF06B5E0>
Traceback (most recent call last):
File "C:\Users\cassi\PycharmProjects\Temp\venv\lib\site-packages\PIL\ImageTk.py", line 118, in __del__
name = self.__photo.name
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'
How would I fix this? Is there something wrong with my code, or is the problem something else? Thanks!
Like this:
from tkinter import *
from PIL import Image, ImageTk
canvas = Canvas(Tk(),width=200,height=200)
canvas.pack()
image = Image.open("0.gif") # Convert to PIL image
pimage = ImageTk.PhotoImage(image) # Convert to PhotoImage
canvas.create_image(100,100,image=pimage)
tkinter raises an error when you didn't create a window(tkinter.Tk Object) before creating an ImageTk.PhotoImage Object.
Try this code, its working:
from PIL import Image, ImageTk
import tkinter
#don't use "from tkinter import *" because tkinter also has an Image object and things will get mixed up
window = tkinter.Tk()
#Now you can create an Photo Image in PIL
img = Image.open("0.gif")
tkimg = ImageTk.PhotoImage(img)
label1 = tkinter.Label(window, image = tkimg)
label1.pack()
If that also does'nt work, maybe you just downloaded a e. '0.jpg' picture and renamed it to '0.gif'.
Here's the link for converting to .gif online or here's the PIL code:
from PIL import Image
img = Image.open("0.jpg")
img.save("0.gif", "gif") # Signature of function: Image().save(name, type)

Tkinter PhotoImage error "encountered an unsupported criticial chunk type "iDOT""

I am trying to show an image on screen with python and tkinter, but when I run it, it gives an error in the PhotoImage object.
This is my code:
from tkinter import *
root = Tk()
photo = PhotoImage(file="devil.png")
label = Label(root, image=photo)
label.pack()
root.mainloop()
The image file is in the same folder as the .py file.
And it gives this error:
Traceback (most recent call last):
File "C:/Users/MyUsername/PycharmProjects/GUI test/home.py", line 5, in <module>
photo = PhotoImage(file="devil.png")
File "C:\Users\MyUsername\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 3542, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Users\MyUsername\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 3498, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: encountered an unsupported criticial chunk type "iDOT"
Does anyone know how to fix this?
The chunk type of image you're using, 'iDOT', is not a registered PNG chunk. So, you should replace the image with an appropriate one.
This can help you understand what actually error is about

How to place a jpeg into tkinter (python3.4)?

I am trying to make a tkinter code that can generate a window with an image on it. This is the area that keeps giving me an error:
window=tk.Tk()
window.geometry('1100x900')
window.title('Hello World')
lab1= tk.Label(window, text='Input the desired delay time')
btn=tk.Button(window, text='Go to new window', bg='Blue', command=NewTab)
btn2=tk.Button(window, text='Leave', bg='Red', command=close)
imgset=ImageTk.PhotoImage(Image.open(imgpath))
img = tk.Label(window, image=imgset)
img.pack()
lab1.pack()
btn.pack()
btn2.pack()
window.mainloop()
where imagepath is a path to a picture in the my pictures folder
and this is the error I keep getting
Traceback (most recent call last):
File "C:\PythonScripts\trunk\Personal\PythonWindow_ForTiming.py", line 49, in <module>
img = tk.Label(window, image=imgset)
File "C:\Python34\lib\tkinter\__init__.py", line 2604, in __init__
Widget.__init__(self, master, 'label', cnf, kw)
File "C:\Python34\lib\tkinter\__init__.py", line 2122, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "pyimage1" doesn't exist
What am I doing incorrectly? Could you please include comments to help me understand, I am just learning about tkinter
Thanks in advance
You need to add 2 lines as following (I commented the lines in question)
imgset=Image.open(imgpath)
# Convert imgset to a Tkinter-compatible image object
photo = ImageTk.PhotoImage(imgset)
img = tk.Label(window, image=photo)
# Keep a reference to the image
img.image = photo
img.pack()
Elementary note: you may rename img to something that reflects the Label() instance better (to avoid an eventual confusion) such as label
You may be interested in reading The Tkinter PhotoImage Class

Odd bugs when image processing with Pillow (in tkinter)

I'm having a weird problem when trying to use Pillow to display images in tkinter.
I tried originally displaying images in the default tkinter way, which worked fine for gifs:
import tkinter as tk
root = tk.Tk()
src = tk.PhotoImage(file = "C:\\Users\\Matt\\Desktop\\K8pnR.gif")
label = tk.Label(root, image = src)
label.pack()
(K8pnR is just a random gif I found on imgur)
This works great but the only problem is I want to display other file types. This lead me to Pillow, as I am working in Python 3.4. I tried to start with displaying the same file, but using Pillow:
import tkinter as tk
from PIL import Image
root = tk.Tk()
src = Image.open("C:\\Users\\Matt\\Desktop\\K8pnR.gif")
img = tk.PhotoImage(file = src)
label = tk.Label(image = img, master = root)
label.pack()
This leads to a very weird and ugly no such file or directory error:
Traceback (most recent call last):
File "C:\Users\Matt\Desktop\pil test.py", line 7, in <module>
img = tk.PhotoImage(file = src)
File "C:\Python34\lib\tkinter\__init__.py", line 3416, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python34\lib\tkinter\__init__.py", line 3372, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't open "<PIL.GifImagePlugin.GifImageFile image mode=P size=494x260 at 0x26A6CD0>": no such file or directory
I tried different files, different filetypes, and even reinstalling Pillow, but I still get the error.
Does anyone know what's going on here? Did I miss something totally obvious?
Edit:
When I try the suggested fix, I get this spooky error:
Traceback (most recent call last):
File "C:\Users\Matt\Desktop\pil test.py", line 6, in <module>
img = ImageTk.PhotoImage(file = src)
File "C:\Python34\lib\site-packages\PIL\ImageTk.py", line 84, in __init__
image = Image.open(kw["file"])
File "C:\Python34\lib\site-packages\PIL\Image.py", line 2297, in open
prefix = fp.read(16)
File "C:\Python34\lib\site-packages\PIL\Image.py", line 632, in __getattr__
raise AttributeError(name)
AttributeError: read
The problem lies in this line:
img = tk.PhotoImage(file = src)
You are using stock PhotoImage from tkinter. It is not compatible with PIL you want to use ImageTk from PIL.
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
src = Image.open("C:\\Users\\Matt\\Desktop\\K8pnR.gif")
img = ImageTk.PhotoImage(file = src)
label = tk.Label(image = img, master = root)
label.pack()
Here is documentation of stock PhotoImage class: http://effbot.org/tkinterbook/photoimage.htm , it accepts only path in constructor.

Categories

Resources