微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法打开两个都在 tkinter 中显示视频的画布

如何解决无法打开两个都在 tkinter 中显示视频的画布

我正在处理一个项目,在该项目中我显示来自线程队列的视频源(它只是从实时网络摄像头读取和排队帧),使用 opencv 查看图像,应用跟踪,并生成阈值图像作为好。主视频源获取图像,转换为 PIL 图像并将其放在主画布上。获取图像的主菜单生成图像和阈值掩码,并将它们放在类变量中。当您打开遮罩菜单时,它只是抓取带有遮罩的变量,将其转换为 PIL 图像并应显示它。两个画布应该能够同时运行。但是在我的 PC(这是一个标准的 lenovo ideapad)上,不能同时显示,只能显示一个,但我的朋友(使用高端游戏电脑)可以同时打开两个。有没有原因,只是我的电脑不够强大?或者有没有办法让两者都运行?

这是代码,编辑以突出显示主要关注的代码

import os
from tkinter import *
from PIL import Image,ImageTk
from EyeTrackerClass import *

cobalt = '#0099ff'
grey = '#373737'
black = '#303036'
white = '#ffffff'



class MainScreen(Frame):
    def __init__(self,parent,video):
        Frame.__init__(self,parent)
        self.pack()
        self.video = video
        self.eyetrackerClass = EyeTrackerClass(self.video)
        user32 = ctypes.windll.user32
        self.screensize = user32.GetSystemMetrics(0),user32.GetSystemMetrics(1)
        self.width = round(int(self.video.cap.get(cv2.CAP_PROP_FRAME_WIDTH))* 0.75)
        self.height = round(int(self.video.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))* 0.75)
        root.config(bg=grey)
        root.geometry("{}x{}".format(700,450))

        self.videoframe = Canvas(self,width=self.width,height=self.height,bg=cobalt,highlightbackground=cobalt)
        self.videoframe.pack(side=TOP)

        #buttons are packed in the menu


        self.GetFrame()


    def GetFrame(self):
        self.eyetrackerClass.getLandMarksVideo(ThreadCap)
        self.image = self.eyetrackerClass.image
        self.image = Image.fromarray(self.image)
        self.image = ImageTk.PhotoImage(self.image)

        self.videoframe.create_image(0,anchor=NW,image=self.image)
        self.videoframe.after(10,self.GetFrame)


    def openSettings(self):
        self.settingsWindow = Toplevel(self)
        self.settingsWindow.config(bg=grey)
        self.settingsWindow.title("Settings")
        settingsMenu(self)


class settingsMenu(Frame):
    def __init__(self,mainmenu):
        Frame.__init__(self,mainmenu.settingsWindow)
        self.config(bg=grey)
        self.pack()
        self.mainmenu = mainmenu

       #more buttons,including button to open mask configuration menu


  

    def openMaskConfig(self):

        self.maskWindow = Toplevel(self)
        self.maskWindow.config(bg=grey)
        self.maskWindow.title("Mask configuration")
        MaskConfig(self,self.mainmenu.eyetrackerClass)

   
    def returntoMM(self):
        self.mainmenu.settingsWindow.destroy()



class MaskConfig(Frame):

    def __init__(self,settingsMenu,eyeTrackerClass):
        Frame.__init__(self,settingsMenu.maskWindow)
        self.pack()
        self.settingsMenu = settingsMenu
        self.eyetrackerClass = eyeTrackerClass
        self.width = settingsMenu.mainmenu.width
        self.height = settingsMenu.mainmenu.height
        self.config(bg=grey)
        self.thresholdval = self.eyetrackerClass.threshold
        self.dilationval = self.eyetrackerClass.dilation
        self.erosionval = self.eyetrackerClass.erosion

        self.screensize = self.settingsMenu.mainmenu.screensize


        #packed buttons for editing threshold values

        self.videoFrame = Canvas(self,height=self.height)
        self.videoFrame.pack(side=BottOM)

        self.settingsMenu.maskWindow.protocol("WM_DELETE_WINDOW",self.saveSettings)

        self.GetMaskFrame()



    def GetMaskFrame(self):
        self.eyeMask = self.eyetrackerClass.eyeMask
        self.eyeMask = Image.fromarray(self.eyeMask)
        self.eyeMask = ImageTk.PhotoImage(self.eyeMask)
        self.videoFrame.create_image(0,image=self.eyeMask)
        self.videoFrame.after(10,self.GetMaskFrame)


        self.settingsMenu.maskWindow.destroy()


root = Tk()
ThreadCap = Threaded_Capture(0)
app = MainScreen(root,ThreadCap)
root.mainloop()

如果有人能帮忙那就太好了,谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。