与tkinter并排显示多个图像

时间:2020-07-15 08:31:44

标签: python tkinter

我写了一个用于面部识别的程序,现在我必须为其编写一个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()

这是程序显示图像的方式 Resulting program

谢谢您的时间

1 个答案:

答案 0 :(得分:0)

RecyclerView中的错误会在将图像分配给函数中的局部变量时将其删除。

您必须将其关联到全局变量(如果有很多图像,可以将其列出)或分配给用于显示它的小部件-PhotoImage


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

它还使用label.photo = image循环创建标签并将其保留在列表中。

但是当您使用for时,则不需要列表。列表仅可用于在创建新标签之前访问标签以删除旧标签。

label.photo = image