How to execute two or more functions at a time without delaying GUI elements in Tkinter?

Viewed 60

I wrote a code in Tkinter that should execute the function of face recognition as soon as the user click on the button and simultaneously it should redirect to the next frame.

What the problem I am currently facing is, when the user clicks on the button, the face recognition function, that is in my code gen(), executes first and as soon as it terminates, it redirects to the next frame.

What I want is both should work at the same time.. Any suggestion please?

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() 

0 Answers
Related