首页 > 解决方案 > 如何在不延迟 Tkinter 中的 GUI 元素的情况下一次执行两个或多个功能?

问题描述

我在 Tkinter 中编写了一个代码,一旦用户单击按钮,它应该执行人脸识别功能,同时它应该重定向到下一帧。

我目前面临的问题是,当用户单击按钮时,我的代码中的人脸识别功能gen()首先执行,一旦终止,它就会重定向到下一帧。

我想要的是两者都应该同时工作..有什么建议吗?

from tkinter import *
from PIL import Image, ImageTk
import cv2
import numpy as np
import os
import json
  
class tkinterApp(Tk): 
      
    def __init__(self, *args, **kwargs):  
          
        Tk.__init__(self, *args, **kwargs) 
          
        container = Frame(self)   
        container.pack(side = "top", fill = "both", expand = True)  
   
        self.frames = {}

        for F in (StartPage, Page1, Page2): 
   
            frame = F(container, self) 

            self.frames[F] = frame  
   
            frame.grid(row = 0, column = 0, sticky ="nsew")
        self.update()
        self.show_frame(StartPage)

    def show_frame(self, cont):
        if cont not in self.frames:
            self.frames[cont] = cont(self.container, self)
        frame = self.frames[cont]
        frame.tkraise()
        frame.event_generate("<<ShowFrame>>")

   
class StartPage(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller
        self.bind("<<ShowFrame>>", self.myStartPage)

    def myStartPage(self,controller):
        super(StartPage).__init__()

        canvas = Canvas(self,width=2300, height=900, bd=0, highlightthickness=0, relief='ridge')
        canvas.pack()

        self.background = PhotoImage(file="Images/background.png")
        canvas.create_image(525,425,image=self.background, tags="B")

        self.bg = PhotoImage(file="Images/bg-top.png")
        canvas.create_image(0,335,image=self.bg, anchor=NW)

        self.my_pic1 = PhotoImage(file="Images/start000-befored.png")
        obj1 = canvas.create_image(1200,290,image=self.my_pic1, anchor=NW)

        recognizer = cv2.face.LBPHFaceRecognizer_create()
        recognizer.read('trainer/trainer.yml')
        cascadePath = "Cascades/haarcascade_frontalface_default.xml"
        faceCascade = cv2.CascadeClassifier(cascadePath)

        font = cv2.FONT_HERSHEY_SIMPLEX

        cam = cv2.VideoCapture(0)
        cam.set(3, 640)
        cam.set(4, 480)

        minW = 0.1*cam.get(3)
        minH = 0.1*cam.get(4)            

        def get_frame():
            laebl = ""
            names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W'] 
            while True:
                ret, img =cam.read()
                gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
                faces = faceCascade.detectMultiScale(
                    gray,
                    scaleFactor = 1.2,
                    minNeighbors = 5,
                    minSize = (int(minW), int(minH)),
                    )
                for(x,y,w,h) in faces:
                    cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
                    label, confidence = recognizer.predict(gray[y:y+h,x:x+w])
                    if (confidence < 50):
                        label = names[label]
                        confidence = "  {0}%".format(round(100 - confidence))
                    else:
                        label = "unknown"
                        confidence = "  {0}%".format(round(100 - confidence))
                    cv2.putText(img, str(label), (x+5,y-5), font, 1, (255,255,255), 2)
                    cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)
                    #cv2.imshow('camera',img)
                ret, jpeg = cv2.imencode('.jpg', img)
                cv2.destroyAllWindows()
                return label, jpeg.tobytes()

        def gen():
            flag = 1
            while True:
                label, frame = get_frame()
                flag += 1
                if label=="unknown" and flag > 70:
                    cam.release()
                    print("Unknown Face Detected!")
                    break

        canvas.tag_bind(obj1, '<1>', lambda event=None : [self.controller.show_frame(Page1), gen()]) 
           
class Page1(Frame): 
      
    def __init__(self, parent, controller): 
          
        Frame.__init__(self, parent)
        self.controller = controller
        self.bind("<<ShowFrame>>", self.myPage1)


    def myPage1(self,controller):
        super(Page1).__init__()

        canvas = Canvas(self,width=2300, height=900, bd=0, highlightthickness=0, relief='ridge')
        canvas.pack()

        self.background = PhotoImage(file="Images/background.png")
        canvas.create_image(525,425,image=self.background, tags="B")

        self.bg = PhotoImage(file="Images/bg-top.png")
        bg_tk = canvas.create_image(0,335,image=self.bg, anchor=NW)

        self.bg1 = PhotoImage(file="Images/bg-bottom.png")
        bg1_tk = canvas.create_image(0,335,image=self.bg1, anchor=NW)

        self.after(3000, lambda event=None : self.controller.show_frame(Page2))
        
class Page2(Frame): 
      
    def __init__(self, parent, controller): 
          
        Frame.__init__(self, parent)
        self.controller = controller
        self.bind("<<ShowFrame>>", self.myPage2)

    def myPage2(self,controller):
        super(Page1).__init__()
        canvas = Canvas(self,width=2300, height=900, bd=0, highlightthickness=0, relief='ridge')
        canvas.pack()

        self.background = PhotoImage(file="Images/background.png")
        canvas.create_image(525,425,image=self.background)

        self.bg = PhotoImage(file="Images/bg-top.png")
        bg_tk = canvas.create_image(0,70,image=self.bg, anchor=NW)

        self.bg1 = PhotoImage(file="Images/bg-bottom.png")
        bg1_tk = canvas.create_image(0,777,image=self.bg1, anchor=NW)


# Driver Code 
app = tkinterApp()
app.title("My Project")
app.mainloop() 

标签: pythonpython-3.xtkintertktkinter-canvas

解决方案


推荐阅读