如何同时打开tkinter窗口和opencv窗口?

jhkqcmku  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(265)

我想同时打开tkinter窗口和opencv窗口。请帮助我同时运行它们。我该怎么做呢?代码如下:

import numpy as np
import cv2
from mss import mss
from PIL import Image
import pyautogui
import pyautogui as pg
import tkinter as tk

mon = {'left': 500, 'top': 500, 'width': 500, 'height': 500}

root = tk.Tk()
root.geometry("400x300")
root.title("Tkinter")

root.attributes('-transparentcolor',
                'red')

root.config(bg='red')

root.mainloop()

with mss() as sct:

    while True:

        screenShot = sct.grab(mon)
        img = Image.frombytes(
            'RGB',
            (screenShot.width, screenShot.height),
            screenShot.rgb,
        )
        cv2.imshow('ProjectZero', np.array(img))
        if cv2.waitKey(33) & 0xFF in (
            ord('q'),
            27,
        ):
            break

但每次我试着去做,接下来就会发生:

  1. tkinter窗口打开,关闭后,打开opencv窗口。(我需要同时打开它们)
  2. tkinter窗口和opencv窗口同时打开。但是opencv不刷新窗口。只有当我用垃圾邮件关闭tkinter窗口时。
    1.或者在关闭tkinter窗口后。打开Opencv窗口并正常工作。但我再也不能打开tkinter窗口了。
tjrkku2a

tjrkku2a1#

我写了一个迷你代码,这样你就可以理解了。我的程序通过OpenCV显示一个tkinter窗口和我的网络摄像头窗口。它们并行运行,不会干扰彼此的工作。我做到了这一点,这要归功于线程模块(它是一个内置的python模块)。这个模块允许你并行运行进程。

from tkinter import *
import cv2
from threading import *

def window_Tk():
    root = Tk()
    root.geometry('200x200')
    btn = Button(root, text='click').pack()
    root.mainloop()

def window_CV():
    cap = cv2.VideoCapture(0)

    while True:
        ret, frame = cap.read()
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        if cv2.getWindowProperty('frame',1) == -1 :
            break
    cap.release()
    cv2.destroyAllWindows()

t1 = Thread(target=window_Tk)
t2 = Thread(target=window_CV)

t1.start()
t2.start()

相关问题