Добавление тайм-аута и анимации камеры fla sh в программу Photobooth PyQt5 - PullRequest
0 голосов
/ 05 мая 2020

Разрабатываю небольшую программу, которая будет имитировать фотокабину. Идея состоит в том, что он будет передавать потоковое видео с камеры по умолчанию (например, веб-камеры) и позволяет пользователю делать снимки в любой момент времени. Мне удалось передать видео на экран в потоковом режиме, но я не могу добавить к нему тайм-аут и анимацию изображения fla sh. Я попытался добавить ярлык на экран и уменьшать его каждую секунду, чтобы имитировать тайм-аут, но получаю сообщение об ошибке:

QLayout: Attempting to add QLayout "" to MainWindow "", which already has a layout

Вот код:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtPrintSupport import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *

import os
import sys
import time

CAMERA_TIMEOUT = 3      # Timeout in seconds

class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.available_cameras = QCameraInfo.availableCameras()

        self.timeout = CAMERA_TIMEOUT
        self.timeout_label = QLabel(str(self.timeout))
        self.timeout_label.setFont(QFont('Courier',26))
        self.timeout_label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

        # If no camera is found, show error and exit application

        if not self.available_cameras:
            error_msg = QErrorMessage(self)
            error_msg.showMessage("Camera not found! Please connect one and try again.\nExiting...")
            error_msg.exec_()

            print('No camera found! Exiting...', file=sys.stderr)
            sys.exit(0)

        self.status = QStatusBar()
        self.setStatusBar(self.status)

        self.save_path = ""

        self.viewfinder = QCameraViewfinder()
        self.viewfinder.show()
        self.setCentralWidget(self.viewfinder)

        # Set the default camera.
        self.select_camera(0)

        # Setup tools
        camera_toolbar = QToolBar("Camera")
        camera_toolbar.setIconSize(QSize(14, 14))
        self.addToolBar(camera_toolbar)

        photo_action = QAction(QIcon(os.path.join('images', 'camera-black.png')), "Take photo...", self)
        photo_action.setStatusTip("Take photo of current view")
        photo_action.triggered.connect(self.take_photo)
        camera_toolbar.addAction(photo_action)

        change_folder_action = QAction(QIcon(os.path.join('images', 'blue-folder-horizontal-open.png')), "Change save location...", self)
        change_folder_action.setStatusTip("Change folder where photos are saved.")
        change_folder_action.triggered.connect(self.change_folder)
        camera_toolbar.addAction(change_folder_action)


        camera_selector = QComboBox()
        camera_selector.addItems([c.description() for c in self.available_cameras])
        camera_selector.currentIndexChanged.connect( self.select_camera )

        camera_toolbar.addWidget(camera_selector)


        self.setWindowTitle("Python PhotoBooth")
        self.show()

    def select_camera(self, i):

        self.camera = QCamera(self.available_cameras[i])    

        self.camera.setViewfinder(self.viewfinder)
        self.camera.setCaptureMode(QCamera.CaptureStillImage)
        self.camera.error.connect(lambda: self.alert(self.camera.errorString()))
        self.camera.start()

        self.capture = QCameraImageCapture(self.camera)
        self.capture.error.connect(lambda i, e, s: self.alert(s))
        self.capture.imageCaptured.connect(lambda d, i: self.status.showMessage("Image %04d captured" % self.save_seq))

        self.current_camera_name = self.available_cameras[i].description()
        self.save_seq = 0

    def take_photo(self):

#        self.addWidget(self.timeout_label)

        timestamp = time.strftime("%d-%b-%Y-%H_%M_%S")
        self.capture.capture(os.path.join(self.save_path, "%s-%04d-%s.jpg" % (
            self.current_camera_name,
            self.save_seq,
            timestamp
        )))
        self.save_seq += 1

    def change_folder(self):
        path = QFileDialog.getExistingDirectory(self, "Snapshot save location", "")
        if path:
            self.save_path = path
            self.save_seq = 0

    def alert(self, s):
        """ 
        Handle errors coming from QCamera dn QCameraImageCapture by displaying alerts.
        """
        err = QErrorMessage(self)
        err.showMessage(s)


if __name__ == '__main__':

    app = QApplication([])
    app.setApplicationName("Python PhotoBooth")

    window = MainWindow()
    app.exec_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...