为了账号安全,请及时绑定邮箱和手机立即绑定

使用 tkinter 并排显示多个图像

使用 tkinter 并排显示多个图像

红糖糍粑 2023-03-08 10:33:51
我写了一个面部识别程序,现在我必须为它制作一个 GUI。我需要做的是显示5张已识别人物的图像。但我只能显示其中一个。其他显示为空。这是代码:root = Tk()root.title("Test state")def train_button():    os.system('python3 extract_embeddings.py --dataset dataset --embeddings output/embeddings.pickle --detector face_detection_model --embedding-model openface_nn4.small2.v1.t7')    os.system('python3 train_model.py --embeddings output/embeddings.pickle --recognizer output/recognizer.pickle --le output/le.pickle')    messagebox.showinfo("INFO","Training completed")def select_photo():    global my_image    root.filename = filedialog.askopenfilename(initialdir="test",title ="Select a photo",filetypes=(("all files","*.*"),("png files","*.png"),("jpeg files","*.jpeg")))    output = subprocess.check_output("python3 recognize.py --detector face_detection_model --embedding-model openface_nn4.small2.v1.t7 --recognizer output/recognizer.pickle --le output/le.pickle --image "+root.filename, shell=True)    output = output.decode('utf-8')    pic_name = output.split('\n')[0]         my_image = ImageTk.PhotoImage(Image.open("images/"+pic_name+"/"+pic_name+"1.jpeg"))    my_image_label = Label(image = my_image).grid(row = 1 ,column = 0)    name_label = Label(text = pic_name).grid(row=2,column=0)    my_image1 = ImageTk.PhotoImage(Image.open("images/"+pic_name+"/"+pic_name+"2.jpeg"))    my_image_label1 = Label(image = my_image1).grid(row =1 ,column=1)    my_image2 = ImageTk.PhotoImage(Image.open("images/"+pic_name+"/"+pic_name+"3.jpeg"))    my_image_label2 = Label(image = my_image2).grid(row = 1,column = 2)button1 = Button(root,text = "Train" , command = train_button).grid(row=0 ,column=0)button2 = Button(root,text = "Recognise from image", command = select_photo).grid(row = 0 ,column=1)root.mainloop()这就是程序显示图像的方式 结果程序
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

PhotoImage这是在将图像分配给函数中的局部变量时删除图像的错误。


你必须将它分配给全局变量(如果你有很多图像,它可以是列表)或分配给你用来显示它的小部件 -label.photo = image


我可以测试它,但这是用于label.photo = image解决此问题的版本


它还使用for-loop 来创建标签并将它们保存在列表中。


但是当你使用label.photo = imagethen list 是没有必要的。List 仅用于访问标签以在创建新标签之前删除旧标签。


import tkinter as tk # PEP8: `import *` is not preferred

from tkinter import filedialog


# --- functions ---


def train_button():

    os.system('python3 extract_embeddings.py --dataset dataset --embeddings output/embeddings.pickle --detector face_detection_model --embedding-model openface_nn4.small2.v1.t7')

    os.system('python3 train_model.py --embeddings output/embeddings.pickle --recognizer output/recognizer.pickle --le output/le.pickle')

    messagebox.showinfo("INFO","Training completed")


def select_photo():

    #global all_labels

    

    root.filename = filedialog.askopenfilename(initialdir="test", title ="Select a photo", filetypes=(("all files","*.*"),("png files","*.png"),("jpeg files","*.jpeg")))

    output = subprocess.check_output("python3 recognize.py --detector face_detection_model --embedding-model openface_nn4.small2.v1.t7 --recognizer output/recognizer.pickle --le output/le.pickle --image "+root.filename, shell=True)

    output = output.decode('utf-8')

    pic_name = output.split('\n')[0]


    # remove previous labels

    for label in all_labels:

        label.destroy()

    

    for number in range(3):

        #filename = f"images/{pic_name}/{pic_name}{number+1}.jpeg" # f-string (Python 3.6+)

        filename = "images/{}/{}{}.jpeg".format(pic_name, pic_name, number+1) # (Python 2.7, 3.0+)

        

        image = ImageTk.PhotoImage(Image.open(filename))

        

        label = tk.Label(image=image)

        label.photo = image   # assign to class variable to resolve problem with bug in `PhotoImage`

        

        label.grid(row=1, column=number)

        

        all_labels.append(label)


# --- main ---


all_labels = []


root = tk.Tk()


button1 = tk.Button(root, text="Train", command=train_button)

button1.grid(row=0, column=0)


button2 = tk.Button(root, text="Recognise from image", command=select_photo)

button2.grid(row=0, column=1)


root.mainloop()


查看完整回答
反对 回复 2023-03-08
  • 1 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信