python - 如何在不延迟 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()
解决方案
推荐阅读
- ios - GLKit 是否可用于 Mac Catalyst?
- python - 需要正则表达式或数据来切片代码和处理引号
- kotlin - 使用依赖注入编译问题
- r - 使用 df 作为 .l 输入参数时 purrr::pmap 的正确语法
- c - Windows 上的静态 libpixman-1.a 链接错误
- c++ - 什么时候模板参数包被推断为空?
- scheme - 如何将 trien-label 附加到 trien-children?
- jquery - 调整大小后获取窗格大小
- azure - 错误:com.microsoft.azure.storage.StorageException 引起的 java.io.IOException:Blob 哈希不匹配
- c# - 给定的程序集名称无效 Type.GetType() 不起作用