Tkinter и opencv. Сannot use geometry manager grid inside . which already has slaves managed by pack. Поправить расположение кнопок

Рейтинг: 0Ответов: 0Опубликовано: 06.02.2023
    from PIL import Image, ImageTk
import tkinter as tk
import argparse
import datetime
import cv2
import os

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.grid(row=0, column=0, padx=10, pady=10)


        #кнопка которая будет отправлять фаил.
        btn2 = tk.Button(self.root, text="отправить снимок", command=self.take_snapshot)
        btn2.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()`

введите сюда описание изображения

Хотел расположить кнопки в один ряд. Но не понимаю почему по получается.

Ответы

Ответов пока нет.