How do I update pictures using Tkinter? - python

I've been having a problem with updating a picture in python using Tkinter. This program is creating a QR code and is displaying it on the window. I have no idea how to update it when it changes, the file name stays the same it just changes.
This is what activates the creation of a QR code
def GenerateQRCode():
# qr code maker 3000
qr = qrcode.QRCode()
qr.add_data("brush")
img = qrcode.make(input.get())
img.save("qrcode.png")
resize_image = img.resize((150, 150))
img2 = ImageTk.PhotoImage(img)
label1 = Label(root, image=img2)
label1.image = img2
label1.pack(pady=50)
It does the job of creating the QR code and dispalying it, however, like I said, no clue how to update it while the file name would stay the same. I could make qrcode1.png, then if new QR code is requested, check if it exists, if so, delete it and make qrcode2.png and display it, viceversa. But I'm sure there is a way how to do it with just one file and maybe even creating the file might be unnecessary. Any comment is welcome. Thank you.

You should create the label with the qr code once, and then update the label whenever you create the new qr code. Here's an example based off of your code:
import tkinter as tk
import qrcode
from PIL import ImageTk
def GenerateQRCode():
global qr_image
qr = qrcode.QRCode()
qr.add_data("brush")
img = qrcode.make(input.get())
img.save("qrcode.png")
resize_image = img.resize((150, 150))
qr_image = ImageTk.PhotoImage(img)
qr_label.configure(image=qr_image)
root = tk.Tk()
input = tk.Entry(root)
qr_image = tk.PhotoImage()
qr_label = tk.Label(root, image=qr_image, width=300, height=300)
button = tk.Button(root, text="Generate code", command=GenerateQRCode)
input.pack(side="top", fill="x")
qr_label.pack(side="top")
button.pack(side="bottom")
root.mainloop()

Related

How to make a file open by default with tkinter app?

I made a tkinter app for displaying images, and I was wondering if there's a way to make an image open by default with this app
At the moment if I try that, I get an error for some non declared icon file (this is the icon that appears near the name of the app at the top)
There's no real goal behin this Gui, I'm just experimenting and learning.
Thanks
Try this:
from PIL import Image, ImageTk
import tkinter as tk
from tkinter import filedialog
my_img = []
def FileImport():
file = filedialog.askopenfilename()
my_img.clear()
my_img.append(ImageTk.PhotoImage(Image.open(file)))
label1.config(image=my_img[0])
root= tk.Tk()
root.title('Main')
root.geometry('400x400')
label = tk.Label(root, text = "Browse", fg="purple")
label.pack()
button = tk.Button(root, text='See Image',fg="blue", command=FileImport)
button.pack()
my_img.append(ImageTk.PhotoImage(Image.open(your_first_image)))
label1 = tk.Label(root, image = my_img[0])
label1.pack(pady= 50)
root.mainloop()
When you run this:
After you tap to see different image from computer:
Hope It helps!

Tkinter paste image in textbox from clipboard

I am trying to paste get an image from clipboard and paste it into the textbox/label in tkinter. My code is below.
# page4 buttons and functions
f7 = Frame(page4)
f7.grid(row=0, column=0, sticky='NESW')
f8 = Frame(page4)
f8.grid(row=0, column=0, columnspan=2, sticky='NESW')
tb8 = Label(f7, width=82)
tb8.grid(row=0, column=0, sticky='NESW')
tb9 = Text(f7, width=30)
tb9.grid(row=0, column=1, sticky='NESW')
def imgps():
try:
image = root.selection_get(selection='CLIPBOARD')
img = ImageTk.PhotoImage(Image.open(image))
tb8.config(page4, image=img)
tb8.clipboard_clear()
except:
messagebox.showinfo(message="Clipboard is Empty.")
pbtn11 = Button(f8, text="IMAGE", activebackground="lavender",
activeforeground="RoyalBlue", bd="5", bg="aquamarine2",
command=imgps, fg="purple", font=('arial', 10, 'bold'))
pbtn11.grid(row=0, column=0, sticky='NESW')
Nothing appears on the area intended and neither any error is shown up. But, whence I close the application. the Messagebox turns up. Seems like weird coding. Can somebody help.
Here is a simple example of adding an image to the label.
Keep in mind you will need to make sure that a reference to the image is saved or else you will not see an image in your app.
Update:
I believe this updated answer should work for you. The code will try to grab the image from clipboard using the ImageGrab method in PIL if there is one and then it saves the image to a temp folder. We then load that image to the label and then delete the image from the temp folder.
import tkinter as tk
import os
from tkinter import messagebox
from PIL import ImageTk, ImageGrab
root = tk.Tk()
tb8 = tk.Label(root, width=82)
tb8.grid(row=0, column=0, sticky='nsew')
def imgps():
try:
temp_path = "./TempImage/some_image.gif" # Whatever temp path you want here
im = ImageGrab.grabclipboard() # Get image from clipboard
im.save(temp_path) # save image to temp folder
load_for_label = ImageTk.PhotoImage(file=temp_path) # load image from temp folder
tb8.config(image=load_for_label) # set image to label
tb8.image = load_for_label # save reference to image in memory
tb8.clipboard_clear() # clear clipboard
os.remove(temp_path) # delete temp file
except:
messagebox.showinfo(message="Clipboard is Empty.")
pbtn11 = tk.Button(root, text="IMAGE", command=imgps)
pbtn11.grid(row=1, column=0, sticky='nsew')
root.mainloop()
I did try several ways to load the image directly from the clipboard but I kept running into errors. So my above solutions might not be 100% the fastest way to implement this but should work well enough.

Setting Background image to GUI

I made a GUI with few buttons and I want to change the gray background to an image.
my code looks like this:
from tkinter import *
from urlread import givenumbers # my function
""" Setting The Main GUI """
GUI = Tk()
GUI.title('Check GUI')
GUI.iconbitmap('test.ico')
GUI.geometry("400x400")
background_image=PhotoImage('pic.jpg')
background_label = Label(GUI, image=background_image)
background_label.place(x=0, y=0, relwidth=1, relheight=1)
""" Reading Images For Buttons """
A_Im = PhotoImage(file='A.gif')
""" Creating Buttons """
# A Button
A_Button = Button(GUI, image=A_Im, command=givenumbers)
A_Button.grid(column=0, row=1)
GUI.mainloop()
The code runs without error but the background is still gray without any effect.
The problem is in the line background_image=PhotoImage('pic.jpg'). The PhotoImage class only supports GIF-files, which means that it cannot read the file you're specifying. You should try something like this:
#Python 2.7
import Tkinter as tk
from PIL import Image, ImageTk
window = tk.Tk()
image = Image.open('image.jpg')
photo_image = ImageTk.PhotoImage(image)
label = tk.Label(window, image = photo_image)
label.pack()
# Python 3
import tkinter as tk
from PIL import Image, ImageTk
window = tk.Tk()
image = Image.open('image.jpg')
photo_image = ImageTk.PhotoImage(image)
label = tk.Label(window, image = photo_image)
label.pack()
The Image class from the PIL module supports a variety of formats, among which jpeg and png. You can install the PIL module by running pip install pillow in a command prompt or terminal.
If you want to put the widgets on top of the Label, you could indeed using grid to get them on top of each other, but using a Canvas would probably be easier. You can find more about the Canvas widget here.
This can be done without pil also:
from tkinter import *
import tkinter as ttk
""" Setting The Main GUI """
GUI = Tk()
F1=Frame(GUI)
F1=Frame(GUI,width=400,height=450)
F1.place(height=7000, width=4000, x=100, y=100)
F1.config()
F1.grid(columnspan=10,rowspan=10)
F1.grid_rowconfigure(0,weight=1)
F1.grid_columnconfigure(0,weight=1)
photo=PhotoImage(file="C:\\Users\\HOME\\Desktop\\Eshita\\12th\\computer
\\python\\GUI\\math3.gif")
label = Label(GUI,image = photo)
label.image = photo # keep a reference!
label.grid(row=0,column=0,columnspan=20,rowspan=20)
b=ttk.Button(GUI,text="Start")
b.grid(row=8,column=8)
GUI.mainloop()

cannot associate image to tkinter label

I am trying to display an image to a tkinter GUI using tkinter.Label() widget. The procedure seems simple and straightforward, but this code doesn't work!
code:
import Tkinter as tk
import Image, ImageTk, sys
filename = 'AP_icon.gif'
im = Image.open(filename) # Image is loaded, because the im.show() works
tkim = ImageTk.PhotoImage(im)
root = tk.Tk()
label = tk.Label(root, image = tkim) # Here is the core problem (see text for explanation)
label.image = tkim # This is where we should keep the reference, right?
label.grid (row = 0, column = 0)
tk.Button(root, text = 'quit', command = lambda: sys.exit()).grid(row = 1, column = 1)
root.mainloop()
When we execute this code, it doesn't compile, giving an error:
TclError: image "pyimage9" doesn't exist
When I define label without its parent root, No compilation error occurs, but the GUI does not display any image!
Can anyone identify what could be the issue?
This problem happens when we attempt to run the above code in Ipython. And it can be solved by changing the line
root = tk.Tk() to
root = tk.Toplevel()
You need to create the root widget before you call any other tkinter functions. Move the creation of root to be before the creation of the image.
The general way which I use to display an image in tkinter is:
import Tkinter as tk
root = tk.Tk()
image1 = tk.PhotoImage(file = 'name of image.gif')
# If image is stored in the same place as the python code file,
# otherwise you can have the directory of the image file.
label = tk.Label(image = image1)
label.image = image1 # yes can keep a reference - good!
label.pack()
root.mainloop()
In the above case it works but you have something like:
import Tkinter as tk
image = tk.PhotoImage(file = 'DreamPizzas.gif') #here this is before root = tk.Tk()
root = tk.Tk()
# If image is stored in the same place as the python code file,
# otherwise you can have the directory of the image file.
label = tk.Label(image = image)
label.image = image
label.pack()
root.mainloop()
this gives me a runtime error: too early to create image.
but you have said that your error is image pyimage9 doesn't exist, this is strange because at the top you have set filename to 'AP_icon.gif', so you would think that you get a different error as I dont know where pyimage9 comes from. This makes me think that maybe you are getting the file name incorrect somewhere? You also need to move root = tk.Tk() to the top under imports.
Restart the Kernel to get rid of the error "TclError: image "pyimage9" doesn't exist"
Try the following code as I am able to rectify the same error:
window=Tk()
c=Canvas(window,height=2000,width=2000)
p=PhotoImage(file='flower1.gif',master = c)
c.create_image(500,500,image=p)

empty Tkinter window appears in place of image

I am trying to load images dynamically through browse button to Tkinter window but I am getting the empty window. This is the code of callback function of browse button
supformats = [
('Windows Bitmap','*.bmp'),
('Portable Network Graphics','*.png'),
('JPEG ','*.jpg'),
('CompuServer GIF','*.gif'),
]
filename = askopenfilename(filetypes=supformats)
FILENAME = filename
im=Image.open(FILENAME)
w=im.size[0]
h=im.size[1]
root = Tkinter.Tk()
#canvas = Tkinter.Canvas(root, width=w, height=h)
#canvas.grid(row=0,column=0)
#tk_img = ImageTk.PhotoImage(file = FILENAME)
#canvas.create_image(image=tk_img)
im.show()
root.mainloop()
Thanks in advance for everyone who will help
From effbot's explanation http://effbot.org/tkinterbook/photoimage.htm Note that the file is accessed once only, not twice. This assumes you are using the Python Imaging Library in Tkinter as you did not state what image toolkit is being used.
from PIL import Image, ImageTk
image = Image.open("lenna.jpg")
photo = ImageTk.PhotoImage(image)
You can use a PhotoImage instance everywhere Tkinter accepts an image object.
An example:
label = Label(image=photo)
label.image = photo # keep a reference!
label.pack()

Categories