コード例 #1
0
	def __init__(self):
		""" Class constructor.
		"""
		QMainWindow.__init__(self)

		dir = os.path.dirname(os.path.realpath(__file__))

		self.__createMenus__()
		newfont = QFont()
		newfont.setPointSize(9) 
		self.setFont(newfont)

		sb = QStatusBar()
		sb.setFixedHeight(24)
		self.setStatusBar(sb)  

		self.statusBarThread = StatThread(self)        
		self.statusBarThread.statusMessage.connect(self.handleStatusMessage)
		self.statusBarThread.start()    

		# Create progress bar:
		#self.pb = QProgressBar(self.statusBar())
		#self.statusBar().addPermanentWidget(self.pb)
		self.dset = None
							
		# Add the widgets to the panel:
		self.sidebar = kstSidebar()
		self.mainPanel = kstMainPanel()		
		self.splitter = QSplitter(Qt.Horizontal)

		# Configure the sidebar:
		self.sidebar.hdfViewerTab.openImageDataEvent.connect(self.openImage)
		self.sidebar.preprocessingTab.preprocessingRequestedEvent.connect(self.applyPreprocessing)
		self.sidebar.reconstructionTab.recostructionRequestedEvent.connect(self.applyReconstruction)


		# Configure the splitter:
		self.splitter.addWidget(self.sidebar)
		self.splitter.addWidget(self.mainPanel)

		# Compose layout of the window:
		self.setCentralWidget(self.splitter) 

		# Set title, icon and default size:
		self.setWindowTitle(SW_TITLE)
		self.setWindowIcon(QIcon(dir + "/resources/logo_kest.png"))
		
		# Default size:
		self.resize(1024,768)		
		self.mainPanel.resize(int(round(self.width() * 0.75)), self.height())
		self.mainPanel.imagePanel.resize(self.width(), int(round(self.height() * 0.85)))		
コード例 #2
0
class ImagePlayer(QWidget):
    def __init__(self, img_path, parent=None):
        super(ImagePlayer, self).__init__(parent)
        if __name__ == '__main__':
            self.setWindowTitle("Viewer")
            self.setGeometry(0, 0, 640, 480)
            self.main = QWidget()
        else:
            self.setGeometry(0, 0, parent.width(), parent.height())
            self.main = parent

        self.vue = QGraphicsView()
        self.vue.setDragMode(QGraphicsView.ScrollHandDrag)
        self.vue.wheelEvent = self.wheel_event

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        self.verticalLayout = QVBoxLayout()
        self.verticalLayout.addWidget(self.vue)
        self.verticalLayout.addWidget(self.statusBar)

        self.setPixmapView(img_path)

        self.statusBar.showMessage(img_path)

        if __name__ == '__main__':
            self.image_btn = QToolButton()
            self.image_btn.setText("Image")
            self.image_btn.setObjectName("image_btn")
            self.image_btn.clicked.connect(self.get_image)
            self.verticalLayout.addWidget(self.image_btn)

            self.setLayout(self.verticalLayout)
            self.show()
        else:
            self.main.setLayout(self.verticalLayout)

    def get_image(self):
        img, _p = QFileDialog.getOpenFileName(
            self, "Ouvrir un fichier", QDir.homePath(),
            "All Files *.* ;; PNG *.png ;; JPG *.jpg ;; BMP *.bmp")
        if not img:
            with open("img.txt", "w") as file:
                file.write("not img")
            return
        self.setPixmapView(img)

    def setPixmapView(self, img_path):
        self.current_image = ImageQt(img_path)
        w, h = self.size().width(), self.size().height()
        self.pixmap = QPixmap.fromImage(
            self.current_image.scaled(w, h, Qt.KeepAspectRatio,
                                      Qt.FastTransformation))
        self.view_current()
        self.statusBar.showMessage(img_path)

    def view_current(self):
        w_pix, h_pix = self.pixmap.width(), self.pixmap.height()
        self.scene = QGraphicsScene()
        self.scene.setSceneRect(0, 0, w_pix, h_pix)
        self.scene.addPixmap(self.pixmap)
        self.vue.setScene(self.scene)

    def wheel_event(self, event):
        steps = event.angleDelta().y() / 120.0
        self.zoom(steps)
        event.accept()

    def zoom(self, step):
        w_pix, h_pix = self.pixmap.width(), self.pixmap.height()
        w, h = w_pix * (1 + 0.1 * step), h_pix * (1 + 0.1 * step)
        self.pixmap = QPixmap.fromImage(
            self.current_image.scaled(w, h, Qt.KeepAspectRatio,
                                      Qt.FastTransformation))
        self.view_current()
コード例 #3
0
class MachineLearning(QMainWindow):

    populateGallery = pyqtSignal()
    closedWindow = pyqtSignal(object)
    key_pressed = pyqtSignal(object)

    def __init__(self, parent=None):

        super(MachineLearning, self).__init__()
        self.setWindowTitle('Machine Learning')
        self.parent = parent
        self.configure_gui()
        self.create_menu()
        self.create_widgets()
        self.showMaximized()

    def configure_gui(self):

        self.stack = QStackedWidget(self)
        self.setCentralWidget(self.stack)
        self.stack.setContentsMargins(0, 0, 5, 0)

    def create_widgets(self):

        self.design = Design(self)
        self.dataset = Dataset(self)
        self.train = Train(self)

        self.stack.addWidget(self.design)
        self.stack.addWidget(self.dataset)
        self.stack.addWidget(self.train)

        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.statusbar.setFixedHeight(25)

    def create_menu(self):

        self.menubar = self.menuBar()
        self.tooblar = self.addToolBar('')

        # File
        file = self.menubar.addMenu('File')
        self.create_action(file, ['New...', 'Create new project'],
                           self.menuPressEvent, 'Ctrl+N')
        self.create_action(file, ['Open...', 'Load project from file'],
                           self.menuPressEvent, 'Ctrl+O')
        file.addMenu('Open recent')
        file.addSeparator()
        self.create_action(file, ['Save', 'Save project to file'],
                           self.menuPressEvent, 'Ctrl+S')
        file.addAction('Save As...',
                       self.menuPressEvent,
                       shortcut='Ctrl+Shift+S')
        file.addAction('Save a Copy...', self.menuPressEvent)
        file.addAction('Save Selection...', self.menuPressEvent)
        file.addAction('Export...', self.menuPressEvent)
        file.addSeparator()
        file.addAction('Close', self.menuPressEvent, shortcut='Ctrl+F4')
        file.addSeparator()
        file.addAction('Properties', self.menuPressEvent)
        file.addSeparator()
        file.addAction('Quit', self.menuPressEvent, shortcut='Ctrl+Q')

        # Edit
        edit = self.menubar.addMenu('Edit')
        edit.addAction('Undo', self.menuPressEvent, shortcut='Ctrl+Z')
        edit.addAction('Redo', self.menuPressEvent, shortcut='Ctrl+Y')
        edit.addSeparator()
        edit.addAction('Cut', self.menuPressEvent, shortcut='Ctrl+X')
        edit.addAction('Copy', self.menuPressEvent, shortcut='Ctrl+C')
        edit.addAction('Paste', self.menuPressEvent, shortcut='Ctrl+V')
        edit.addAction('Delete', self.menuPressEvent, shortcut='Del')
        edit.addSeparator()
        edit.addAction('Select All', self.menuPressEvent, shortcut='Ctrl+A')
        edit.addAction('Find', self.menuPressEvent, shortcut='Ctrl+F')
        edit.addSeparator()
        edit.addAction('Preferences', self.menuPressEvent)

        # View
        view = self.menubar.addMenu('View')
        view.addAction('Palettes', self.menuPressEvent, shortcut='F9')
        view.addAction('Inspector', self.menuPressEvent, shortcut='F8')
        view.addSeparator()
        view.addAction('Zoom in', self.menuPressEvent, shortcut='Ctrl++')
        view.addAction('Zoom out', self.menuPressEvent, shortcut='Ctrl+-')
        view.addSeparator()
        view.addAction('Fulscreen', self.menuPressEvent, shortcut='F11')

        # Layer
        layer = self.menubar.addMenu('Layer')

        # Tools
        tools = self.menubar.addMenu('Tools')

        # Help
        help = self.menubar.addMenu('Help')

    def create_action(self, menu, text, slot, shortcut):

        if isinstance(text, list):
            menu.addAction(text[0], self.menuPressEvent, shortcut=shortcut)
            self.tooblar.addAction(
                QAction(QIcon.fromTheme('new.bmp'), f'{text[1]} ({shortcut})',
                        self))
        else:
            menu.addAction(text, self.menuPressEvent, shortcut=shortcut)

    def menuPressEvent(self, event=None):

        action = event.text()
        print(action)

    def keyPressEvent(self, event):

        key_press = event.key()

        if key_press == Qt.Key_Escape: self.close()

        else: self.key_pressed.emit(event)

    def closeEvent(self, event):

        self.closedWindow.emit(self)
コード例 #4
0
class VideoPlayer(QWidget):
    def __init__(self, img_path, parent=None):
        super(VideoPlayer, self).__init__(parent)
        if __name__ == '__main__':
            self.setWindowTitle("Player")
            self.setGeometry(0, 0, 640, 480)
        else:
            self.setGeometry(0, 0, parent.width(), parent.height())
            self.main = parent

        self.fileName = img_path
        btnSize = QSize(16, 16)
        self.videoWidget = QLabel()
        self.videoWidget.setAlignment(Qt.AlignCenter)

        if __name__ == '__main__':
            openButton = QPushButton()
            openButton.setToolTip("Open Video File")
            openButton.setStatusTip("Open Video File")
            openButton.setFixedHeight(24)
            openButton.setIconSize(btnSize)
            openButton.setText("Vidéo")
            openButton.setFont(QFont("Noto Sans", 8))
            openButton.setIcon(QIcon.fromTheme("document-open"))
            openButton.clicked.connect(self.openFile)

        self.playButton = QPushButton()
        self.playButton.setEnabled(True)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        if __name__ == '__main__':
            controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(self.videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.loadFile(self.fileName)
        self.statusBar.showMessage(self.fileName)

        if __name__ == '__main__':
            self.setLayout(layout)
            self.show()
        else:
            self.main.setLayout(layout)

    def openFile(self):
        self.fileName, _ = QFileDialog.getOpenFileName(
            self, "Open Movie", QDir.homePath(),
            "All Files *.* ;; MP4 *.mp4 ;; FLV *.flv ;; TS *.ts ;; MTS *.mts ;; AVI *.avi"
        )

        if self.fileName != '':
            self.loadFile(self.fileName)

    def loadFile(self, fileName):
        self.state = "WaitingState"
        self.mediaStateChanged()
        self.cap = cv2.VideoCapture(str(fileName))
        self.frame_num = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
        self.durationChanged()
        self.frame_count = 0
        self.statusBar.showMessage(fileName)

    def play(self):
        if self.state == "PlayingState":
            self.pause()
        elif self.state == "WaitingState":
            self.start()
        else:
            self.state = "PlayingState"
            self.mediaStateChanged()
            self.cap = cv2.VideoCapture(str(self.fileName))
            self.frame_count = 0

    def pause(self):
        self.state = "WaitingState"
        self.mediaStateChanged()
        self.timer.stop()

    def start(self):
        self.state = "PlayingState"
        self.mediaStateChanged()
        self.timer = QTimer()
        self.timer.timeout.connect(self.nextFrameSlot)
        self.timer.start(1000. / self.cap.get(cv2.CAP_PROP_FPS))

    def nextFrameSlot(self):
        self.frame_count += 1
        self.positionChanged()
        ret, frame = self.cap.read()
        if ret:
            img = QImage(frame.data, frame.shape[1], frame.shape[0],
                         QImage.Format_RGB888)
            img = img.rgbSwapped()
            if __name__ == '__main__':
                w, h = self.videoWidget.size().width(), self.videoWidget.size(
                ).height()
            else:
                #                TODO : Gérer le problème d'agrandissement de la fenêtre
                w, h = self.size().width(), self.size().height()
            pix = QPixmap.fromImage(
                img.scaled(w, h, Qt.KeepAspectRatio, Qt.FastTransformation))
            self.videoWidget.setPixmap(pix)
        else:
            self.state = "FinishingState"
            self.mediaStateChanged()

    def mediaStateChanged(self):
        if self.state == "PlayingState":
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        elif self.state == "WaitingState":
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaStop))

    def positionChanged(self):
        self.positionSlider.setValue(self.frame_count)

    def durationChanged(self):
        self.positionSlider.setRange(0, self.frame_num)
コード例 #5
0
class VideoPlayer(QWidget):
    send_img = pyqtSignal(QPixmap)

    def __init__(self):
        super(VideoPlayer, self).__init__()
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        self.videoWidget = QVideoWidget()

        openBtn = QPushButton("Open")
        openBtn.setFixedHeight(24)
        openBtn.clicked.connect(self.loadVideo)

        self.captureBtn = QPushButton("Capture")
        self.captureBtn.setEnabled(False)
        self.captureBtn.setFixedHeight(24)

        self.playBtn = QPushButton()
        self.playBtn.setEnabled(False)
        self.playBtn.setFixedHeight(24)
        self.playBtn.setIconSize(btnSize)
        self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playBtn.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

        self.captureBtn.clicked.connect(self.capture)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openBtn)
        controlLayout.addWidget(self.playBtn)
        controlLayout.addWidget(self.positionSlider)
        controlLayout.addWidget(self.captureBtn)

        layout = QVBoxLayout()
        layout.addWidget(self.videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)
        self.setLayout(layout)

        self.screen = QApplication.primaryScreen()
        self.secondW = CaptureWindow()
        self.send_img.connect(self.secondW.gotImg)

    def capture(self):
        shot = self.screen.grabWindow(self.videoWidget.winId())
        print("Capture Btn Clicked")
        self.send_img.emit(shot)

    def loadVideo(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Selecciona los mediose", ".",
            "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")
        if fileName != '':
            try:
                self.mediaPlayer.setMedia(
                    QMediaContent(QUrl.fromLocalFile(fileName)))
                self.playBtn.setEnabled(True)
                self.statusBar.showMessage(fileName)
                self.play()
            except Exception as e:
                print(e)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
            self.captureBtn.setEnabled(True)
        else:
            self.mediaPlayer.play()
            self.captureBtn.setEnabled(False)

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playBtn.setEnabled(False)
        print(self.mediaPlayer.errorString())
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
コード例 #6
0
class VideoPlayer(QWidget):
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        openButton = QPushButton("Open Video")
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 8))
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        openButton.clicked.connect(self.abrir)

        speedButton = QPushButton("speedVideo")
        speedButton.setToolTip("Open Video File")
        speedButton.setStatusTip("Open Video File")
        speedButton.setFixedHeight(24)
        speedButton.setIconSize(btnSize)
        speedButton.setFont(QFont("Noto Sans", 8))
        speedButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        speedButton.clicked.connect(self.speed)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = slider.Slider(QtCore.Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)
        self.positionSlider.sliderPressed.connect(self.setPosition)
        self.positionSlider.sliderReleased.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(speedButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

    def abrir(self):

        num = 0
        cmd = "ffmpeg -y -i " + "PART/" + str(
            num
        ) + ".mkv " + "-filter_complex \"[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]\" -map \"[v]\" -map \"[a]\" " + str(
            num) + ".mkv"

        #cmd = "ffmpeg -y -i "+ "PART/" + str(num) + ".mkv" + " -filter:v \"setpts=2.0*PTS\" "+ str(num) + ".mkv"
        os.system(cmd)

        player.setWindowTitle("CLONES")
        fileName = "/home/flo/tmp/Movie-SongMaker/0.mkv"

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def speed(self):

        num = 0
        cmd = "ffmpeg -y -i " + "PART/" + str(
            num
        ) + ".mkv " + "-filter_complex \"[0:v]setpts=1.0*PTS[v];[0:a]atempo=1.0[a]\" -map \"[v]\" -map \"[a]\" " + str(
            num) + ".mkv"

        #cmd = "ffmpeg -y -i "+ "PART/" + str(num) + ".mkv" + " -filter:v \"setpts=2.0*PTS\" "+ str(num) + ".mkv"
        os.system(cmd)

        player.setWindowTitle("CLONES")
        fileName = "/home/flo/tmp/Movie-SongMaker/0.mkv"

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def play(self):

        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
コード例 #7
0
class VideoPlayer(QWidget):
    def __init__(self, name, file_path, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        # Contains full path
        self.fileName = file_path

        self.res = 'answer not yet'

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        #nameLabel = QLabel("")
        #nameLabel.setText("Name of the person")

        openButton = QPushButton("Open Video")
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 8))
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        # openButton.clicked.connect(self.abrir)

        self.result = QPushButton("Result")
        self.result.setGeometry(QtCore.QRect(500, 400, 141, 51))
        self.result.setObjectName("result")
        self.result.setEnabled(False)

        self.result.clicked.connect(self.result_window)
        """
        result window event

        """

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(50)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        #controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)
        controlLayout.addWidget(self.result)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(self.fileName)))
        self.playButton.setEnabled(True)
        #self.statusBar.showMessage(fileName)
        self.play()

        self.setLayout(layout)

        f = "Hello, " + name
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage(f)

    def enable_result(self, res):
        self.res = res
        self.result.setEnabled(True)
        print('VideoPlayer, result is enabled')
        pass

    def abrir(self):
        # fileName, _ = QFileDialog.getOpenFileName(self, "Selecciona los mediose",
        #         ".", "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")

        # if fileName != '':
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(self.fileName)))
        self.playButton.setEnabled(True)
        #self.statusBar.showMessage(fileName)
        self.play()

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())

    def result_window(self):
        print("answer: ", self.res)
class VideoPlayer(QWidget):
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        iconSize = QSize(12, 12)
        videoWidget = QVideoWidget()

        openButton = QPushButton("Open Video")
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setFont(QFont("Noto Sans", 10))
        openButton.clicked.connect(self.abrir)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(iconSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        #进度条
        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        #音量条
        self.volumeSlider = QSlider(Qt.Horizontal)
        self.volumeSlider.setRange(0, 100)
        self.volumeSlider.sliderMoved.connect(self.setVolume)

        self.volumeLabel = QLabel()
        self.volumeLabel.setText("    Volume Bar --> ")
        self.volumeLabel.setFont(QFont("Noto Sans", 10, QFont.Bold))

        #Information bar
        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layoutLine2 = QHBoxLayout()
        layoutLine2.setContentsMargins(0, 0, 0, 0)
        layoutLine2.addWidget(self.volumeLabel)
        layoutLine2.addWidget(self.volumeSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addLayout(layoutLine2)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.volumeChanged.connect(self.volumeChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

    def abrir(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Selecciona los mediose", ".",
            "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        print("Play state:", state)
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

        v = self.volumeSlider.value()
        pause = False
        global forwardLock
        global backwardLock
        global upLock
        global downLock
        f = open("result.txt", "r+")
        data = f.readline()

        print("Reading txt...")
        print("Data read from txt: ", data)
        if data == "[4]":
            pause = True
            self.mediaPlayer.pause()
            self.mediaStateChanged(2)
            f.close()
            while pause:
                f = open("result.txt", "r+")
                l = f.readline()
                if l == "[3]":
                    pause = False
                    self.mediaPlayer.play()
                    self.mediaStateChanged(1)
                f.close()

        if data == "[3]" and forwardLock == 0:
            f.close()
            forwardLock = 1
            self.setPosition(position + 20000)
            f = open("result.txt", "w")
            f.write('no motion')
            f.close()
        elif data != "[3]" and forwardLock == 1:
            forwardLock = 0
            f.close()
        else:
            f.close()

        if data == "[2]" and backwardLock == 0:

            f.close()
            backwardLock = 1
            if position > 20000:
                self.setPosition(position - 20000)
            else:
                self.setPosition(0)
            f = open("result.txt", "w")
            f.write('no motion')
            f.close()
        elif data != "[2]" and backwardLock == 1:
            backwardLock = 0
            f.close()
        else:
            f.close()

        if data == "[1]" and upLock == 0:
            f.close()
            upLock = 1
            print(v)
            if v + 15 > 100:
                self.setVolume(100)
            else:
                v += 15
                self.setVolume(v)
            print(v)
            print("Volume set")
            f = open("result.txt", "w")
            f.write('no motion')
            f.close()
        elif data != "[1]" and upLock == 1:
            upLock = 0
            f.close()
        else:
            f.close()

        if data == "[0]" and downLock == 0:
            f.close()
            downLock = 1
            print(v)
            if v - 15 < 0:
                self.setVolume(0)
            else:
                v -= 15
                self.setVolume(v)
            print(v)
            print("Volume set")
            f = open("result.txt", "w")
            f.write('no motion')
            f.close()
        elif data != "[0]" and downLock == 1:
            downLock = 0
            f.close()
        else:
            f.close()

        self.setVolume(v)
        print("Position changed:", position)

    def volumeChanged(self, value):
        self.volumeSlider.setValue(value)

    def setVolume(self, value):
        self.mediaPlayer.setVolume(value)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)
        print("Duration changed:", duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)
        print("Position set:", position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
コード例 #9
0
class Player(QWidget):
    """Sub-class of QWidget"""
    def __init__(self, parent=None, *args, **kwargs):
        """Initialize class attributes"""
        super(Player, self).__init__(parent, *args, **kwargs)
        self.init_ui()

    def init_ui(self):
        """Create local components"""
        # loop
        self.loop = False
        # time label text
        self.time_text = '{:0>2d}:{:0>2d}:{:0>2d}/{:0>2d}:{:0>2d}:{:0>2d}'
        self.hours = self.minutes = self.seconds = 0
        # create media player object
        self.mediaPlayer = QMediaPlayer(self, QMediaPlayer.VideoSurface)
        # create videowidget object
        self.videoWidget = QVideoWidget()

        # create open button
        self.btn_size = QSize(16, 16)
        openButton = Button("Open")
        openButton.setToolTip("Open Media File")
        openButton.setStatusTip("Open Media File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(self.btn_size)
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("Icons/Open.bmp")))
        # openButton.setStyleSheet("background-color: #B0C4DE")
        openButton.clicked.connect(self.abrir)

        # create play button
        self.playButton = Button()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(self.btn_size)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        # self.playButton.setStyleSheet("background-color: #B0C4DE")
        self.playButton.clicked.connect(self.play)

        # create slider
        self.positionSlider = PositionSlider(self.mediaPlayer, Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.setObjectName("positionSlider")

        # create status bar
        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto sans", 8))
        self.statusBar.setFixedHeight(14)
        self.statusBar.setStyleSheet('color:#ffffff')

        # create duration time label
        self.durationLabel = QLabel()
        self.durationLabel.setStyleSheet(
            'background-color:rgba(255, 255, 255, 0)')
        self.durationLabel.setText('00:00:00/00:00:00')

        # create hbox layout
        controlLayoutWidget = QWidget(self)
        controlLayout = QHBoxLayout(controlLayoutWidget)
        controlLayoutWidget.setLayout(controlLayout)
        controlLayout.setContentsMargins(2, 2, 2, 2)
        # set widgets to the hbox layout
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)
        controlLayout.addWidget(self.durationLabel)
        # change hbox color
        controlLayoutWidget.setStyleSheet(
            'background-color:rgba(255, 255, 255, 50)')
        controlLayoutWidget.setWindowOpacity(0.1)

        # create vbox layout
        self.layout = QVBoxLayout()
        self.layout.setSpacing(0)
        # set widgets to vbox layout
        self.layout.addWidget(self.videoWidget)
        self.layout.addWidget(controlLayoutWidget)
        self.sub_controls()
        self.layout.addWidget(self.statusBar)

        self.setLayout(self.layout)

        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage('{:->33s}{:-<33s}'.format("Have Fun", ""))
        self.key_bindings()

    def key_bindings(self):
        # bind Keys to methods
        self.onplaypause = self.create_shortcut(Qt.Key_Space, self.videoWidget,
                                                self.play)  # Space key for

        self.on_fscreen = self.create_shortcut(
            Qt.Key_F, self.videoWidget,
            self.toggle_fullscreen)  # F key for fullscreen on

        self.onforward = self.create_shortcut(
            Qt.Key_Right, self.videoWidget,
            self.forward)  # Right key for forward

        self.redvolume = self.create_shortcut(
            Qt.Key_Down, self.videoWidget,
            self.red_volume)  # Down key reduce volume

        self.incvolume = self.create_shortcut(
            Qt.Key_Up, self.videoWidget,
            self.inc_volume)  # Up key increase volume

        self.onsetloop = self.create_shortcut(
            "L",
            self.videoWidget,  # L key for repeat on,
            (lambda self=self: self.repeat.toggle() or self.play_again()))

        self.onrewind = self.create_shortcut(
            Qt.Key_Left, self.videoWidget, self.rewind)  # Left key for rewind

        self.volmute = self.create_shortcut(Qt.Key_M, self.videoWidget,
                                            self.mute)  # M for mute and unmute

        self.onopen = self.create_shortcut('Ctrl+O', self.videoWidget,
                                           self.abrir)  # Ctrl+O for open

        self.onstop = self.create_shortcut(Qt.Key_S, self.videoWidget,
                                           self.stop_media)  # S key for stop

    def create_shortcut(self, sequence, widget, obj):
        """generate key shortcuts"""
        return QShortcut(QKeySequence(sequence),
                         widget,
                         obj,
                         context=Qt.ApplicationShortcut)

    def sub_controls(self):
        """Repeat, volume, and mute controls"""
        # repeat button
        self.repeat = Button()
        self.repeat.setCheckable(True)
        self.repeat.toggle()
        self.repeat.setIconSize(self.btn_size)
        self.repeat.setFixedHeight(24)
        self.repeat.setFixedWidth(26)
        self.repeat.setToolTip("repeat")
        self.repeat.setStatusTip("repeat")

        # Icons to correspond with button state
        icon = QIcon()
        icon.addPixmap(QPixmap(os.path.join(FOLDER, "Icons/repeat(1).png")),
                       QIcon.Normal, QIcon.On)
        icon.addPixmap(QPixmap(os.path.join(FOLDER, "Icons/repeat(2).png")),
                       QIcon.Active)
        self.repeat.setIcon(icon)
        # self.repeat.setStyleSheet("background-color: #B0C4DE; margin: 0px 0px 0px 2px;")
        self.repeat.clicked.connect(self.play_again)

        # stop button
        self.stop = Button()
        self.stop.setIconSize(self.btn_size)
        self.stop.setFixedHeight(24)
        self.stop.setFixedWidth(26)
        self.stop.setToolTip("Stop playing media")
        self.stop.setStatusTip("Stop playing media")
        self.stop.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        # self.stop.setStyleSheet("background-color: #B0C4DE; margin: 0px 0px 0px 2px;")
        self.stop.clicked.connect(self.stop_media)

        # volume slider
        self.volumeSlider = VolumeSlider(self.mediaPlayer, Qt.Horizontal)
        self.volumeSlider.setRange(0, 100)
        self.volumeSlider.setFixedWidth(200)
        self.mediaPlayer.setVolume(50)
        self.volumeSlider.sliderMoved.connect(self.set_volume)

        # volume button
        self.volume = Button(self)
        self.volume.setIconSize(self.btn_size)
        self.volume.setFixedHeight(24)
        self.volume.setFixedWidth(26)
        self.volume.setToolTip("Mute or Unmute")
        self.volume.setStatusTip("Mute or Unmute")
        self.volume.setIcon(self.style().standardIcon(QStyle.SP_MediaVolume))
        # self.volume.setStyleSheet("background-color: #B0C4DE; margin: 0px 0px 0px 2px;")
        self.volume.clicked.connect(self.mute)

        # create control widget
        subControlWidget = QWidget(self)
        subControlWidget.setStyleSheet(
            'background-color:rgba(255, 255, 255, 30)')
        # create Horizontal Layout
        subControlLayout = QHBoxLayout(subControlWidget)
        subControlLayout.setContentsMargins(0, 0, 0, 0)
        subControlLayout.addWidget(self.repeat, 0, Qt.AlignLeft)
        subControlLayout.addWidget(self.stop, 1, Qt.AlignLeft)
        # sub layout for volume control
        self.sub_layout = QHBoxLayout()
        self.sub_layout.addWidget(self.volume)
        self.sub_layout.addWidget(self.volumeSlider)
        subControlLayout.addLayout(self.sub_layout)
        subControlLayout.setContentsMargins(2, 2, 2, 2)

        self.layout.addWidget(subControlWidget)

    def abrir(self, event=None, url=None):
        """" Equivalent to open for most GUIs"""
        fileName = None
        if self.videoWidget.isFullScreen():
            self.toggle_fullscreen()
        if not url:
            fileName, _ = QFileDialog.getOpenFileName(self, "Select media")
            if fileName:
                self.mediaPlayer.setMedia(
                    QMediaContent(QUrl.fromLocalFile(fileName)))
        else:
            self.mediaPlayer.setMedia(QMediaContent(QUrl(url)))
        if url or fileName:
            self.volumeSlider.setValue(self.mediaPlayer.volume())
            self.playButton.setEnabled(True)
            self.statusBar.showMessage((fileName or url))
            if not self.loop:
                self.play()

    def play(self):
        """Start media player"""
        if self.playButton.isEnabled():
            if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
                self.mediaPlayer.pause()
            else:
                self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        """Callback for media player state change"""
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))
        if state == QMediaPlayer.StoppedState and self.loop:
            self.play()

    def positionChanged(self, position):
        """Callback for media player position change"""
        if self.mediaPlayer.state() == QMediaPlayer.StoppedState:
            position = 0
        self.positionSlider.setValue(position)
        hours, position = position // 3600000, position % 3600000
        minutes, position = position // 60000, position % 60000
        seconds = position // 1000
        self.durationLabel.setText(
            self.time_text.format(hours, minutes, seconds, self.hours,
                                  self.minutes, self.seconds))

    def durationChanged(self, duration):
        """Callback for media player duration of media change"""
        self.positionSlider.setRange(0, duration)
        self.hours, duration = duration // 3600000, duration % 3600000
        self.minutes, duration = duration // 60000, duration % 60000
        self.seconds = duration // 1000
        self.durationLabel.setText(
            self.time_text.format(0, 0, 0, self.hours, self.minutes,
                                  self.seconds))

    def setPosition(self, position):
        """set media player play position"""
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        """Callback for multiplayer errors"""
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())

    def play_again(self):
        """Set repeat on or off"""
        self.loop = not self.loop

    def stop_media(self):
        """Callback for stop button"""
        if self.loop:
            self.loop = False
            self.repeat.toggle()
        self.mediaPlayer.stop()

    def toggle_fullscreen(self):
        """Toggle in or out of fullscreen mode"""
        self.videoWidget.setWindowFlags(Qt.FramelessWindowHint
                                        | Qt.WindowStaysOnTopHint)
        if self.videoWidget.isFullScreen():
            self.videoWidget.setFullScreen(False)
            self.videoWidget.setWindowState(Qt.WindowNoState)
            self.videoWidget.setParent(self)
            self.layout.insertWidget(0, self.videoWidget)
            self.videoWidget.showNormal()
            self.show()
        else:
            self.videoWidget.setFullScreen(True)
            self.hide()

    def rewind(self, lapse=2500):
        """Rewind the current media file by 1 second"""
        new_position = self.mediaPlayer.position() - lapse
        self.setPosition(new_position)

    def forward(self, lapse=2500):
        """Forward media file by 1 second"""
        new_position = self.mediaPlayer.position() + lapse
        self.setPosition(new_position)

    def set_volume(self, vol=0):
        """Set media player volume volume"""
        if vol:
            self.mediaPlayer.setVolume(vol)

    def red_volume(self, vol=1):
        """Reduce volume by a factor of 0.01"""
        volume = self.mediaPlayer.volume()
        if volume >= 0:
            new_volume = volume - 1
            self.volumeSlider.setValue(new_volume)
            self.set_volume(new_volume)

    def inc_volume(self, vol=1):
        """Increase volume by a factor of 0.01"""
        volume = self.mediaPlayer.volume()
        if self.mediaPlayer.isMuted():
            self.mediaPlayer.setMuted(False)
            self.volume.setIcon(self.style().standardIcon(
                QStyle.SP_MediaVolume))
        if volume <= 100:
            new_volume = volume + 1
            self.volumeSlider.setValue(new_volume)
            self.set_volume(new_volume)

    def mute(self):
        """Mute media player"""
        if self.mediaPlayer.isMuted():
            self.mediaPlayer.setMuted(False)
            self.volume.setIcon(self.style().standardIcon(
                QStyle.SP_MediaVolume))
        else:
            self.mediaPlayer.setMuted(True)
            self.volume.setIcon(self.style().standardIcon(
                QStyle.SP_MediaVolumeMuted))
class VideoPlayer(QWidget):
    def __init__(self):
        super().__init__()

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        openButton = QPushButton("Open Video")
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 8))
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        openButton.clicked.connect(self.abrir)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")
        self.video_name = None

        self.shortcut = QShortcut(QKeySequence(Qt.Key_Up), self)
        self.shortcut.activated.connect(self.volumeUp)
        self.shortcut = QShortcut(QKeySequence(Qt.Key_Down), self)
        self.shortcut.activated.connect(self.volumeDown)

        self.video_id = None

    def abrir(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Selecciona los mediose", ".",
            "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")

        if fileName != '':
            r = requests.post(POST_DATA_URL_VIDEO, json=dict(name=fileName))
            self.video_id = int(r.text)
            self.video_name = os.path.basename(fileName)
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def get_video_id(self):
        return self.video_id

    def pause_video(self):
        self.mediaPlayer.pause()

    def resume_video(self):
        self.mediaPlayer.play()

    def volumeUp(self):
        self.mediaPlayer.setVolume(self.mediaPlayer.volume() + 10)
        print("Volume: " + str(self.mediaPlayer.volume()))

    def volumeDown(self):
        self.mediaPlayer.setVolume(self.mediaPlayer.volume() - 10)
        print("Volume: " + str(self.mediaPlayer.volume()))

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def is_paused(self):
        return not self.mediaPlayer.state() == QMediaPlayer.PlayingState

    def get_position(self):
        return self.mediaPlayer.position()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
コード例 #11
0
ファイル: schnipp_plain.py プロジェクト: prometheus42/schnipp
class VideoPlayer(QWidget):
    """
    Source: https://stackoverflow.com/a/57842233
    """
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        self.overlay = PaintOverlay(videoWidget)
        self.overlay.setVisible(True)
        #self.overlay.hide()
        # self.button.clicked.connect(
        #    lambda: self.overlay.setVisible(False) if self.overlay.isVisible() else self.overlay.setVisible(True))

        openButton = QPushButton("Open Video")
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 8))
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        openButton.clicked.connect(self.abrir)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

    def abrir(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, 'Choose video file...', '.',
            'Video Files (*.mp4 *.flv *.ts *.mts *.avi *.mkv)')

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())

    def resizeEvent(self, event):
        self.overlay.resize(event.size())
        event.accept()
コード例 #12
0
ファイル: main.py プロジェクト: adriel3005/SrtEditor
class Main(QMainWindow, Ui_MainWindow):

    lyricList = []
    lyricCount = 0
    videoPath = ""
    videoName = ""
    darkMode = False
    redMode = False
    blueMode = False
    latestStartTime = QtCore.QTime(0, 0, 0)
    latestEndTime = QtCore.QTime(0, 0, 0)

    def __init__(self):
        super(Main, self).__init__()
        self.setupUi(self)

        self.removeButton.clicked.connect(self.OnRemove)
        self.addButton.clicked.connect(lambda: self.OnAddButton())
        self.createSRTButton.clicked.connect(self.CreateSRT)
        self.actionOpen_Video.triggered.connect(self.OpenVideoFile)

        #Modes
        self.actionDark_Mode_2.triggered.connect(
            lambda: self.ToggleDarkMode(self.darkMode))
        self.actionLight_Mode.triggered.connect(self.ToggleLightMode)
        self.actionRed_Palette.triggered.connect(
            lambda: self.ToggleRedMode(self.redMode))
        self.actionBlue_Palette.triggered.connect(
            lambda: self.ToggleBlueMode(self.blueMode))

        #Video
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        openButton = QPushButton("Abrir Video")
        openButton.setToolTip("Abrir Video")
        openButton.setStatusTip("Abrir Video")
        openButton.setFixedHeight(40)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 15))
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        openButton.clicked.connect(self.open)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(65)
        self.playButton.setFixedWidth(60)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        #self.QVideoBoxVLayout = QVBoxLayout()
        self.QVideoBoxVLayout.addWidget(videoWidget)
        self.QVideoBoxVLayout.addLayout(controlLayout)
        self.QVideoBoxVLayout.addWidget(self.statusBar)

        self.setLayout(self.QVideoBoxVLayout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        # Every 200 ms
        self.mediaPlayer.setNotifyInterval(200)
        self.translator = google_translator()
        self.statusBar.showMessage("Listo")

        # connect buttons playback
        self.fiveBack.clicked.connect(lambda: self.TimeSkip(5, False))
        self.tenBack.clicked.connect(lambda: self.TimeSkip(10, False))
        self.oneMBack.clicked.connect(lambda: self.TimeSkip(.1, False))
        self.fiveForward.clicked.connect(lambda: self.TimeSkip(5, True))
        self.tenForward.clicked.connect(lambda: self.TimeSkip(10, True))
        self.oneMForward.clicked.connect(lambda: self.TimeSkip(.1, True))

        #Import srt
        self.actionInportar_Subtitulos_srt.triggered.connect(self.ImportSRT)

    def ToggleLightMode(self):
        light_palette = QPalette()
        appctxt.app.setPalette(light_palette)

    def ToggleRedMode(self, dark):

        if not dark:
            red_palette = QPalette()

            red_palette.setColor(QPalette.Window, QColor(100, 53, 53))
            red_palette.setColor(QPalette.WindowText, Qt.white)
            red_palette.setColor(QPalette.Base, QColor(25, 25, 25))
            red_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
            red_palette.setColor(QPalette.ToolTipBase, Qt.white)
            red_palette.setColor(QPalette.ToolTipText, Qt.white)
            red_palette.setColor(QPalette.Text, Qt.white)
            red_palette.setColor(QPalette.Button, QColor(53, 53, 53))
            red_palette.setColor(QPalette.ButtonText, Qt.white)
            red_palette.setColor(QPalette.BrightText, Qt.red)
            red_palette.setColor(QPalette.Link, QColor(42, 130, 218))
            red_palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
            red_palette.setColor(QPalette.HighlightedText, Qt.black)

            appctxt.app.setPalette(red_palette)
            #appctxt.app.setStyleSheet(
            #    "QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }")
            self.redMode = True
        else:
            light_palette = QPalette()
            appctxt.app.setPalette(light_palette)
            self.redMode = False

    def ToggleBlueMode(self, dark):

        if not dark:
            blue_palette = QPalette()

            blue_palette.setColor(QPalette.Window, QColor(53, 53, 100))
            blue_palette.setColor(QPalette.WindowText, Qt.white)
            blue_palette.setColor(QPalette.Base, QColor(25, 25, 25))
            blue_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
            blue_palette.setColor(QPalette.ToolTipBase, Qt.white)
            blue_palette.setColor(QPalette.ToolTipText, Qt.white)
            blue_palette.setColor(QPalette.Text, Qt.white)
            blue_palette.setColor(QPalette.Button, QColor(53, 53, 53))
            blue_palette.setColor(QPalette.ButtonText, Qt.white)
            blue_palette.setColor(QPalette.BrightText, Qt.red)
            blue_palette.setColor(QPalette.Link, QColor(42, 130, 218))
            blue_palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
            blue_palette.setColor(QPalette.HighlightedText, Qt.black)

            appctxt.app.setPalette(blue_palette)
            #appctxt.app.setStyleSheet(
            #    "QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }")
            self.blueMode = True
        else:
            light_palette = QPalette()
            appctxt.app.setPalette(light_palette)
            self.blueMode = False

    def ToggleDarkMode(self, dark):

        if not dark:
            dark_palette = QPalette()

            dark_palette.setColor(QPalette.Window, QColor(53, 53, 53))
            dark_palette.setColor(QPalette.WindowText, Qt.white)
            dark_palette.setColor(QPalette.Base, QColor(25, 25, 25))
            dark_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
            dark_palette.setColor(QPalette.ToolTipBase, Qt.white)
            dark_palette.setColor(QPalette.ToolTipText, Qt.white)
            dark_palette.setColor(QPalette.Text, Qt.white)
            dark_palette.setColor(QPalette.Button, QColor(53, 53, 53))
            dark_palette.setColor(QPalette.ButtonText, Qt.white)
            dark_palette.setColor(QPalette.BrightText, Qt.red)
            dark_palette.setColor(QPalette.Link, QColor(42, 130, 218))
            dark_palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
            dark_palette.setColor(QPalette.HighlightedText, Qt.black)

            appctxt.app.setPalette(dark_palette)
            #appctxt.app.setStyleSheet(
            #    "QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }")
            self.darkMode = True
        else:
            light_palette = QPalette()
            appctxt.app.setPalette(light_palette)
            self.darkMode = False

    # Currently only supports mp4
    def ImportSRT(self):
        fileName, _ = QFileDialog.getOpenFileName(self,
                                                  "Selecciona los mediose",
                                                  ".", "SRT Files (*.srt)")
        videoFilePath = (fileName.split(".")[0]) + ".mp4"
        print(videoFilePath)
        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(videoFilePath)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(videoFilePath)
            self.play()
            self.videoPath = videoFilePath
            self.videoName = self.videoPath.split("/")[-1]

            # Delete existing objects
            count = self.lyricCount
            for i in range(count):
                self.OnRemove()

            # Create video objects
            self.CreateLyricObjectsFromSRT(fileName)

    def CreateLyricObjectsFromSRT(self, path):
        srtFile = open(path, "r", encoding="utf-8")

        # General srt format is
        # index
        # start time --> end time
        # lyrics
        # empty line

        #--- Temp variables
        index = 1
        foundStart = False
        foundEnd = False
        foundLyrics = False
        lyricsString = ""
        subStringTime = "-->"
        startString = ""
        endString = ""
        # iterate through srt file
        for line in srtFile:
            # after times is lyrics
            if foundStart and foundEnd and not foundLyrics:
                # until we find empty
                if line == "\n":
                    foundLyrics = True

                if lyricsString != "":
                    lyricsString = lyricsString + line.strip('\n').rstrip()
                else:
                    lyricsString = line
            # times
            if subStringTime in line:
                startString = line.split(" --> ")[0].rstrip()
                endString = line.split(" --> ")[-1].rstrip()
                if startString != "":
                    foundStart = True
                else:
                    print("No start time for item", index)
                if endString != "":
                    foundEnd = True
                else:
                    print("No end time for item ", index)
            index = index + 1
            if foundLyrics and startString != "" and endString != "":
                #Create lyrics object here

                startQTime = self.ReturnQTimeObject(startString)
                endQtime = self.ReturnQTimeObject(endString)

                self.OnAdd(start=startQTime, end=endQtime, lyrics=lyricsString)
                lyricsString = ""
                foundLyrics = False
                foundStart = False
                foundEnd = False

        srtFile.close()

    def ReturnQTimeObject(self, timeString):
        hours = timeString.split(":")[0]
        minutes = timeString.split(":")[1]
        secondsAndMsec = timeString.split(":")[2]
        seconds = secondsAndMsec.split(",")[0]
        mSeconds = secondsAndMsec.split(",")[1]

        return QtCore.QTime(int(hours), int(minutes), int(seconds),
                            int(mSeconds))

    def TimeSkip(self, amount, forward):
        if forward:
            tempPosition = self.mediaPlayer.position()
            self.setPosition(tempPosition + int(amount * 1000))
        else:
            tempPosition = self.mediaPlayer.position()
            self.setPosition(tempPosition - int(amount * 1000))

    def SetCurrentTimeText(self, millis):
        millis = int(millis)
        seconds = (millis / 1000) % 60
        seconds = int(seconds)
        minutes = (millis / (1000 * 60)) % 60
        minutes = int(minutes)

        sMillis = self.ThreeCharSyntax(str(millis))
        sSeconds = self.TwoCharSyntax(str(seconds))
        sMinutes = self.TwoCharSyntax(str(minutes))

        self.currentTime.setText("Tiempo Actual " + sMinutes + ":" + sSeconds +
                                 ":" + sMillis)

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Selecciona los mediose", ".",
            "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()
            self.videoPath = fileName
            self.videoName = self.videoPath.split("/")[-1]

    def OpenVideoFile(self):
        #self.videoPath, _ = QFileDialog.getOpenFileName(self, 'Open File', options=QFileDialog.DontUseNativeDialog)

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        self.videoPath, _ = QFileDialog.getOpenFileName(
            self,
            "Select Video File",
            "",
            "Video File (*.mp4 *.avi *.ogv)",
            options=options)
        self.videoName = self.videoPath.split("/")[-1]

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
            # Show exact time when paused
            self.SetCurrentTimeText(self.mediaPlayer.position())
            self.SetCurrentLyrics(self.mediaPlayer.position())
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)
        self.SetCurrentTimeText(self.mediaPlayer.position())
        self.SetCurrentLyrics(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())

    def OnRemove(self):
        if len(self.lyricList) > 0:
            self.verticalLayout.removeWidget(self.lyricList[-1])
            sip.delete(self.lyricList[-1])
            self.lyricCount -= 1
            del (self.lyricList[-1])
            self.progressBar.setProperty("value", 0)

    def OnAddButton(self):
        if self.lyricCount > 0:

            endTimeObject = self.lyricList[self.lyricCount - 1].findChild(
                QtWidgets.QTimeEdit, "endTime").time()
            newTime = QtCore.QTime(0, endTimeObject.minute(),
                                   endTimeObject.second(),
                                   endTimeObject.msec() + 1)
            self.OnAdd(start=newTime, end=newTime)
            self.scrollArea.ensureWidgetVisible(self.lyricGroup)
            max = self.scrollArea.verticalScrollBar().maximum()
            self.scrollArea.verticalScrollBar().setValue(999999)

        else:
            self.OnAdd()
            max = self.scrollArea.verticalScrollBar().maximum()
            self.scrollArea.verticalScrollBar().setValue(max)

    def OnAdd(self,
              start=QtCore.QTime(0, 0, 0),
              end=QtCore.QTime(0, 0, 0),
              lyrics=""):
        self.lyricGroup = QtWidgets.QWidget(self.scrollAreaWidgetContents)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum,
                                           QtWidgets.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.lyricGroup.sizePolicy().hasHeightForWidth())
        self.lyricGroup.setSizePolicy(sizePolicy)
        self.lyricGroup.setMinimumSize(QtCore.QSize(0, 150))
        self.lyricGroup.setMaximumSize(QtCore.QSize(600, 100))
        self.lyricGroup.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.lyricGroup.setObjectName("lyricGroup")

        self.gridLayout = QtWidgets.QGridLayout(self.lyricGroup)
        self.gridLayout.setObjectName("gridLayout")
        self.startLabel = QtWidgets.QLabel(self.lyricGroup)
        font = QtGui.QFont()
        font.setPointSize(10)
        self.startLabel.setFont(font)
        self.startLabel.setObjectName("startLabel")
        self.startLabel.setText("Inicio:")
        self.gridLayout.addWidget(self.startLabel, 0, 0, 1, 1)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.lyricsText = QtWidgets.QPlainTextEdit(self.lyricGroup)
        self.lyricsText.setObjectName("lyricsText")
        self.lyricsText.setFont(font)
        self.lyricsText.setPlainText(lyrics)
        self.gridLayout.addWidget(self.lyricsText, 0, 2, 2, 1)
        self.endLabel = QtWidgets.QLabel(self.lyricGroup)
        font = QtGui.QFont()
        font.setPointSize(10)
        self.endLabel.setFont(font)
        self.endLabel.setObjectName("endLabel")
        self.endLabel.setText("Final:")
        self.gridLayout.addWidget(self.endLabel, 1, 0, 1, 1)

        self.endTime = QtWidgets.QTimeEdit(self.lyricGroup)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum,
                                           QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.endTime.sizePolicy().hasHeightForWidth())
        self.endTime.setSizePolicy(sizePolicy)
        self.endTime.setMinimumSize(QtCore.QSize(100, 30))
        self.endTime.setMaximumSize(QtCore.QSize(75, 16777215))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.endTime.setFont(font)
        self.endTime.setObjectName("endTime")
        self.endTime.setDisplayFormat("mm:ss:zzz")
        self.gridLayout.addWidget(self.endTime, 1, 1, 1, 1)
        self.endTime.setCurrentSectionIndex(0)
        self.endTime.setTime(end)

        self.startTime = QtWidgets.QTimeEdit(self.lyricGroup)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum,
                                           QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.startTime.sizePolicy().hasHeightForWidth())
        self.startTime.setSizePolicy(sizePolicy)
        self.startTime.setMinimumSize(QtCore.QSize(100, 30))
        self.startTime.setMaximumSize(QtCore.QSize(75, 16777215))
        font = QtGui.QFont()
        font.setPointSize(11)
        self.startTime.setFont(font)
        self.startTime.setCurrentSection(QtWidgets.QDateTimeEdit.MSecSection)
        self.startTime.setCurrentSection(2)
        self.startTime.setCurrentSectionIndex(2)
        self.startTime.setTime(start)
        self.startTime.setObjectName("startTime")
        self.startTime.setDisplayFormat("mm:ss:zzz")
        #self.startTime.timeChanged.connect(lambda:self.IncreaseTime(self.endTime))

        self.gridLayout.addWidget(self.startTime, 0, 1, 1, 1)
        self.verticalLayout.addWidget(self.lyricGroup, 0, QtCore.Qt.AlignTop)

        # add to list
        self.lyricList.append(self.lyricGroup)
        self.lyricCount += 1
        self.progressBar.setProperty("value", 0)

    def IncreaseTime(self, endTime):
        if endTime.time().currentTime() <= self.startTime.time().currentTime():
            startTimeObject = self.startTime.time()
            newTime = QtCore.QTime(0, startTimeObject.minute(),
                                   startTimeObject.second(),
                                   startTimeObject.msec())
            endTime.setTime(newTime)

    def CreateSRT(self):
        # For progress bar
        self.progressCount = 1

        itemSelected = self.textAppendList.currentText()

        # Check to see if file has been open
        if self.videoPath:

            self.newVideoPath = self.videoPath.split(
                ".")[0] + " - NoTranslation" + ".srt"
            srtFile = open(self.newVideoPath, "w", encoding="utf-8")

            if self.translateEnglish.isChecked(
            ) and self.translateSpanish.isChecked():
                self.newVideoPath = self.videoPath.split(".")[0] + ".srt"
                srtFile = open(self.newVideoPath, "w", encoding="utf-8")
            elif self.translateEnglish.isChecked():
                self.newVideoPath = self.videoPath.split(
                    ".")[0] + " - English" + ".srt"
                srtFile = open(self.newVideoPath, "w", encoding="utf-8")
            elif self.translateSpanish.isChecked():
                self.newVideoPath = self.videoPath.split(
                    ".")[0] + " - Spanish" + ".srt"
                srtFile = open(self.newVideoPath, "w", encoding="utf-8")

            for i in range(len(self.lyricList)):
                # lyrics
                childLyricsText = self.lyricList[i].findChild(
                    QtWidgets.QPlainTextEdit, "lyricsText")

                # start Time
                ## Format: hh:mm:ss:zzz
                childStartTime = self.lyricList[i].findChild(
                    QtWidgets.QTimeEdit, "startTime").time()

                # end Time
                childEndTime = self.lyricList[i].findChild(
                    QtWidgets.QTimeEdit, "endTime").time()

                #print("Start time : " + str(childStartTime.minute()) + str(childStartTime.second()) + str(
                #    childStartTime.msec()))

                # Number of iteration
                srtFile.write(str(self.progressCount) + "\n")

                # start time
                minuteTime = self.TwoCharSyntax(str(childStartTime.minute()))
                secondTime = self.TwoCharSyntax(str(childStartTime.second()))
                mSecTime = self.ThreeCharSyntax(str(childStartTime.msec()))
                srtFile.write("00:" + minuteTime + ":" + secondTime + "," +
                              mSecTime + " --> ")

                # end time
                minuteTime = self.TwoCharSyntax(str(childEndTime.minute()))
                secondTime = self.TwoCharSyntax(str(childEndTime.second()))
                mSecTime = self.ThreeCharSyntax(str(childEndTime.msec()))
                srtFile.write("00:" + minuteTime + ":" + secondTime + "," +
                              mSecTime)

                # Lyrics

                if self.translateEnglish.isChecked(
                ) and self.translateSpanish.isChecked():
                    result = self.translator.translate(
                        childLyricsText.toPlainText(), lang_tgt='en')
                    srtFile.write("\n" + result.rstrip().replace("\n", " ") +
                                  "\n")
                    result = self.translator.translate(
                        childLyricsText.toPlainText(), lang_tgt='es')
                    srtFile.write(itemSelected +
                                  result.rstrip().replace("\n", " ") +
                                  itemSelected + "\n\n")
                elif self.translateEnglish.isChecked():
                    result = self.translator.translate(
                        childLyricsText.toPlainText(), lang_tgt='en')
                    srtFile.write("\n" + result.rstrip().replace("\n", " ") +
                                  "\n\n")
                elif self.translateSpanish.isChecked():
                    result = self.translator.translate(
                        childLyricsText.toPlainText(), lang_tgt='es')
                    srtFile.write("\n" + itemSelected +
                                  result.rstrip().replace("\n", " ") +
                                  itemSelected + "\n\n")
                else:
                    srtFile.write(
                        "\n" +
                        childLyricsText.toPlainText().replace("\n", " ") +
                        "\n\n")
                progress = self.progressCount / self.lyricCount
                print(int(progress * 100))
                self.progressBar.setProperty("value", int(progress * 100))
                self.progressCount += 1

                if progress == 1:
                    print(self.newVideoPath)
                    openPath = self.newVideoPath.replace('/', '\\')
                    subprocess.Popen(r'explorer /select,"' + openPath + '"')

        else:
            self.ShowPopUpMessage()

    # check if string is only 1 character
    def TwoCharSyntax(self, str):
        if len(str) != 2:
            return "0" + str
        else:
            return str

    #Make into 3 char
    def ThreeCharSyntax(self, str):
        if len(str) == 1:
            return "00" + str
        elif len(str) == 2:
            return "0" + str
        elif len(str) >= 4:
            return str[-3:]
        else:
            return str

    def SetCurrentLyrics(self, currentTime):

        showingLyrics = False
        for i in range(len(self.lyricList)):
            # start Time
            ## Format: hh:mm:ss:zzz
            childStartTime = self.lyricList[i].findChild(
                QtWidgets.QTimeEdit, "startTime").time()

            # convert to msecs
            minuteTime = childStartTime.minute()
            secondTime = childStartTime.second()
            mSecTime = childStartTime.msec()
            startTotal = (minuteTime * 60000) + (secondTime * 1000) + mSecTime

            # end Time
            childEndTime = self.lyricList[i].findChild(QtWidgets.QTimeEdit,
                                                       "endTime").time()

            # convert to msecs
            minuteTime = childEndTime.minute()
            secondTime = childEndTime.second()
            mSecTime = childEndTime.msec()
            endTotal = (minuteTime * 60000) + (secondTime * 1000) + mSecTime

            if currentTime >= startTotal and currentTime <= endTotal:
                childLyricsText = self.lyricList[i].findChild(
                    QtWidgets.QPlainTextEdit, "lyricsText")
                self.currentLyrics.setText(childLyricsText.toPlainText())
                showingLyrics = True
        if showingLyrics == False:
            self.currentLyrics.setText("")

    def ShowPopUpMessage(self):
        errorMsg = QMessageBox()
        errorMsg.setWindowTitle("Error")
        errorMsg.setText("Por favor selecciona un video primero")
        x = errorMsg.exec_()
コード例 #13
0
class VideoSplitter(QMainWindow):
    def __init__(self, parent=None):

        super(VideoSplitter, self).__init__()
        self.setWindowTitle('Video Splitter')
        self.parent = parent
        self.configure_gui()
        self.create_widgets()
        self.create_menu()
        self.showMaximized()

    def configure_gui(self):

        self.center = QWidget(self)
        self.vlayout = QVBoxLayout()
        self.hlayout = QHBoxLayout()

        self.center.setLayout(self.vlayout)
        self.setCentralWidget(self.center)
        self.vlayout.setContentsMargins(9, 9, 9, 0)
        self.vlayout.addLayout(self.hlayout, 3)

    def create_widgets(self):

        self.files = FileExplorer(self)
        self.video = Video(self)
        self.clips = Clips(self)
        self.timeline = Timeline(self)

        self.hlayout.addWidget(self.files, 1)
        self.hlayout.addWidget(self.video, 2)
        self.hlayout.addWidget(self.clips, 1)
        self.vlayout.addWidget(self.timeline, 1)

        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.statusbar.setFixedHeight(25)

    def create_menu(self):

        self.menubar = self.menuBar()

        self.menubar.triggered.connect(self.menuPressEvent)

        # File
        file = self.menubar.addMenu('File')

        # View
        help = self.menubar.addMenu('View')

        # Help
        help = self.menubar.addMenu('Help')

    def menuPressEvent(self, event=None):

        action = event.text()

    def keyPressEvent(self, event):

        key_press = event.key()

        if key_press == Qt.Key_Escape: self.close()

        elif self.parent is not None:

            self.parent.keyPressEvent(event)
コード例 #14
0
class AppView(QMainWindow):
    def __init__(self):
        super().__init__()

        # 700 is base height + (menubar.width + statusbar.width)
        self.cameraChoice = 0
        self.cWidget = QWidget()
        self.layout = QGridLayout(self.cWidget)

        self.productManagerFrame = ProductManagerFrame(self)
        self.settingButtonsFrame = SettingsButtonsFrame(self)
        self.cameraDisplayFrame = CameraDisplayFrame(self)

        self.layout.addWidget(self.cameraDisplayFrame, 0, 0, 12, 2)
        self.layout.addWidget(self.productManagerFrame, 0, 2, 13, 1)
        self.layout.addWidget(self.settingButtonsFrame, 12, 0, 1, 2)

        self.setCentralWidget(self.cWidget)
        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 1100, 30))
        self.settingsMenu = QMenu("Settings", self.menubar)
        self.applicationMenu = QMenu("Application", self.menubar)
        self.aboutMenu = QMenu("About", self.menubar)
        self.setMenuBar(self.menubar)

        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.statusbar.setFixedHeight(20)
        self.statusbar.setStyleSheet("font-size: 10px;")

        self.statusUser = QLabel()
        self.statusUser.setGeometry(QRect(0, 0, 20, 20))
        self.statusbar.addWidget(self.statusUser)

        # Actions choices
        self.selectFolderAction = QAction(parent=self, text="Select Folder")
        self.showProductsAction = QAction(parent=self,
                                          text="Show products (S)")
        self.photoAction = QAction(parent=self, text="Photo (P)")
        self.selectCameraAction = QAction(parent=self, text="Change camera")
        self.changeUserAction = QAction(parent=self, text="Change user")
        self.createUserAction = QAction(parent=self, text="Create new user")
        self.authorAction = QAction(parent=self, text="Author")
        self.scannerModeAction = QAction(parent=self, text="Scanner mode")
        self.scannerModeAction.setCheckable(True)

        self.settingsMenu.addAction(self.selectFolderAction)
        self.settingsMenu.addAction(self.selectCameraAction)
        self.settingsMenu.addAction(self.scannerModeAction)
        self.applicationMenu.addAction(self.showProductsAction)
        self.applicationMenu.addAction(self.photoAction)
        self.applicationMenu.addAction(self.changeUserAction)
        self.applicationMenu.addAction(self.createUserAction)
        self.aboutMenu.addAction(self.authorAction)
        self.menubar.addAction(self.applicationMenu.menuAction())
        self.menubar.addAction(self.settingsMenu.menuAction())
        self.menubar.addAction(self.aboutMenu.menuAction())

        self.setWindowTitle("STManager 2021 - version 1.0.0")
        self.setup()

    def getPhotoDestinationPath(self):
        return self.saveDestination

    def updateStatusbar(self):
        self.statusUser.setText(
            f"Logged as user {self.controller.getUsername()}")

    def setup(self):
        self.controller = AppController(self)
        self.productManagerFrame.setup()
        self.settingButtonsFrame.setup()
        self.cameraDisplayFrame.setup(self.controller.getScannerMode())
        self.updateStatusbar()

        # connecting ui buttons signals
        self.productManagerFrame.confirmButton.clicked.connect(
            self.controller.saveCurrentProduct)
        self.productManagerFrame.cancelButton.clicked.connect(
            self.controller.deleteCurrentProduct)
        self.settingButtonsFrame.photoButton.clicked.connect(
            self.controller.takePhoto)
        self.settingButtonsFrame.showProductsButton.clicked.connect(
            self.searchProducts)
        self.settingButtonsFrame.changeUserButton.clicked.connect(
            self.controller.switchUser)
        self.settingButtonsFrame.nextProductButton.clicked.connect(
            self.controller.nextProduct)
        self.settingButtonsFrame.prevProductButton.clicked.connect(
            self.controller.previousProduct)
        self.productManagerFrame.productBarcode.returnPressed.connect(
            self.controller.takePhoto)

        # connecting actions buttons singals
        self.selectFolderAction.triggered.connect(
            self.controller.changeSaveUrl)
        self.showProductsAction.triggered.connect(self.searchProducts)
        self.photoAction.triggered.connect(self.controller.takePhoto)
        self.selectCameraAction.triggered.connect(self.showCameraChoice)
        self.changeUserAction.triggered.connect(self.controller.switchUser)
        self.createUserAction.triggered.connect(createAccount)
        self.authorAction.triggered.connect(showInfo)
        self.scannerModeAction.triggered.connect(
            self.controller.toggleScannerMode)

        if self.controller.getScannerMode():
            self.scannerModeAction.setChecked(True)

    def keyPressEvent(self, k):
        key = k.key()
        if key == Qt.Key_P:
            self.controller.takePhoto()
        elif key == Qt.Key_Enter and self.controller.getScannerMode():
            self.controller.saveCurrentProduct()
        elif key == Qt.Key_Delete:
            self.controller.deleteCurrentProduct()

    def setCameraIndex(self, i: int):
        self.cameraChoice = i

    def cleanUp(self):
        """
        Slot connected to signal aboutToQuit from QApplication
        """
        self.controller.cleanUp()
        self.cameraDisplayFrame.turnOffCamera()
        return 0

    def getCameraIndex(self) -> int:
        return self.cameraChoice

    def getController(self) -> AppController:
        return self.controller

    def searchProducts(self):
        from utils.ProductSearcher import ProductSearcher

        p = ProductSearcher()
        p.exec()

    def showCameraChoice(self):
        self.cameraChoice = cameraChoice()
コード例 #15
0
class VideoPlayer(QWidget):
    def __init__(self, filename, parent=None):
        super(VideoPlayer, self).__init__(parent)
        self.fileName = filename

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        self.playButton = QPushButton()
        self.playButton.setEnabled(True)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")
        self.abrir()

    def abrir(self):

        if self.fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(self.fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(self.fileName)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
コード例 #16
0
class ManageData(QMainWindow):

    populateGallery = pyqtSignal()
    closedWindow = pyqtSignal(object)

    def __init__(self, parent=None):

        super(ManageData, self).__init__()
        self.setWindowTitle('Manage Data')
        self.parent = parent
        self.configure_gui()
        self.create_menu()
        self.create_widgets()
        self.showMaximized()

    def configure_gui(self):

        self.center = QWidget(self)
        self.layout = QHBoxLayout()

        self.center.setLayout(self.layout)
        self.setCentralWidget(self.center)
        self.layout.setContentsMargins(5, 0, 0, 0)
        self.layout.setSpacing(0)

    def create_widgets(self):

        self.windows = set()
        self.mysql = CONNECT()

        self.gallery = Gallery(self)
        self.preview = Preview(self, 'white')
        self.layout.addWidget(self.gallery)
        self.layout.addWidget(self.preview)

        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.statusbar.setFixedHeight(30)

        self.mysql.finishedTransaction.connect(self.select_records)
        self.mysql.finishedSelect.connect(lambda x: self.preview.update(None))
        self.mysql.finishedSelect.connect(self.gallery.clearSelection)
        self.mysql.finishedSelect.connect(self.gallery.update)
        self.mysql.finishedSelect.connect(self.update_statusbar)
        self.mysql.finishedUpdate.connect(lambda x: self.windows.discard(x))
        self.mysql.finishedDelete.connect(self.delete_records)

        self.gallery.selection.connect(self.update_preview)
        self.gallery.selection.connect(self.update_statusbar)
        self.gallery.delete.connect(self.delete_records)
        self.gallery.load_comic.connect(self.read_comic)
        self.gallery.find_artist.connect(self.find_by_artist)

        self.ribbon.selection_mode.connect(self.setSelectionMode)

    def create_menu(self):

        self.menubar = self.menuBar()
        self.toolbar = self.addToolBar('Ribbon')

        self.ribbon = Ribbon(self)
        self.toolbar.addWidget(self.ribbon)

        self.menubar.triggered.connect(self.menuPressEvent)
        self.toolbar.actionTriggered.connect(self.menuPressEvent)

        # File
        file = self.menubar.addMenu('File')
        file.addAction('Update Autocomplete')
        file.addAction('Remove Redundancies')
        file.addAction('Copy Images to')
        file.addAction('Exit')

        # View
        help = self.menubar.addMenu('View')

        # Help
        help = self.menubar.addMenu('Help')

    @pyqtSlot()
    def select_records(self):

        self.mysql.execute(self.ribbon.update_query())

    def update_records(self, source, indexes, kwargs):

        parameters = []

        for key, vals in kwargs.items():

            key = key.lower()

            if isinstance(vals, tuple):

                for val in vals[0]:

                    parameters.append(f'{key}=CONCAT({key}, " {val} ")')

                for val in vals[1]:

                    parameters.append(f'{key}=REPLACE({key}, " {val} ", " ")')

            else:
                parameters.append(f'{key}={vals}')

        return self.mysql.execute(MODIFY.format(', '.join(parameters)),
                                  indexes,
                                  many=1,
                                  source=source)

    def delete_records(self, indexes):

        if isinstance(indexes[0], tuple):

            for path, in indexes:
                (ROOT / path).unlink(True)

            return self.mysql.commit()

        message = QMessageBox.question(
            None, 'Delete', 'Are you sure you want to delete this?',
            QMessageBox.Yes | QMessageBox.No)

        if message == QMessageBox.Yes:

            paths = [(index.data(Qt.UserRole)[0], ) for index in indexes
                     if index.data(300) is not None]

            self.mysql.execute(DELETE, paths, many=1)

    def start_slideshow(self, index=None):

        if not self.gallery.total(): return

        indexes = self.gallery.table.images
        index = index if index else self.gallery.currentIndex()
        index = sum(index.data(100))
        slideshow = Slideshow(self, indexes, index)

        self.windows.add(slideshow)

    def update_preview(self, select, deselect):

        if self.gallery.total():

            if select := select.indexes(): image = select[0]

            elif indexes := self.gallery.selectedIndexes():
                image = min(indexes)

            else:
                image = None

            self.preview.update(image)
コード例 #17
0
class StatusbarUI(object):
    def __init__(self, main_window: QMainWindow):
        """
        状态栏
        外观模式
        :param main_window:
        """
        self.main_window = main_window

        self.statusbar = QStatusBar(self.main_window)

        self.ui_list = []
        self.show_time = ShowTime(self.statusbar, 1)  # 时间模块
        self.placeholder = Placeholder(self.statusbar, 2)  # 占位符
        self.net_speed = NetSpeed(self.statusbar, -4)  # 网速
        self.monitor_port = MonitorPort(self.statusbar, -3)  # 监听端口
        self.online_host = OnlineHost(self.statusbar, -1)  # 上线主机

    def options(self) -> None:
        font = QFont()
        font.setPointSize(10)
        self.statusbar.setFont(font)

        # self.statusbar.setGeometry(QtCore.QRect(0, 0, 900, 50))
        self.statusbar.setFixedHeight(30)
        self.main_window.setStatusBar(self.statusbar)
        # self.main_window.setStatusBar()
        # self.statusbar.setContextMenuPolicy(Qt.DefaultContextMenu)

    def setup_ui(self) -> None:
        self.statusbar.setObjectName("statusbar")
        self.options()

        self.load_ui()
        self.show_ui()

        if not settings.STATUSBAR_SHOW:
            self.statusbar.setHidden(False)

    # noinspection PyArgumentList
    def retranslate_ui(self) -> None:
        self.statusbar.setWindowTitle(_translate("StatusbarUI", "状态栏"))

    def load_ui(self) -> None:
        """
        加载模块
        :return:
        """
        self.ui_list.append(self.show_time)
        self.ui_list.append(self.placeholder)
        self.ui_list.append(self.net_speed)
        self.ui_list.append(self.monitor_port)
        self.ui_list.append(self.online_host)

    def show_ui(self) -> None:
        """
        显示数据
        :return:
        """
        for view in self.ui_list:
            view.setup_ui()
            view.retranslate_ui()
コード例 #18
0
class GestureDraw(QMainWindow):

    populateGallery = pyqtSignal()
    closedWindow = pyqtSignal(object)
    key_pressed = pyqtSignal(object)

    def __init__(self, parent):

        super(GestureDraw, self).__init__()
        self.setWindowTitle('Gesture Draw')
        self.parent = parent
        self.configure_gui()
        self.create_widgets()
        self.create_menu()
        self.order[0].actions()[-1].trigger()
        self.show()

    def configure_gui(self):

        self.stack = QStackedWidget(self)
        self.setCentralWidget(self.stack)

        resolution = Qapp.desktop().screenGeometry()
        width, height = resolution.width(), resolution.height()
        self.setGeometry(0, 0, width // 2, height)

    def create_widgets(self):

        self.windows = set()
        self.mysql = CONNECT(self)
        self.threadpool = QThreadPool()

        self.gallery = Gallery(self)
        self.preview = Preview(self)
        self.timer = Timer(self.preview, self)

        self.stack.addWidget(self.gallery)
        self.stack.addWidget(self.preview)

        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.statusbar.setFixedHeight(30)

        self.mysql.finishedTransaction.connect(self.select_records)
        self.mysql.finishedSelect.connect(self.gallery.clearSelection)
        self.mysql.finishedSelect.connect(self.gallery.update)
        self.mysql.finishedSelect.connect(self.update_statusbar)

        self.gallery.selection.connect(self.update_statusbar)
        self.gallery.find_artist.connect(self.find_by_artist)
        self.gallery.setContentsMargins(5, 0, 5, 0)
        for action in self.gallery.menu.actions():
            if action.text() in ['Delete', 'Properties']:
                self.gallery.menu.removeAction(action)

        self.preview.label.setStyleSheet(f'background: black')

    def create_menu(self):

        self.menubar = self.menuBar()
        self.toolbar = self.addToolBar('Ribbon')

        self.ribbon = Ribbon(self)
        self.toolbar.addWidget(self.ribbon)

        self.menubar.triggered.connect(self.menuPressEvent)
        self.toolbar.actionTriggered.connect(self.menuPressEvent)
        self.ribbon.selection_mode.connect(self.setSelectionMode)
        self.ribbon.multi.click()
        self.ribbon.tags.setFocus()

        # File
        file = self.menubar.addMenu('File')
        file.addAction('Copy Images to')
        self.gesture_menu = create_submenu_(self,
                                            'Gesture Draw',
                                            GESTURE.keys(),
                                            check=False)[0]
        file.addMenu(self.gesture_menu)
        file.addSeparator()
        file.addAction('Exit', self.close, shortcut='CTRL+W')

        # database
        database = self.menubar.addMenu('Database')
        database.addAction('Reconnect')
        database.addAction('Current statement')
        database.addAction('Update Autocomplete')
        database.addAction('Remove Redundancies')

        # View
        view = self.menubar.addMenu('View')

        # Help
        help = self.menubar.addMenu('Help')

    @pyqtSlot()
    def select_records(self):

        worker = Worker(self.mysql.execute, self.ribbon.update_query(1, 1000))
        self.threadpool.start(worker)

    def start_session(self, gallery, time):

        if gallery and time:

            self.menubar.hide()
            self.toolbar.hide()
            self.statusbar.hide()

            if ':' in time:
                min, sec = time.split(':')
                time = (int(min) * 60) + int(sec)
            else:
                time = int(time)

            self.stack.setCurrentIndex(1)
            self.timer.start(gallery, time)

        else:
            QMessageBox.information(self, '',
                                    'You are either missing images or a time',
                                    QMessageBox.Ok)

    def update_statusbar(self):

        total = self.gallery.total()
        select = len(self.gallery.selectedIndexes())

        total = (f'{total} image' if (total == 1) else f'{total} images')

        if select:

            select = (f'{select} image selected' if
                      (select == 1) else f'{select} images selected')

        else:
            select = ''

        self.statusbar.showMessage(f'   {total}     {select}')

    def find_by_artist(self, index):

        artist = index.data(Qt.UserRole)[1]

        if artist:

            self.ribbon.setText(' OR '.join(artist.split()))

        else:
            QMessageBox.information(self, 'Find by artist',
                                    'This image has no artist')

    def setSelectionMode(self, event):

        if event:
            self.gallery.setSelectionMode(QAbstractItemView.MultiSelection)
        else:
            self.gallery.setSelectionMode(QAbstractItemView.ExtendedSelection)
            self.gallery.clearSelection()

    def menuPressEvent(self, event=None):

        action = event.text()

        # Files
        if action == 'Copy Images to':

            copy_to(self, self.gallery.selectedIndexes())

        elif action in GESTURE.keys():

            if action == 'Custom Time':

                time, ok = QInputDialog.getText(self, "Dialog", "Enter time:")

                if ok:

                    gallery = self.gallery.selectedIndexes()
                    self.start_session(gallery, time)

            else:

                gallery = self.gallery.selectedIndexes()
                self.start_session(gallery, GESTURE[action])

        elif action == 'Exit':
            self.close()

            # Database
        elif action == 'Reconnect':

            self.mysql = CONNECT(self)
            self.threadpool = QThreadPool()

        elif action == 'Current Statement':

            QMessageBox.information(self, 'Current Statement',
                                    self.ribbon.query)

        elif action == 'Update Autocomplete':

            worker = Worker(update_autocomplete)
            self.threadpool.start(worker)

            self.ribbon.tags.setCompleter(
                Completer(open(AUTOCOMPLETE).read().split()))

        elif action == 'Remove Redundancies':

            worker = Worker(remove_redundancies)
            self.threadpool.start(worker)

    def keyPressEvent(self, event):

        key_press = event.key()

        if key_press == Qt.Key_Space: self.timer.pause()

        elif key_press in (Qt.Key_Left, Qt.Key_Right): pass

        elif key_press == Qt.Key_Escape:

            if self.stack.currentIndex():

                self.timer.pause()
                self.menubar.show()
                self.toolbar.show()
                self.statusbar.show()
                self.statusbar.showMessage('')
                self.stack.setCurrentIndex(0)
                self.select_records()

            else:
                self.close()

        else:
            self.key_pressed.emit(event)

    def mousePressEvent(self, event):

        if event.button() == Qt.MouseButton.LeftButton: self.timer.pause()

    def closeEvent(self, event):

        self.threadpool.clear()
        for window in self.windows:
            window.close()
        self.mysql.close()
        self.closedWindow.emit(self)
コード例 #19
0
class VideoPlayer(QWidget):
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        #self.mediaPlayer.setMinmumSize(QtCore.QSize(445, 225))

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()
        videoWidget.setMinimumSize(QtCore.QSize(445, 225))

        openButton = QPushButton("Open Video")
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 8))
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        openButton.clicked.connect(self.abrir)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        #controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        #layout.setMinmumSize(QtCore.QSize(445, 225))
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

    def abrir(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Selecciona los mediose", ".",
            "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
コード例 #20
0
class VideoPlayer(QWidget):
    def __init__(self, img_path, parent=None):
        super(VideoPlayer, self).__init__(parent)
        if __name__ == '__main__':
            self.setWindowTitle("Player")
            self.setGeometry(0, 0, 640, 480)
        else:
            self.setGeometry(0, 0, parent.width(), parent.height())
            self.main = parent

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        if __name__ == '__main__':
            openButton = QPushButton()
            openButton.setToolTip("Open Video File")
            openButton.setStatusTip("Open Video File")
            openButton.setFixedHeight(24)
            openButton.setIconSize(btnSize)
            openButton.setText("Vidéo")
            openButton.setFont(QFont("Noto Sans", 8))
            openButton.setIcon(QIcon.fromTheme("document-open"))
            openButton.clicked.connect(self.openFile)

        self.playButton = QPushButton()
        self.playButton.setEnabled(True)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        if __name__ == '__main__':
            controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(img_path)))
        self.statusBar.showMessage(img_path)

        if __name__ == '__main__':
            self.setLayout(layout)
            self.show()
        else:
            self.main.setLayout(layout)

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(
            self, "Open Movie",
            QDir.homePath() + "/Videos",
            "All Files *.* ;; MP4 *.mp4 ;; FLV *.flv ;; TS *.ts ;; MTS *.mts ;; AVI *.avi"
        )

        if fileName != '':
            self.loadFile(fileName)

    def loadFile(self, fileName):
        self.mediaPlayer.setMedia(cv2.VideoCapture(fileName))
        #        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))
        self.playButton.setEnabled(True)
        self.statusBar.showMessage(fileName)
        self.play()

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())