Python (tkinter and opencv) Как при нажатии на кнопку снимка. Выводить окно что снимок сохранен?

from PIL import Image, ImageTk
import tkinter as tk
import argparse
import datetime
import cv2
import os
import requests
from tkinter import messagebox


class Application:
    def __init__(self, output_path = "./"):
        """ внутри онка tkinter появится окно opencv"""
        self.vs = cv2.VideoCapture(0) # захват камеры. 0 камера по умолчанию.
        self.output_path = output_path  # Сохраняет путь
        self.current_image = None  # Текущее изображение с камеры

        self.root = tk.Tk()  # инициализация корневого окна
        self.root.title("ADVARD'S PROGRAMM")  # имя программы
        # self.destructor = запускается, когда окно закрывается
        self.root.protocol('WM_DELETE_WINDOW', self.destructor)

        self.panel = tk.Label(self.root)  # инициализация панели изображения
        self.panel.pack(padx=10, pady=10)

        #кнопка, которая при нажатии будет брать текущий кадр и сохранять его в файл
        btn = tk.Button(self.root, text="Сделать снимок", command=self.take_snapshot)
        btn.pack(expand=True, padx=15, pady=15)


        #кнопка которая будет отправлять фаил.

        # запускает self.video_loop, который постоянно объединяет видеосенсор
        # Для коследнего читаемого кадра
        self.video_loop()


    def video_loop(self):
        """ Получает кадр из видеопотока и показавает его в Tkinter """
        ok, frame = self.vs.read()  # прочитать кадр из видеопотока
        if ok:  # Если кадр снят без ошибок
            cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # конвертировать цвета из BGR в RGBA
            self.current_image = Image.fromarray(cv2image)  # преобразование изображение для PIL
            imgtk = ImageTk.PhotoImage(image=self.current_image)  # конвертация изображение для tkinter
            self.panel.imgtk = imgtk  # закрепление imgtk, чтобы он не удалялся сборщиком мусора
            self.panel.config(image=imgtk)  # показать изображение
        self.root.after(30, self.video_loop)  # вызвать ту же функцию через 30 миллисекунд

    def take_snapshot(self):
        """ Делает снимок и сохраните его в файл """
        ts = datetime.datetime.now() # Получает текущее время
        filename = "{}.jpg".format(ts.strftime("%Y.%m.%d %H:%M:%S"))  # Делает имя файла по времени
        p = os.path.join(self.output_path, filename)  # сторит путь
        self.current_image.save(p, "JPEG")  # сохраняет изображение в формате jpeg
        print("[INFO] saved {}".format(filename))

    def destructor(self):
        """ Сломать корневой объект и освободить все ресурсы"""
        print("[INFO] closing...")
        self.root.destroy()
        self.vs.release()  # Запустить веб камеру
        cv2.destroyAllWindows()  # Сломает все окна при закрытии

# построить разбор аргумента и разобрать аргументы
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", default="./",
    help="path to output directory to store snapshots (default: current folder")
args = vars(ap.parse_args())

# запустить приложение
print("[INFO] starting...")
pba = Application(args["output"])
pba.root.mainloop()

Ответы (0 шт):