Hope you are all okay. I'm working in my firts app built with tkinter in OOP. My assignment is to creaty a GUI for a supermarket. One of the windows I need to build is one that show information about a product in the stock. Including an image of the product. The way I have been working on it is to having the images of my products named with the ID number of each product. But there is a bug i can´t solve, someway the code does not reconogize the instruccion to put the image I ask in the window created with the rest of information. This is the code I´m working in. Any help or answer you could give will help me a lot. Is my first project and I haven´t sleep very well.
Sorry for programming in spanish, btw.
from tkinter import *
from tkinter import ttk
from database import productos
from PIL import Image, ImageTk
class Verproducto:
def __init__(self):
self.verproducto=Toplevel()
self.verproducto.title("Ver información del producto")
self.IDaconsultar=IntVar()
self.nombreimagen=StringVar()
self.producto = None
self.mensa=StringVar()
self.solicitudid=ttk.Label(self.verproducto, text="Ingrese el ID del producto a consultar").pack()
self.IDentry=ttk.Entry(self.verproducto, textvariable=self.IDaconsultar).pack()
self.mensaset=ttk.Label(self.verproducto, textvariable=self.mensa).pack()
self.botón=ttk.Button(self.verproducto, text="Consultar", command=self.comando).pack()
self.salir=ttk.Button(self.verproducto, text="Salir", command=self.verproducto.destroy).pack()
self.verproducto.grab_set()
def ver_informacion_producto(self):
print(True)
id=self.IDaconsultar.get()
for i in productos:
#print(i, id)
if id == i[-4]:
print(True)
self.producto = i
#self.mostrar_producto()
print(self.producto)
print(self.producto[-4])
else:
self.mensa.set("Producto no encontrado")
def mostrar_producto(self, img):
self.vistaproducto=Toplevel()
self.nombrepro=StringVar(value=self.producto[-3])
self.marcapro=StringVar(value=self.producto[-5])
self.preciopro=IntVar(value=self.producto[-2])
self.stockpro=IntVar(value=self.producto[-1])
self.vistaproducto.title(f"Producto {self.producto[-4]}")
self.nombre=ttk.Label(self.vistaproducto, text="Nombre").pack()
self.nombreshow=ttk.Label(self.vistaproducto, textvariable=self.nombrepro).pack()
self.marca=ttk.Label(self.vistaproducto, text="Marca").pack()
self.marcashow=ttk.Label(self.vistaproducto, textvariable=self.marcapro).pack()
self.precio=ttk.Label(self.vistaproducto, text="Precio").pack()
self.precioshow=ttk.Label(self.vistaproducto, textvariable=self.preciopro).pack()
self.stock=ttk.Label(self.vistaproducto, text="Stock").pack()
self.stockshow=ttk.Label(self.vistaproducto, textvariable=self.stockpro).pack()
self.foto=ttk.Label(self.vistaproducto, image=img).pack()
self.cerrar=ttk.Button(self.vistaproducto, text="Salir", command=self.vistaproducto.destroy).pack()
def imagenproducto(self):
print(self.producto)
imagen=self.producto[-4]
self.nombreimagen.set(imagen)
print(self.nombreimagen.get())
image = Image.open(f"C:\\Users\\LENOVO\\Desktop\\Python\\Pruebas TKinter\\Parcial2\\test_breigner\\img\\{self.nombreimagen.get()}.jpg")
resize_image = image.resize((200, 200))
img = ImageTk.PhotoImage(resize_image)
return img
# self.label1 = Label(image=img)
# self.label1.image = img
#self.label1.pack()
def comando(self):
self.ver_informacion_producto()
x = self.imagenproducto()
#print(x)
self.mostrar_producto(x)
Related
I'm having trouble decoding an image when I import it from another file.
I have four .py files to make two buttons.
In the first, on line 21, the button works and brings the image, in the second, on line 28, which is imported from another file, it appears as a button but without an image. How can I resolve this?
lab.py
import tkinter as tk
import base64
from imagens import *
from cores import *
from widgets import *
class Janela(Images):
def __init__(self) -> None:
self.images_base64()
self.tamJanela()
def tamJanela(self):
self.janela_doMenu = tk.Tk()
janela = self.janela_doMenu
# janela.state('zoomed')
janela.title('Disk Gás Gonçalves')
janela.configure(background=preto_claro)
janela.geometry("%dx%d" % (janela.winfo_screenwidth(), janela.winfo_screenheight()))
# Here the code works ###############################################################
self.img_icoName = tk.PhotoImage(data=base64.b64decode(self.editUser))
self.rotulo_nome2 = tk.Button(master=janela, image=self.img_icoName, activebackground='#00FA9A', bg='#4F4F4F',
highlightbackground='#4F4F4F', highlightcolor='#4F4F4F')
self.rotulo_nome2.grid(row=0, column=0)
# Here the code does not work #######################################################
# I'm importing from widgets.py #####################################################
Botoes(janela)
janela.minsize(1200, 640)
janela.mainloop()
Janela()
widgets.py
import tkinter as tk
import base64
from imagens import *
from cores import *
class Botoes(Images):
def __init__(self, local) -> None:
self.images_base64()
self.local = local
self.bt()
def bt(self):
self.img_icoName = tk.PhotoImage(data=base64.b64decode(self.editUser))
self.rotulo_nome2 = tk.Button(master=self.local, image=self.img_icoName, activebackground='#00FA9A', bg='#4F4F4F',
highlightbackground='#4F4F4F', highlightcolor='#4F4F4F')
self.rotulo_nome2.grid(row=1, column=0)
cores.py
preto_claro = '#4F4F4F'
verde_médio = '#00FA9A'
vermelho_salmão = '#FA8072'
azul_seleção = '#F0FFFF'
verde_limão = '#00FF00'
branco_gelo = '#EDEBE6'
imagens.py
import base64
class Images:
def images_base64(self):
self.addUser = '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'
self.editUser = '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'
I tried to create a button by importing the base64 image from another file.
There are two buttons in the application, one works and the image appears, the other does not work and the image does not appear. I would like to make the second one work.
All the code will generate this image. The bottom button that doesn't show the image is in the widgets.py file
I don't know why, but when I import it, it doesn't work.
Thank you in advance for your attention and I apologize if something was wrong or out of standard, my English is not very good.
It is because there is no variable referencing the instance of Botoes(), so it will be garbage collected (so as the image inside it).
Just use a variable to store the instance of Botoes():
class Janela(Images):
def __init__(self) -> None:
self.images_base64()
self.tamJanela()
def tamJanela(self):
self.janela_doMenu = tk.Tk()
janela = self.janela_doMenu
# janela.state('zoomed')
janela.title('Disk Gás Gonçalves')
janela.configure(background=preto_claro)
janela.geometry("%dx%d" % (janela.winfo_screenwidth(), janela.winfo_screenheight()))
# Here the code works ###############################################################
self.img_icoName = tk.PhotoImage(data=base64.b64decode(self.editUser))
self.rotulo_nome2 = tk.Button(master=janela, image=self.img_icoName, activebackground='#00FA9A', bg='#4F4F4F',
highlightbackground='#4F4F4F', highlightcolor='#4F4F4F')
self.rotulo_nome2.grid(row=0, column=0)
# need a variable to store the instance of Botoes
# to avoid garbage collection
botoes = Botoes(janela)
janela.minsize(1200, 640)
janela.mainloop()
Result:
I am write the code to recognition the face and mark attendence but so Error come and when i run the project the camere are open but not recogition the face the give face are stick on the camera screen.
and the following error is are has follw:
File "g:\Attendence System\face_recognition.py", line 93, in face_recog
img=recognize(img,clf,faceCascade)
File "g:\Attendence System\face_recognition.py", line 82, in recognize
coord = draw_boundray(img,faceCascade,1.1,10,(255,255,255),"Face",clf)
File "g:\Attendence System\face_recognition.py", line 59, in draw_boundray
name="+".join(name)
TypeError: can only join an iterable
and some varible i declare but It's not access the given error is ret is not accessed pylance
plz help with this problem.
from tkinter import*
from tkinter import ttk
from PIL import Image,ImageTk
from tkinter import messagebox
import mysql.connector
import cv2
import os
import numpy as np
class Face_Recognition:
def __init__(self,root):
self.root=root
self.root.geometry("1530x790+0+0")
self.root.title("Face Recognition System")
lbl_title=Label(self.root,text="FACE RECOGNITION",font=("time new roman",35,"bold"),bg="white",fg="green")
lbl_title.place(x=0,y=0,width=1530,height=45)
#1st image
img_top=Image.open(r"Images\workingonface.jpg")
img_top=img_top.resize((650,700),Image.ANTIALIAS)
self.photoimg_top=ImageTk.PhotoImage(img_top)
f_lbl=Label(self.root,image=self.photoimg_top)
f_lbl.place(x=0,y=55,width=650,height=700)
#2st image
img_bottom=Image.open(r"Images\facial_recognition_system_identi.jpg")
img_bottom=img_bottom.resize((950,700),Image.ANTIALIAS)
self.photoimg_bottom=ImageTk.PhotoImage(img_bottom)
f_lbl=Label(self.root,image=self.photoimg_bottom)
f_lbl.place(x=650,y=55,width=950,height=700)
#buttom
b1_1=Button(f_lbl,text="Face Recognition",cursor="hand2",command=self.face_recog,font=("time new roman",18,"bold"),bg="darkgreen",fg="white")
b1_1.place(x=365,y=620,width=210,height=40)
#==================Face recognition=============
def face_recog(self):
def draw_boundray(img,classifier,scaleFactor,minNeighbors,color,text,clf):
gray_image = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
features = classifier.detectMultiScale(gray_image,scaleFactor,minNeighbors)
coord=[]
for(x,y,w,h) in features:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)
id,predict=clf.predict(gray_image[y:y+h,x:x+w])
confidence=int((100*(1-predict/300)))
con = mysql.connector.connect(host='localhost',username='root',password='',database='face_recognition')
my_courser=con.cursor()
my_courser.execute("select Name from students where StudentID="+str(id))
name=my_courser.fetchone()
name="+".join(name)
my_courser.execute("select Roll from students where StudentID="+str(id))
r=my_courser.fetchone()
r="+".join(r)
my_courser.execute("select Dep from students where StudentID="+str(id))
d=my_courser.fetchone()
d="+".join(d)
if confidence>77:
cv2.putText(img,f"Roll No:{r}",(x,y-55),cv2.FONT_HERSHEY_COMPLEX,0.8,(255,255,255),3)
cv2.putText(img,f"Name:{name}",(x,y-30),cv2.FONT_HERSHEY_COMPLEX,0.8,(255,255,255),3)
cv2.putText(img,f"Department:{d}",(x,y-5),cv2.FONT_HERSHEY_COMPLEX,0.8,(255,255,255),3)
else:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),3)
cv2.putText(img,"Unknown face",(x,y-5),cv2.FONT_HERSHEY_COMPLEX,0.8,(255,255,255),3)
coord=[x,y,w,y]
return coord
def recognize(img,clf,faceCascade):
coord = draw_boundray(img,faceCascade,1.1,10,(255,255,255),"Face",clf)
return img
faceCascade=cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
clf=cv2.face.LBPHFaceRecognizer.create()
clf.read("classifier.xml")
video_cap=cv2.VideoCapture(0)
while True:
ret,img=video_cap.read()
img=recognize(img,clf,faceCascade)
cv2.imshow("Welcome To Face Recognition",img)
if cv2.waitKey(1)==13:
break
video_cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
root = Tk()
obj=Face_Recognition(root)
root.mainloop()
I guess your issue definitely is not a face recognition one:
name=my_courser.fetchone()
name="+".join(name)
Your error means that name is not iterable as it shoud be if my_courser.fetchone() returns something but None.
You may try:
name=my_courser.fetchone()
if name:
name="+".join(name)
And do the same at the next similar blocks ahead.
I would like to make a window construction for a photo previewer. I am stuck. My code doesn't work.
I made a frame hierarchy shown below.
I would like to show thumbnails in the thumbnail frame.
# TODO 0: IMPORT REQUIRED LIBRARIES AND MODULES
from tkinter import *
from PIL import Image, ImageTk
# TODO 1: CREATE A CLASS
class EditScreen:
def __init__(self, file_directory_list):
self.edit_window_init()
self.file_directory_list = file_directory_list
self.display_selected_images()
self.edit_window.mainloop()
# TODO 2: CREATE A NEW EDIT SCREEN
def edit_window_init(self):
self.edit_window = Toplevel()
self.edit_window.title("Edit")
self.edit_window.geometry('1200x800')
self.background_color = "#F8F1F1"
self.my_font_color = "#0A065D"
self.my_font = 'Poppins'
# TODO 3: DISPLAY SELECTED IMAGES IN THIS SCREEN
def display_selected_images(self):
thumbnail_frame = Frame(self.edit_window, height=1200, width=300)
thumbnail_frame.pack(side='left')
thumbnail_frame_canvas= Canvas(master=thumbnail_frame)
thumbnail_frame_canvas.place(x=0,y=0)
# TODO 3.1: PUT ALL SELECTED IMAGES THUMBNAIL TO LEFT HAND SIDE OF THE EDIT SCREEN
for selected_image_directory in self.file_directory_list:
print(self.file_directory_list.index(selected_image_directory))
selected_image = ImageTk.PhotoImage(file=selected_image_directory)
selected_image_location = thumbnail_frame_canvas.create_image((30,30),image=selected_image)
selected_image_location.pack()
#.grid(row=self.file_directory_list.index(selected_image_directory),column=0)
Consider these lines of code:
selected_image_location = thumbnail_frame_canvas.create_image((30,30),image=selected_image)
selected_image_location.pack()
create_image is documented to return an integer, which is an internal id of the canvas object that was created. You then try to call pack on that integer, but integers don't have a pack method. You need to remove the call to pack
Another problem was mentioned in a comment to your question: you're not saving a reference to the image, so it's going to get destroyed by python's garbage collector.
You can save a reference by using a global list, and appending the images to that list:
def display_selected_images(self):
global selected_images
...
selected_images = []
for selected_image_directory in self.file_directory_list:
...
selected_image = ImageTk.PhotoImage(file=selected_image_directory)
selected_images.append(selected_image)
...
I want to make a QR code with python. The output is a white background with a black qr code. How do I change both of them?
from tkinter import *
import os
import pyqrcode
window = Tk()
window.geometry("550x350")
window.configure(bg="#0434a0")
window.title("QR Code Maker")
photo = PhotoImage(file = "logo.png")
window.iconphoto(False, photo)
def generate():
if len(Subject.get())!=0 :
global qr,photo
qr = pyqrcode.create(Subject.get())
photo = BitmapImage(data = qr.xbm(scale=8))
else:
messagebox.showinfo("Voer een URL in...")
try:
showcode()
except:
pass
def showcode():
imageLabel.config(image = photo)
subLabel.config(text="QR van " + Subject.get())
The documentation of this module can be found here: PyQRCode Module Documentation
It says that the various methods of this module (e.g. png, if you want to get the QR code as a png image) take a background parameter that lets you define the background color, as well as a module_color parameter for the code itself.
pyqrcode module has not been updated for over 5 years. Use qrcode module instead. Note that qrcode module requires Pillow module.
...
from PIL import ImageTk
import qrcode
...
def generate():
try:
subject = Subject.get().strip()
if len(subject) != 0:
# adjust border and box_size to suit your case
qr = qrcode.QRCode(border=2, box_size=10)
qr.add_data(subject)
# change fill_color and back_color to whatever you want
img = qr.make_image(fill_color='blue', back_color='cyan')
photo = ImageTk.PhotoImage(img)
showcode(subject, photo)
else:
messagebox.showinfo("Voer een URL in...")
except Exception as ex:
print(ex)
def showcode(subject, photo):
imageLabel.config(image=photo)
imageLabel.image = photo # keep a reference of the image to avoid garbage collection
subLabel.config(text="QR van " + subject)
...
Note that I pass the photo and subject to showcode() instead of using global variables.
Suggest to merge the code in showcode() into generate().
So I want a window that updates a shown picture after clicking.
It works fine as long as there is no further tk.Tk() instance (remove/add line 8 of the code below).
If one is created before, this error is raised:
line 29, in CreatePeakSelectionWindow
[...]
self.imgCanvas.create_image((0,0),anchor=tk.NW,image=self.img1)
[...]
_tkinter.TclError: image "pyimage1" doesn't exist
I think I need to pass some argument to Tk()?
I don't know where to even look to address this issue and understand how it is caused.
Sadly this widget is to be used to allow manual selection of some peaks and should be done in an external window.
FYI all arrays are dummies (random arrays) for simplicities sake.
Thank you very much for any help!
The code which causes the issue is the following:
import tkinter as tk
import numpy as np
from PIL import Image,ImageTk
import matplotlib.pyplot as plt
class Dummy:
def __init__(self):
self.MainWin = tk.Tk() #>this line causes the issue
imgs = np.random.randint(0,255,(512,624,2))
self.img = imgs[:,:,0] #self.img is a numpy array in black and white
self.imgSize = self.img.shape
self.peakList = np.array([[200,200],[300,400]])
self.selectedIndexOfPeaksList = []
self.peakListGenerated = True
def CreatePeakSelectionWindow(self):
if self.peakListGenerated:
self.selectedIndexOfPeaksList = []
self.PeakSelectionWindow = tk.Tk()
self.PeakSelectionWindow.protocol("WM_DELETE_WINDOW",self.PeakSelectionWindowClose)
self.PeakSelectionWindow.geometry("%sx%s"%(self.imgSize[1],self.imgSize[0]))
self.PeakSelectionWindow.title("Peak Slection")
self.img1 = ImageTk.PhotoImage(image=Image.fromarray(self.img))
self.imgCanvas = tk.Canvas(self.PeakSelectionWindow,width=self.imgSize[1],height=self.imgSize[0])
self.imgCanvas.place(x=0,y=0)
self.PeakSelectionWindow.bind("<Button 1>",self.LeftClick)
self.PeakSelectionWindow.bind("<Button 3>",self.RightClick)
self.PeakSelectionWindow.update()
self.imgCanvas.create_image((0,0),anchor=tk.NW,image=self.img1)
else:
print("List of peaks has not yet been generated!",file=sys.stderr)
def PeakSelectionWindowClose (self):
if len(self.selectedIndexOfPeaksList) > 0:
print("put extraction here")
#self.selectedPeaksEntry.insert(tk.END,", ".join(map(str,self.selectedIndexOfPeaksList)))
self.PeakSelectionWindow.destroy()
def LeftClick(self,event):
distance = np.sqrt((self.peakList[:,1]-event.x)**2+(self.peakList[:,0]-event.y)**2)
index = np.argmin(distance)
if index not in self.selectedIndexOfPeaksList:
self.peakList[index]
self.selectedIndexOfPeaksList += [index]
newImg = np.random.randint(0,255,(self.img.shape[0],self.img.shape[1],3))
self.PeakSelectionWindow.newImg = img = ImageTk.PhotoImage(image=Image.fromarray(newImg.astype("uint8"),mode="RGB"))
self.imgCanvas.delete("all")
self.imgCanvas.create_image((0,0),anchor=tk.NW,image=self.PeakSelectionWindow.newImg)
self.imgCanvas.update()
def RightClick (self,event):
distance = np.sqrt((self.peakList[:,1]-event.x)**2+(self.peakList[:,0]-event.y)**2)
index = np.argmin(distance)
print(self.selectedIndexOfPeaksList)
if index in self.selectedIndexOfPeaksList:
if len(self.selectedIndexOfPeaksList) > 1:
self.selectedIndexOfPeaksList.remove(index)
newImg = np.random.randint(0,255,(self.img.shape[0],self.img.shape[1],3))
self.PeakSelectionWindow.newImg = img = ImageTk.PhotoImage(image=Image.fromarray(newImg.astype("uint8"),mode="RGB"))
self.imgCanvas.delete("all")
self.imgCanvas.create_image((0,0),anchor=tk.NW,image=self.PeakSelectionWindow.newImg)
self.imgCanvas.update()
else:
self.selectedIndexOfPeaksList = []
self.PeakSelectionWindow.newImg = newImg = ImageTk.PhotoImage(image=Image.fromarray(self.img.astype("uint8")))
self.imgCanvas.delete("all")
self.imgCanvas.create_image((0,0),anchor=tk.NW,image=self.PeakSelectionWindow.newImg)
self.imgCanvas.update()
if __name__ == "__main__":
window = Dummy()
window.CreatePeakSelectionWindow()
tk.mainloop()
Okay so I found a solution.
The additional window needs to be a class with tk.Toplevel().
All changes for the code above are:
class Dummy: to class Dummy (tk.Toplevel()):
def __init__(self): to def __init__ (self,master):
self.peakSelectionWindow to self (as a reference to master
passed to the class)
any tk object (like buttons) also needs this master set as the window too to be rendered
Of course the creation of the first window should be handled outside of the class, passing the windowName = tk.Tk() onto the call of Dummy like a normal variable/reference.
In case you need to share variables of the master to this dummy class, I think windowName.variableName = 5 makes them known/accessable in dummy too (via self.variableName). However this might be messy, so instead pass them on normally if possible.