【问题标题】:Can't Delete TkInter Label using OpenCV无法使用 OpenCV 删除 TkInter 标签
【发布时间】:2018-07-03 01:20:36
【问题描述】:

我想要做什么:

你好。我正在创建一个包含相机和地图视图的 GUI。首先,我想用“F1”和“F2”来控制GUI。

问题:

我的问题是按 F2 时无法删除/移除标签。按F1没有问题。我尝试使用 packname.pack() 然后 packname.forget_pack() 但什么也没发生。 此外,当我尝试 packname.destroy() 时,框架停止但屏幕仍然存在。(在 GUI 上)

我该如何解决这个问题?

代码:

 import sys

if sys.version_info[0] == 2:
    import Tkinter as tk
else:
    import tkinter as tk

from PIL import ImageTk
import cv2
from PIL import Image


class UI(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.maxsize(width = 500, height = 500)
        self.minsize(width = 500 , height = 500)
        self.cap = cv2.VideoCapture(1)
        self.geometry("500x500")
        self.title('Test1')
        self.camera_view = tk.Frame(self)
        self.camera_on= self.bind("<F1>", self.camera)
        self.bind("<F2>", self.remove_camera)


    def camera(self, event=None):

        _, frame = self.cap.read()
        frame = cv2.flip(frame, 1)
        frame = cv2.resize(frame, (0, 0), fx=0.75, fy=0.65)
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        self.camera_label = tk.Label(image=imgtk)
        self.camera_label.imgtk = imgtk
        self.camera_label.after(10, self.camera)
        self.camera_label.place(x=10, y=100)


    def remove_camera(self, event=None):
        self.camera_label.place_forget()

UI().mainloop()  

【问题讨论】:

  • 我没有看到任何名为 packname 的东西。但是,您每秒创建一个新相机标签的次数是您按 F1 的次数的 100 次,但只保留对最后一个标签的引用。不仅如此,你还没有破坏它。您只是将其从视图中删除,这会导致内存泄漏,因为每秒 100 个标签加起来很快。如果每次创建标签时增加一个全局计数器并在每次删除它时减少它,您可以很容易地看到这一点。
  • 感谢您的建议。我更改了流媒体相机设置并解决了。

标签: python opencv user-interface tkinter camera


【解决方案1】:

解决方案:

我们不能将绑定用于流式摄像头功能。我们需要一个控制函数来添加或删除。示例如下:

import sys

if sys.version_info[0] == 2:
    import Tkinter as tk
else:
    import tkinter as tk

from PIL import ImageTk
from goompy import GooMPy
import cv2
import numpy as np
from PIL import Image
import PIL



class UI(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.maxsize(width = 800, height = 640)
        self.minsize(width = 800 , height = 640)
        self.cap = cv2.VideoCapture(1)
        self.geometry("800x640")
        self.title('Testing1')
        self.arka_plan = tk.Frame(self, bg='#2a2a2a')
        self.arka_plan.pack(fill='both', expand='yes')
        ##self.logo_label.place(x=150, y=0)
        self.camera_label = tk.Label(self)
        self.bind("<F1>", self.control)
        self.bind("<F2>", self.control)
        self.bind("<F3>", self.control)


    def camera(self):

        _, frame = self.cap.read()
        frame = cv2.flip(frame, 1)
        frame = cv2.resize(frame, (0, 0), fx=1.24, fy=1.32)
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        self.camera_label.imgtk = imgtk
        self.camera_label.configure(image=imgtk)
        self.camera_label.after(10, self.camera)


    def control(self, event = None):
        if event.keysym == 'F1': ##kamera calistirilirsa
            self.camera_label.place(x = 0, y = 0)

        elif event.keysym == 'F2': 

            self.camera_label.place_forget()

    def check_quit(self, event):
        pass

app = UI()
app.camera()
app.mainloop()

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 2021-04-10
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多