コード例 #1
0
class MainWindow(QWidget):
  def __init__(self, rect, controller):
    QWidget.__init__(self)

    self.controller = controller

    self.setGeometry(rect)
    self.setWindowTitle("Reframomat")

    self.welcomeMsg = QLabel(self)
    self.welcomeMsg.setText("Willkommen beim Reframomat!\nDrücke den Buzzer, um loszulegen!")
    self.welcomeMsg.setAlignment(Qt.AlignCenter)
    self.welcomeMsg.setGeometry(self.rect())

    self.videoWidget = QVideoWidget(self)
    self.videoWidget.setGeometry(self.rect())
    self.videoWidget.hide()

  def keyPressEvent(self, event):
    if type(event) == QKeyEvent:
      if event.key() == Qt.Key_Escape:
        QApplication.quit()
      elif event.key() == Qt.Key_S:
        self.controller.skip()
      else:
        self.controller.onBuzzerPress()
      event.accept()
    else:
      event.ignore()
コード例 #2
0
class VideoPlayer(QMediaPlayer):
    """docstring for VideoPlayer"""
    def __init__(self):
        super(VideoPlayer, self).__init__(None, QMediaPlayer.VideoSurface)
        self.view = QVideoWidget()
        self.view.setWindowTitle('Video Player')
        self.setVideoOutput(self.view)

    def widget(self):
        return self.view

    def show(self):
        self.view.show()

    def hide(self):
        self.view.hide()

    def isVisible(self):
        return self.view.isVisible()

    def setSize(self, width, height):
        self.view.resize(width, height)

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

    def loadMedia(self, fullPath):
        self.setMedia(QMediaContent(QUrl.fromLocalFile(fullPath)))
        self.stop()
コード例 #3
0
class GUI(QWidget):
    def __init__(self, Form, flag, start, onlearning, readMe, study, choose,
                 whatdo, allsee, finish, finishlearning, ending):
        super(GUI, self).__init__()
        self.start = start
        self.ending = ending
        self.onlearning = onlearning
        self.readMe = readMe
        self.study = study
        self.choose = choose
        self.whatdo = whatdo
        self.allsee = allsee
        self.finish = finish
        self.finishlearning = finishlearning
        self.isFirst = True
        self.flag = flag
        self.Form = QWidget()
        self.onlearning.setupUi(self.Form, self.start, self.onlearning,
                                self.readMe, self.study, self.choose,
                                self.whatdo, self.allsee, self.finish,
                                self.finishlearning, self.ending, flag)
        self.layout = QVBoxLayout()
        self.vw = QVideoWidget()
        self.player = QMediaPlayer()
        self.vw.setAspectRatioMode(Qt.IgnoreAspectRatio)
        # self.vw.setFullScreen(True)
        self.layout.addWidget(self.vw)
        self.setLayout(self.layout)
        self.showFullScreen()

    def keyPressEvent(self, event):
        if (event.key() == Qt.Key_Return):
            self.player.play()  # 播放视频
        if (event.key() == Qt.Key_Space):
            self.player.pause()
        if (event.key() == Qt.Key_Escape):
            self.player.stop()
            self.vw.hide()
            self.hide()
            self.Form.showFullScreen()

    @pyqtSlot()
    def Next(self):
        if self.player.state() == QMediaPlayer.StoppedState:
            self.vw.hide()
            self.hide()
            # self.Form.showFullScreen()
            self.onlearning.Game()
コード例 #4
0
class MainWidget(QWidget):
    def __init__(self):
        super(MainWidget, self).__init__()

        self._blur = QGraphicsBlurEffect()
        self._blur.setBlurRadius(0)

        self.image = ImageView()
        self.image.setGraphicsEffect(self._blur)

        self.video = QVideoWidget()

        self.label = QLabel()
        self.label.setMaximumHeight(25)
        self.label.setStyleSheet('color: rgb(200, 200, 200);')

        font = QFont()
        font.setPixelSize(20)
        font.setWeight(QFont.Bold)
        self.label.setFont(font)

        self.setLayout(QVBoxLayout())
        self.layout().addWidget(self.image)
        self.layout().addWidget(self.video)
        self.layout().addWidget(self.label)

        self.mplayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.mplayer.setVideoOutput(self.video)

        self.mplayer.error.connect(
            lambda: print("Video:", self.mplayer.errorString()))
        self.mplayer.mediaStatusChanged.connect(self.state_changed)

        self.overlay = QLabel(self)
        self.overlay.setFrameStyle(Qt.FramelessWindowHint)
        self.overlay.setStyleSheet(
            'background-color: rgba(0,0,0,0.7); color: rgba(200,200,200,1);')
        self.overlay.setFont(font)
        self.overlay.setVisible(False)
        self.overlay.setWordWrap(True)

    def resize(self):
        self.overlay.setGeometry(0, 3 * self.height() // 4 - 50, self.width(),
                                 100)

    def resizeEvent(self, event):
        super().resizeEvent(event)
        self.resize()

    def state_changed(self, state):
        if state == QMediaPlayer.EndOfMedia:
            self.mplayer.setPosition(0)
            self.mplayer.play()

    @property
    def blur(self):
        return self._blur.blurRadius()

    @blur.setter
    def blur(self, value):
        self._blur.setBlurRadius(value)

    def load(self, pic, *args, **kwargs):
        if isinstance(pic, str):
            still = path.splitext(pic)[1].lower()[1:] not in ('webm', 'mp4')
        else:
            still = pic.is_still if pic else True

        if still:
            self.image.load(pic, *args, **kwargs)
            self.video.hide()
            self.image.show()
            self.mplayer.stop()
        else:
            url = pic if isinstance(pic, str) else pic.filename
            self.mplayer.setMedia(QMediaContent(QUrl.fromLocalFile(url)))
            self.mplayer.setMuted(True)
            self.mplayer.play()
            self.image.hide()
            self.video.show()

        self.overlay.setVisible(False)

    def message(self, msg):
        self.label.setText('<div align="center">{}</div>'.format(msg))

    def flash(self, msg):
        self.overlay.setText('<div align="center">{}</div>'.format(msg))
        self.overlay.setVisible(True)

    def halt(self):
        self.mplayer.stop()
コード例 #5
0
ファイル: game_window.py プロジェクト: komarEX/Shinji
class GameWindow(QWidget):
    def __init__(self, parent=None):
        super(GameWindow,self).__init__(parent)

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

        self.mediaPlayer.setVideoOutput(self.videoWidget)

        self.stringLabel = QLabel()
        self.stringLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)
        self.stringLabel.setTextFormat(Qt.RichText)
        self.stringLabel.setAlignment(Qt.AlignHCenter)

        layout = QVBoxLayout()
        layout.addWidget(self.videoWidget)
        layout.addWidget(self.stringLabel)

        self.setLayout(layout)

        self.mediaPlayer.positionChanged.connect(self.positionChanged)

    def openFile(self, fileName):
        if fileName != '':
            self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))

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

    def playV(self, file, rate, visibility, labelString):
        self.position = 0
        self.startPos = 0
        self.duration = 0
        self.durChanged = False
        self.stopPos = False
        self.openFile(file)
        self.mediaPlayer.setPlaybackRate(rate)
        if visibility:
            self.videoWidget.show()
            self.stringLabel.show()
            self.stringLabel.setText(labelString)
        else:
            self.videoWidget.hide()
            self.stringLabel.show()
            self.stringLabel.setText(labelString)
        self.play()

    def closeEvent(self, event):
        event.ignore()
        self.mediaPlayer.stop()
        super(GameWindow, self).closeEvent(event)

    def positionChanged(self, pos):
        self.position = pos
        if not self.durChanged and self.position > 0:
            self.durationChanged(self.mediaPlayer.duration())
            self.durChanged = True
        if self.startPos > 0 and not self.stopPos and not self.videoWidget.isVisible():
            if self.position > self.startPos + 20000:
                self.play()
                self.stopPos = True

    def durationChanged(self, dur):
        self.duration = dur
        if self.duration > 40000 and not self.videoWidget.isVisible():
            self.startPos = random.randint(5000, self.duration - 25000)
            self.mediaPlayer.setPosition(self.startPos)

    def showPoints(self, pointsString):
        self.videoWidget.hide()
        self.stringLabel.show()
        self.stringLabel.setText(pointsString)
コード例 #6
0
ファイル: main.py プロジェクト: vikas-vm/mediaProQT
class MainWindow(QWidget):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.playlistView = QListView()
        self.switch_status = 2
        self.video_widget = QVideoWidget()
        self.playlist = QMediaPlaylist()
        self.model = PlaylistModel(self.playlist)
        self.titleBar = TitleBar(self)
        self.currentTimeLabel = QLabel()
        self.timeSlider = QSlider()
        self.totalTimeLabel = QLabel()
        self.mediaPlayer = QMediaPlayer()
        self.open_btn = QPushButton('Open File')
        self.play_btn = QPushButton()
        self.prev_btn = QPushButton()
        self.stop_btn = QPushButton()
        self.next_btn = QPushButton()
        self.switch_media_widgets_btn = QPushButton()
        self.pseudo_label = QLabel()

        self.vol_label = QLabel()
        self.volume_slider = Slider(Qt.Horizontal)
        self.gui()
        self.set_children_focus_policy(Qt.NoFocus)

    def gui(self):
        self.currentTimeLabel.setMinimumSize(QSize(80, 0))
        self.currentTimeLabel.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter)

        self.timeSlider.setOrientation(Qt.Horizontal)
        self.totalTimeLabel.setMinimumSize(QSize(80, 0))
        self.totalTimeLabel.setAlignment(Qt.AlignLeading | Qt.AlignLeft | Qt.AlignVCenter)

        self.playlistView.setAcceptDrops(True)
        self.playlistView.setProperty("showDropIndicator", True)
        self.playlistView.setDragDropMode(QAbstractItemView.DropOnly)
        self.playlistView.setAlternatingRowColors(True)
        self.playlistView.setUniformItemSizes(True)

        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setWindowTitle('Media Player')
        self.titleBar.label.setText('Media Player')
        self.setWindowIcon(QIcon('icon_png/media_player.png'))

        self.setGeometry(600, 200, 850, 600)
        self.timeSlider.setRange(0, 0)
        self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.prev_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaSkipBackward))
        self.next_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaSkipForward))
        self.stop_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.switch_media_widgets_btn.setIcon(self.style().standardIcon(QStyle.SP_FileDialogDetailedView))
        self.vol_label.setText("")
        self.vol_label.setPixmap(QPixmap("icon_png/speaker-volume.png"))
        self.currentTimeLabel.setText("00:00")
        self.totalTimeLabel.setText("00:00")
        self.volume_slider.setValue(self.mediaPlayer.volume())
        self.mediaPlayer.setVideoOutput(self.video_widget)
        self.mediaPlayer.setPlaylist(self.playlist)
        self.playlistView.setModel(self.model)
        self.video_widget.hide()

        sizegrip = QSizeGrip(self)

        self.setAcceptDrops(True)

        inner_h_box = QHBoxLayout()
        inner_h_box.addWidget(self.prev_btn)
        inner_h_box.addWidget(self.stop_btn)
        inner_h_box.addWidget(self.next_btn)

        vol_h_box = QHBoxLayout()
        vol_h_box.addWidget(self.vol_label, 0)
        vol_h_box.addWidget(self.volume_slider, 1)

        h_box = QHBoxLayout()
        h_box.addWidget(self.open_btn)
        h_box.addWidget(self.play_btn, 0)
        h_box.addLayout(inner_h_box, 0)
        h_box.addWidget(self.switch_media_widgets_btn, 0)
        h_box.addWidget(self.pseudo_label, 1)
        h_box.addLayout(vol_h_box, 0)
        h_box.addWidget(sizegrip, 0, Qt.AlignBottom | Qt.AlignRight)

        video_slider_h_box = QHBoxLayout()
        video_slider_h_box.addWidget(self.currentTimeLabel)
        video_slider_h_box.addWidget(self.timeSlider)
        video_slider_h_box.addWidget(self.totalTimeLabel)

        v_box = QVBoxLayout()
        v_box.addWidget(self.titleBar, 0)
        v_box.addWidget(self.video_widget, 1)
        v_box.addWidget(self.playlistView, 1)
        v_box.addLayout(video_slider_h_box, 0)
        v_box.addLayout(h_box, 0)

        inner_h_box.setContentsMargins(20, 0, 10, 0)
        vol_h_box.setContentsMargins(0, 0, 20, 0)
        h_box.setContentsMargins(20, 0, 0, 0)
        v_box.setContentsMargins(0, 0, 0, 0)
        video_slider_h_box.setSpacing(10)
        h_box.setSpacing(0)
        v_box.setSpacing(0)

        self.setLayout(v_box)
        self.enabler()

        # connections
        self.open_btn.clicked.connect(self.open_file)
        self.play_btn.clicked.connect(self.play_media)
        self.stop_btn.clicked.connect(self.stop_media)

        self.prev_btn.pressed.connect(self.play_prev)
        self.next_btn.pressed.connect(self.play_next)
        self.switch_media_widgets_btn.pressed.connect(self.switch_media)

        self.playlist.currentIndexChanged.connect(self.playlist_position_changed)
        selection_model = self.playlistView.selectionModel()
        selection_model.selectionChanged.connect(self.playlist_selection_changed)

        self.mediaPlayer.durationChanged.connect(self.update_duration)
        self.mediaPlayer.positionChanged.connect(self.update_position)
        self.timeSlider.valueChanged.connect(self.mediaPlayer.setPosition)

        self.mediaPlayer.stateChanged.connect(self.media_state)

        self.mediaPlayer.volumeChanged.connect(self.volume_changed)
        self.volume_slider.valueChanged.connect(self.set_volume)

    def set_children_focus_policy(self, policy):
        def recursive_set_child_focus_policy(parent_q_widget):
            for childQWidget in parent_q_widget.findChildren(QWidget):
                childQWidget.setFocusPolicy(policy)
                recursive_set_child_focus_policy(childQWidget)

        recursive_set_child_focus_policy(self)

    def enabler(self, state=False):
        if state is False:
            self.play_btn.setEnabled(False)
            self.prev_btn.setEnabled(False)
            self.stop_btn.setEnabled(False)
            self.next_btn.setEnabled(False)
        else:
            self.play_btn.setEnabled(True)
            self.stop_btn.setEnabled(True)
            self.prev_btn.setEnabled(True)
            self.next_btn.setEnabled(True)

    def switch_media(self):
        if self.switch_status == 0:
            self.video_widget.hide()
            self.playlistView.show()
            self.switch_status = 1
            self.switch_media_widgets_btn.setEnabled(True)
        elif self.switch_status == 1:
            self.video_widget.show()
            self.playlistView.hide()
            self.switch_status = 0
            self.switch_media_widgets_btn.setEnabled(True)
        else:
            self.video_widget.hide()
            self.playlistView.show()
            self.switch_media_widgets_btn.setEnabled(False)

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

    def ui_handler(self):
        if not self.playlist.isEmpty():
            self.enabler(True)
        file_path = QFileInfo(self.mediaPlayer.currentMedia().canonicalUrl().toString()).fileName()
        ext = os.path.splitext(file_path)[-1].lower()
        audio_ext = ['.flac', '.mp3']
        video_ext = ['.mp4', '.m4a', '.mov', '.flv', 'avi', '3gp', '.mkv', '.wmv']

        if ext in audio_ext:
            self.switch_status = 2
            self.switch_media()
            if self.isFullScreen():
                self.fullscreen()
        elif ext in video_ext:
            self.switch_status = 1
            self.switch_media()
        self.setWindowTitle(file_path + ' - Media Player')
        self.titleBar.label.setText(file_path + ' - Media Player')

    def stop_media(self):
        if self.mediaPlayer.state() != QMediaPlayer.StoppedState:
            self.mediaPlayer.stop()
            self.setWindowTitle('Media Player')
            self.titleBar.label.setText('Media Player')

    def fullscreen(self):
        if self.switch_status == 2 or self.isFullScreen():
            self.titleBar.show()
            self.timeSlider.show()
            self.currentTimeLabel.show()
            self.totalTimeLabel.show()
            self.volume_slider.show()
            self.open_btn.show()
            self.play_btn.show()
            self.prev_btn.show()
            self.stop_btn.show()
            self.next_btn.show()
            self.switch_media_widgets_btn.show()
            self.pseudo_label.show()
            self.vol_label.show()
            self.showNormal()
        else:
            self.titleBar.hide()
            self.timeSlider.hide()
            self.currentTimeLabel.hide()
            self.totalTimeLabel.hide()
            self.volume_slider.hide()
            self.open_btn.hide()
            self.play_btn.hide()
            self.prev_btn.hide()
            self.stop_btn.hide()
            self.next_btn.hide()
            self.switch_media_widgets_btn.hide()
            self.pseudo_label.hide()
            self.vol_label.hide()
            self.showFullScreen()

    def mouseDoubleClickEvent(self, event: QMouseEvent):
        event.accept()
        if event.button() == Qt.LeftButton:
            self.fullscreen()

    def media_state(self):

        os_sleep = WindowsInhibitor()
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
            if os.name == 'nt':
                os_sleep = WindowsInhibitor()
                os_sleep.inhibit()
        else:
            self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
            if os_sleep:
                os_sleep.uninhibit()

    def play_next(self):
        self.playlist.next()

    def media_seek(self, seek):
        if not self.playlist.isEmpty():
            player = self.mediaPlayer
            if (player.duration() - seek) > player.position():
                player.setPosition(player.position() + seek)

    def play_prev(self):
        self.playlist.previous()

    def dragEnterEvent(self, e):
        if e.mimeData().hasUrls():
            e.acceptProposedAction()

    def dropEvent(self, e):
        for url in e.mimeData().urls():
            ext = os.path.splitext(url.fileName())[-1].lower()
            allowed_ext = ['.flac', '.mp3', '.mp4', '.m4a', '.mov', '.flv', 'avi', '3gp', '.mkv', '.wmv']
            if ext in allowed_ext:
                self.playlist.addMedia(
                    QMediaContent(url)
                )

        self.model.layoutChanged.emit()

        if self.mediaPlayer.state() != QMediaPlayer.PlayingState:
            i = self.playlist.mediaCount() - len(e.mimeData().urls())
            self.playlist.setCurrentIndex(i)
            if not self.playlist.isEmpty():
                self.play_media()

    def open_file(self):
        filter_files = "Media (*.mp3 *.mp4 *.mkv);; Videos files (*.mp4 *.mkv);; Music Files(*.mp3)"
        paths, _ = QFileDialog.getOpenFileNames(self, "Open file", "", filter_files)

        if paths:
            self.mediaPlayer.pause()
            for path in paths:
                self.playlist.addMedia(
                    QMediaContent(
                        QUrl.fromLocalFile(path)
                    )
                )
            i = self.playlist.mediaCount() - len(paths)
            self.playlist.setCurrentIndex(i)
            self.play_media()

        self.model.layoutChanged.emit()

    def update_duration(self, duration):
        self.mediaPlayer.duration()

        self.timeSlider.setMaximum(duration)

        if duration >= 0:
            self.totalTimeLabel.setText(hhmmss(duration))

    def update_position(self, position):
        if position >= 0:
            self.currentTimeLabel.setText(hhmmss(position))

        self.timeSlider.blockSignals(True)
        self.timeSlider.setValue(position)
        self.timeSlider.blockSignals(False)

    def playlist_selection_changed(self, ix):
        i = ix.indexes()[0].row()
        self.playlist.setCurrentIndex(i)
        self.ui_handler()

    def playlist_position_changed(self, i):
        if i > -1:
            ix = self.model.index(i)
            self.playlistView.setCurrentIndex(ix)

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

    def volume_changed(self, value):
        self.volume_slider.setValue(value)

    def keyPressEvent(self, event):
        key = event.key()
        modifiers = int(event.modifiers())
        if (modifiers and modifiers & MOD_MASK == modifiers and
                key > 0 and key != Qt.Key_Shift and key != Qt.Key_Alt and
                key != Qt.Key_Control and key != Qt.Key_Meta):
            key_name = QKeySequence(modifiers + key).toString()
            if key_name == 'Ctrl+Right':
                self.media_seek(30000)
            elif key_name == 'Ctrl+Left':
                self.media_seek(-30000)
            elif key_name == 'Ctrl+Up':
                self.mediaPlayer.setVolume(self.mediaPlayer.volume() + 5)
            elif key_name == 'Ctrl+Down':
                self.mediaPlayer.setVolume(self.mediaPlayer.volume() - 5)
            elif key_name == 'Ctrl+O':
                self.open_file()

        else:
            if event.key() == Qt.Key_Space:
                self.play_media()
            elif event.key() == Qt.Key_MediaPlay:
                self.play_media()
            elif event.key() == Qt.Key_MediaNext:
                self.play_next()
            elif event.key() == Qt.Key_MediaPrevious:
                self.play_prev()
            elif event.key() == Qt.Key_Escape:
                self.close()
            elif event.key() == Qt.Key_F:
                self.fullscreen()
            elif event.key() == Qt.Key_Right:
                self.media_seek(5000)
            elif event.key() == Qt.Key_Left:
                self.media_seek(-5000)
コード例 #7
0
class Ui_ShadowRCNN(QWidget):
    def login(self, Dialog):
        self.login_dialog = login.Ui_Dialog()
        self.login_dialog.setupUi(Dialog)
        self.login_dialog.pushButton.clicked.connect(
            lambda: self.login_operation(Dialog))
        self.login_dialog.toolButton.clicked.connect(self.open_path)

    def open_path(self):
        param_path, _ = QFileDialog.getOpenFileName(QWidget(), "选择文件",
                                                    "../param",
                                                    "*.pth;;;All Files(*)")
        if param_path != '':
            self.login_dialog.lineEdit_3.setText(param_path)
            ######TODO 自定义参数的数据库连接

    def login_operation(self, Dialog):
        global RCNN_PATH
        success = False
        error = ''
        self.is_guest = False
        self.user_name = 'guest'
        self.user_id = -1
        self.param_id = 1

        if self.login_dialog.radioButton_2.isChecked():
            self.is_guest = True
            self.user_name = '游客'
            success = True
        if self.login_dialog.radioButton.isChecked():
            username = self.login_dialog.lineEdit.text()
            password = self.login_dialog.lineEdit_2.text()
            if username.strip() == '' or password.strip() == '':
                error = 'blank'
            else:
                results = db_select('select * from tb_user')
                for result in results:
                    if username == result[1]:
                        if password == result[2]:
                            self.user_name = username
                            self.user_id = result[0]
                            success = True
                            break
                        else:
                            error = 'wrong'
                            break
                if not success and error == '':
                    sql = 'insert into tb_user(username, password)values("%s", "%s")' % (
                        username, password)
                    db_insert(sql)
                    msg = QMessageBox.information(self, '提示',
                                                  '已为您自动注册用户名%s' % username,
                                                  QMessageBox.Ok,
                                                  QMessageBox.Ok)
                    self.user_name = username
                    sql = 'select * from tb_user order by user_id desc limit 1'
                    results = db_select(sql)
                    for result in results:
                        self.user_id = result[0]
                        print(self.user_id)
                    success = True
        if success:
            global IMAGE_PATH
            global VIDEO_PATH
            IMAGE_PATH = os.path.join(IMAGE_PATH, self.user_name)
            VIDEO_PATH = os.path.join(VIDEO_PATH, self.user_name)
            if not os.path.exists(IMAGE_PATH):
                os.makedirs(IMAGE_PATH)
            if not os.path.exists(VIDEO_PATH):
                os.makedirs(VIDEO_PATH)
            if self.login_dialog.lineEdit_3.text() != '默认参数':
                RCNN_PATH = self.login_dialog.lineEdit_3.text()
            Dialog.close()
            self.main_window = QMainWindow()
            self.setupUi(self.main_window)
            self.main_window.show()
        else:
            if error == 'blank':
                msg = QMessageBox.warning(self, '提示', '请输入正确的用户名与密码!',
                                          QMessageBox.Ok, QMessageBox.Ok)
            elif error == 'wrong':
                msg = QMessageBox.warning(self, '提示', '用户名或密码错误!',
                                          QMessageBox.Ok, QMessageBox.Ok)

    def setupUi(self, ShadowRCNN):
        ShadowRCNN.setObjectName("ShadowRCNN")
        ShadowRCNN.resize(1666, 900)
        self.centralwidget = QtWidgets.QWidget(ShadowRCNN)
        self.centralwidget.setObjectName("centralwidget")

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(190, 40, 1280, 720))
        self.label.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.label.setStyleSheet(
            "QLabel{background:white;}"
            "QLabel{color:rgb(300,300,300,120);font-size:20px;font-weight:bold;}"
        )

        self.label_name = QtWidgets.QLabel(self.centralwidget)
        self.label_name.setGeometry(QtCore.QRect(10, 5, 200, 40))
        self.label_name.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.label_name.setObjectName("label")
        self.label_name.setStyleSheet(
            "QLabel{color:rgb(300,300,300,120);font-size:20px;font-weight:bold;}"
        )

        self.wgt_video = QVideoWidget(self.centralwidget)
        self.wgt_video.setGeometry(QtCore.QRect(190, 40, 1280, 720))
        self.player = QMediaPlayer()
        self.player.setVideoOutput(self.wgt_video)
        self.wgt_video.hide()
        self.wgt_video.setObjectName("widget")

        self.pushButton_play = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_play.setVisible(False)
        self.pushButton_play.setGeometry(QtCore.QRect(1513, 40, 80, 41))
        self.pushButton_play.setObjectName("pushButton")
        self.video_is_play = False
        self.pushButton_play.clicked.connect(self.video_play_change)

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(100, 790, 161, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.open_image)

        self.pushButton1 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton1.setGeometry(QtCore.QRect(883, 790, 161, 41))
        self.pushButton1.setObjectName("pushButton")
        self.pushButton1.clicked.connect(self.predict)

        self.pushButton_camera = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_camera.setGeometry(QtCore.QRect(622, 790, 161, 41))
        self.pushButton_camera.setObjectName("pushButton")
        self.pushButton_camera.clicked.connect(self.camera)

        self.check_continue = QtWidgets.QCheckBox(self.centralwidget)
        self.check_continue.setGeometry(QtCore.QRect(622, 825, 100, 41))
        self.check_continue.setObjectName("checkButton")
        self.check_continue.stateChanged.connect(self.continue_camera)

        self.label1 = QtWidgets.QLabel(self.centralwidget)
        self.label1.setGeometry(QtCore.QRect(720, 825, 30, 41))
        self.label1.setObjectName("label")

        self.line_second = QtWidgets.QLineEdit(self.centralwidget)
        self.line_second.setGeometry(QtCore.QRect(752, 834, 20, 20))
        self.line_second.setObjectName("lineEdit")
        self.line_second.setEnabled(False)

        self.label2 = QtWidgets.QLabel(self.centralwidget)
        self.label2.setGeometry(QtCore.QRect(774, 825, 30, 41))
        self.label2.setObjectName("label")

        self.pushButton_video = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_video.setGeometry(QtCore.QRect(361, 790, 161, 41))
        self.pushButton_video.setObjectName("pushButton")
        self.pushButton_video.clicked.connect(self.open_video)

        self.pushButton_delete = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_delete.setGeometry(QtCore.QRect(1144, 790, 161, 41))
        self.pushButton_delete.setObjectName("pushButton")
        self.pushButton_delete.clicked.connect(self.delete)

        self.pushButton_history = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_history.setGeometry(QtCore.QRect(1405, 790, 161, 41))
        self.pushButton_history.setObjectName("pushButton")
        self.pushButton_history.clicked.connect(self.history)

        ShadowRCNN.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(ShadowRCNN)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1600, 26))
        self.menubar.setAutoFillBackground(False)
        self.menubar.setObjectName("menubar")
        ShadowRCNN.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(ShadowRCNN)
        self.statusbar.setObjectName("statusbar")
        ShadowRCNN.setStatusBar(self.statusbar)

        self.timer = QTimer()
        self.retranslateUi(ShadowRCNN)

        if self.is_guest:
            self.pushButton_delete.setEnabled(False)
            self.pushButton_history.setEnabled(False)

        QtCore.QMetaObject.connectSlotsByName(ShadowRCNN)

    def retranslateUi(self, ShadowRCNN):
        _translate = QtCore.QCoreApplication.translate
        ShadowRCNN.setWindowTitle(_translate("ShadowRCNN", "ShadowRCNN"))
        self.label.setText(_translate("ShadowRCNN", "请选择图片"))
        self.pushButton.setText(_translate("ShadowRCNN", "选择图片"))
        self.pushButton1.setText(_translate("ShadowRCNN", "开始预测"))
        self.pushButton_play.setText(_translate("ShadowRCNN", "暂停"))
        self.pushButton_camera.setText(_translate("ShadowRCNN", "拍摄照片"))
        self.pushButton_video.setText(_translate("ShadowRCNN", "选择视频"))
        self.pushButton_delete.setText(_translate("ShadowRCNN", "删除缓存"))
        self.pushButton_history.setText(_translate("ShadowRCNN", "历史信息"))
        self.check_continue.setText(_translate("ShadowRCNN", "连拍模式"))
        self.label1.setText(_translate("ShadowRCNN", "每秒"))
        self.line_second.setText(_translate("ShadowRCNN", "1"))
        self.label2.setText(_translate("ShadowRCNN", "张"))
        self.label_name.setText(
            _translate("ShadowRCNN", "欢迎使用," + self.user_name))

    def open_image(self):
        self.image_choose_dialog = media_dialog(media_type='图片')
        self.image_choose_dialog.show()
        self.image_choose_dialog._signal.connect(self.get_image)

    def get_image(self, imgName):
        self.label.clear()
        self.player.setMedia(QMediaContent())
        self.wgt_video.hide()
        self.label.show()
        self.pushButton_play.setVisible(False)
        jpg = QtGui.QPixmap(imgName).scaled(self.label.width(),
                                            self.label.height())
        if imgName != '':
            self.label.setPixmap(jpg)
            self.statusbar.showMessage('当前图片:' + imgName)
        PARAMS['imgPath'] = imgName
        self.image_choose_dialog.close()

    def ARP_predict(self, mode='image'):
        shadow_write_path, shadow_write_name = os.path.split(PARAMS['imgPath'])
        shadow_write_name = shadow_write_name.split('.')[0] + '_shadow_' \
                            + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.' \
                            + shadow_write_name.split('.')[1]
        self.shadow_write_path = os.path.join(shadow_write_path,
                                              shadow_write_name)
        print(self.shadow_write_path)
        if mode == 'image':
            manager = multiprocessing.Manager()
            return_dict = manager.dict()
            p = multiprocessing.Process(target=ARP_predict,
                                        args=(return_dict, PARAMS['imgPath'],
                                              ARP_MODEL_NAME, ARP_PATH,
                                              SHADOW_PERCENT))
            p.start()
            p.join()

            PARAMS['ARP_result'] = return_dict.values()[0]
            cv2.imwrite(self.shadow_write_path, PARAMS['ARP_result'])
            if 'shadow_write_path' not in PARAMS.keys():
                PARAMS['shadow_write_path'] = []
            PARAMS['shadow_write_path'].append(self.shadow_write_path)
            PARAMS['all_file_path'].append(self.shadow_write_path)
        elif mode == 'video':
            manager = multiprocessing.Manager()
            return_dict = manager.dict()
            p = multiprocessing.Process(
                target=ARP_predict,
                args=(return_dict, PARAMS['imgPath'], ARP_MODEL_NAME, ARP_PATH,
                      SHADOW_PERCENT, 'video', self.shadow_write_path))
            p.start()
            p.join()

            PARAMS['all_file_path'].append(self.shadow_write_path)

    def rcnn_predict(self, mode='image'):
        rcnn_write_path, rcnn_write_name = os.path.split(PARAMS['imgPath'])
        rcnn_write_name = rcnn_write_name.split('.')[0] + '_rcnn_' \
                          + datetime.datetime.now().strftime('%Y%m%d%H%M%S') \
                          + '.' + rcnn_write_name.split('.')[1]
        self.rcnn_write_path = os.path.join(rcnn_write_path, rcnn_write_name)
        print(self.rcnn_write_path)
        if mode == 'image':
            manager = multiprocessing.Manager()
            return_dict = manager.dict()
            p = multiprocessing.Process(target=rcnn_predict,
                                        args=(return_dict,
                                              PARAMS['ARP_result'], False,
                                              RCNN_PATH))
            p.start()
            p.join()
            PARAMS['RCNN_result'] = return_dict.values()[0]
            if PARAMS['RCNN_result'] is not None:
                cv2.imwrite(self.rcnn_write_path, PARAMS['RCNN_result'])
                if 'rcnn_write_path' not in PARAMS.keys():
                    PARAMS['rcnn_write_path'] = []
                PARAMS['rcnn_write_path'].append(self.rcnn_write_path)
                PARAMS['all_file_path'].append(self.rcnn_write_path)
                jpg = QtGui.QPixmap(self.rcnn_write_path).scaled(
                    self.label.width(), self.label.height())
                self.label.setPixmap(jpg)
        elif mode == 'video':
            manager = multiprocessing.Manager()
            return_dict = manager.dict()
            p = multiprocessing.Process(
                target=rcnn_predict,
                args=(return_dict, self.shadow_write_path, False, RCNN_PATH,
                      'video', self.rcnn_write_path))
            p.start()
            p.join()

            PARAMS['all_file_path'].append(self.rcnn_write_path)
            self.player.setMedia(
                QMediaContent(QUrl.fromLocalFile(self.rcnn_write_path)))
            self.player.play()
            self.video_is_play = True
            self.pushButton_play.setText('暂停')
        if not self.is_guest:
            sql = 'insert into tb_record(path,shadow,type,user_id,param_id,time)values("%s","%s","%s",%s,%s,"%s")' \
                  % (str(self.rcnn_write_path).replace('\\', '/'), str(self.shadow_write_path).replace('\\', '/'),
                     mode, self.user_id, self.param_id,
                     str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
            db_insert(sql)

    def predict(self):
        if 'imgPath' in PARAMS.keys():
            self.msgDialog = msg_dialog()
            self.msgDialog.show()
            self.timer = QTimer()
            self.timer.timeout.connect(self.start_connect)
            self.timer.start(500)
            self.statusbar.showMessage('预测完成')
        else:
            msg = QMessageBox.information(self, '提示', '请先选择图片或视频',
                                          QMessageBox.Yes, QMessageBox.Yes)

    def continue_camera(self, state):
        # state 0 没选中 1 选中
        if state == 0:
            self.pushButton_camera.setText('拍摄照片')
            self.line_second.setEnabled(False)
        elif state == 2:
            self.pushButton_camera.setText('开始连拍')
            self.line_second.setEnabled(True)

    def camera(self):
        self.label.clear()
        self.player.setMedia(QMediaContent())
        self.wgt_video.hide()
        self.label.show()
        self.pushButton_play.setVisible(False)
        if self.check_continue.checkState() != QtCore.Qt.Checked:
            self.pushButton_camera.setText('按Q拍照')
            cap = cv2.VideoCapture(0)
            while True:
                ret, frame = cap.read()
                # show a frame
                cv2.imshow("Capture", frame)

                if cv2.waitKey(1) == ord('q'):
                    cap_name = IMAGE_PATH + '/capimg_' + str(
                        datetime.datetime.now().strftime(
                            '%Y%m%d%H%M%S%f')) + '.jpg'
                    cv2.imwrite(cap_name, frame)
                    jpg = QtGui.QPixmap(cap_name).scaled(
                        self.label.width(), self.label.height())
                    self.label.setPixmap(jpg)
                    cap.release()  # 释放摄像头
                    cv2.destroyAllWindows()  # 删除建立的全部窗口
                    PARAMS['imgPath'] = cap_name
                    PARAMS['all_file_path'].append(cap_name)
                    self.pushButton_camera.setText('拍摄照片')
                    break

                if cv2.getWindowProperty("Capture", cv2.WND_PROP_AUTOSIZE) < 1:
                    cv2.destroyAllWindows()
                    self.pushButton_camera.setText('拍摄照片')
                    break
        else:
            self.now_continue_num = 0
            self.pushButton_camera.setEnabled(False)
            self.pushButton_camera.setText('正在连拍')
            per_second_photo_num = self.line_second.text()
            self.msgDialog = msg_dialog(msg='准备开始连拍')
            self.cap = cv2.VideoCapture(0)
            self.msgDialog.show()
            self.msgDialog.move(1200, 500)
            self.timer = QTimer()
            self.continue_list = []
            self.timer.timeout.connect(self.start_continue_photo)
            self.timer.start(int(1000 / int(per_second_photo_num)))

    def start_continue_photo(self):
        self.now_continue_num += 1
        self.msgDialog.setWindowTitle('正在连拍')
        self.msgDialog.msg_dialog.label.setText('正在拍摄第 {}/9 张...'.format(
            self.now_continue_num))
        # 拍照
        ret, frame = self.cap.read()
        # show a frame
        cv2.imshow("Capture", frame)
        image_name = IMAGE_PATH + '/capimg_' + str(
            datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')) + '.jpg'
        cv2.imwrite(image_name, frame)
        PARAMS['all_file_path'].append(image_name)
        self.continue_list.append(image_name)

        # 结束拍照
        if self.now_continue_num == 9:
            self.timer.stop()
            self.msgDialog.msg_dialog.label.setText('正在处理结果')
            self.pushButton_camera.setText('开始连拍')
            self.pushButton_camera.setEnabled(True)
            self.msgDialog.close()
            cv2.destroyAllWindows()
            self.cap.release()
            # 横向拼接结果
            continue_list_middle = [
                np.hstack([
                    cv2.imread(self.continue_list[0], 1),
                    cv2.imread(self.continue_list[1], 1),
                    cv2.imread(self.continue_list[2], 1)
                ]),
                np.hstack([
                    cv2.imread(self.continue_list[3], 1),
                    cv2.imread(self.continue_list[4], 1),
                    cv2.imread(self.continue_list[5], 1)
                ]),
                np.hstack([
                    cv2.imread(self.continue_list[6], 1),
                    cv2.imread(self.continue_list[7], 1),
                    cv2.imread(self.continue_list[8], 1)
                ])
            ]
            # 纵向拼接
            continue_photo = np.vstack([
                continue_list_middle[0], continue_list_middle[1],
                continue_list_middle[2]
            ])
            # 展示结果
            continue_photo_name = os.path.join(
                IMAGE_PATH, self.continue_list[0][:-10] + '_9in1.jpg')
            PARAMS['imgPath'] = continue_photo_name
            PARAMS['all_file_path'].append(continue_photo_name)
            cv2.imwrite(continue_photo_name, continue_photo)
            jpg = QtGui.QPixmap(continue_photo_name).scaled(
                self.label.width(), self.label.height())
            self.label.setPixmap(jpg)

    def open_video(self):
        self.video_choose_dialog = media_dialog(media_type='视频')
        self.video_choose_dialog.show()
        self.video_choose_dialog._signal.connect(self.get_video)

    def get_video(self, videoName):
        if videoName != '':
            self.label.clear()
            self.player.setMedia(QMediaContent())
            self.wgt_video.show()
            self.label.hide()
            self.player.setMedia(QMediaContent(QUrl.fromLocalFile(videoName)))
            self.player.play()
            self.video_is_play = True
            self.pushButton_play.setVisible(True)
            self.statusbar.showMessage('当前视频:' + videoName)
        PARAMS['imgPath'] = videoName
        self.video_choose_dialog.close()

    def video_play_change(self):
        self.video_is_play = bool(1 - self.video_is_play)
        if self.video_is_play:
            self.player.play()
            self.pushButton_play.setText('暂停')
        else:
            self.player.pause()
            self.pushButton_play.setText('播放')

    def delete(self):
        file_num = 0
        for file_name in PARAMS['all_file_path']:
            if os.path.exists(file_name):
                os.remove(file_name)
                if '_rcnn' in file_name:
                    sql = 'delete from tb_record where path="%s"' % file_name.replace(
                        '\\', '/')
                    db_delete(sql)
                file_num += 1
        self.statusbar.showMessage('缓存清除成功,共' + str(file_num) + '个文件')
        self.label.clear()
        self.player.setMedia(QMediaContent())

    def history(self):
        self.his_dialog = history_dialog(self.user_id, self.user_name)
        self.his_dialog.show()

    def start_connect(self):
        if str(PARAMS['imgPath']).endswith(('png', 'jpg')):
            self.ARP_predict()
            self.rcnn_predict()
        else:
            self.ARP_predict(mode='video')
            self.rcnn_predict(mode='video')

        self.timer.stop()
        self.msgDialog.close()
コード例 #8
0
ファイル: final.py プロジェクト: JordiCondom/escapeRoom
class Final(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(0, 0, w, h)
        self.backgroundImage = QLabel(self)
        self.textBubble = QLabel(self)
        self.previousButton = QPushButton(self)
        self.nextButton = QPushButton(self)
        self.textField = QLabel(self)
        # self.video = VideoPlayer(self)
        self.inputPassword = QLineEdit(self)
        self.checkButton = QPushButton('QED', self)
        self.initWindow()

        self.show()

    def initWindow(self):
        pixmap = QPixmap(
            resource_path("./images/examen3/merceClasse2.JPG")).scaled(w, h)
        self.backgroundImage.setPixmap(pixmap)

        self.previousButton.move(0.12 * w, 0.83 * h)
        self.previousButton.setIcon(
            QIcon(resource_path('./images/icons/previous.png')))
        self.previousButton.setStyleSheet(
            "QPushButton{background: transparent;}")
        self.previousButton.hide()

        bubblePM = QPixmap(resource_path("./images/icons/textBubble.png"))
        self.textBubble.setPixmap(bubblePM)
        self.textBubble.move(0.1 * w, 0.75 * h)

        self.textField.setText(
            '''<p> - I la resposta és... 432! Doncs crec que ja ho tindríem, primer exercici... segon exercici... i tercer! Tots acabats i en fulls separats, crec que va sent hora d'entregar aquest examen d'aquesta assignatura de merda, per fi me'n puc desfer, per fi podré no gastar l'hora i mitja de dilluns i divendres que els meus solidaris companys feien servir per restregar-me lo bé que s'ho passaven fent birres al bar. I tot això? Per a què? Per a que acabin traient la mateixa nota que jo, o millor? N'estic fart. <b> ( Silenci ) </b> Hola Morsè, et vinc a entregar el final de la millor assignatura que he fet en la meva vida, gràcies per tot.</p>'''
        )
        self.textField.setAlignment(Qt.AlignJustify)
        self.textField.setWordWrap(True)
        self.textField.resize(600, 200)
        self.textField.move(0.167 * w, 0.76 * h)
        self.textField.show()

        self.inputPassword.setGeometry(0.2 * w, 0.83 * h, 0.2 * w, 0.04 * h)
        self.inputPassword.setMaxLength(20)
        self.inputPassword.setFrame(False)
        self.inputPassword.hide()

        self.checkButton.move(0.45 * w, 0.83 * h)
        self.checkButton.clicked.connect(self.checkAnswerSecondExercise)
        self.checkButton.hide()

        self.nextButton.move(0.85 * w, 0.83 * h)
        self.nextButton.setIcon(QIcon(
            resource_path('./images/icons/next.png')))
        self.nextButton.setStyleSheet("QPushButton{background: transparent;}")
        try:
            self.nextButton.clicked.disconnect()
            self.textBubble.show()
            self.textField.show()
            self.nextButton.show()
        except:
            pass

        self.nextButton.clicked.connect(self.finalFirst)

        # self.video.resize(w, h)
        # self.video.hide()

        self.hide()
        self.show()

    def finalFirst(self):
        self.textField.setText(
            '''<p> <b> Morsè Oller: </b> . ... -.-. --- .-.. - .-  -. --- ..  -. ---  .... .- ...  .--. --- ... .- -  .-. . ...  .-  .-.. ·----· .- .--. .- .-. - .- -  -.. ·----· .- ... ... .. --. -. .- - ..- .-. .- <br> - Que no he posat res a l'apartat d'assignatura?! (M'ha enxampat) És que... com t'explico això Morsè... resulta que aquesta part no me l'he pogut estudiar, tenia pensat fer-ho avui al matí però... al final m'he liat (toma aresta) i no he pogut... No tindries pas una pista per ajudar-me? De quina assignatura estem parlant?</p>'''
        )
        self.textField.setAlignment(Qt.AlignJustify)
        self.textField.setWordWrap(True)
        self.textField.resize(600, 200)
        self.textField.move(0.167 * w, 0.78 * h)

        try:
            self.previousButton.clicked.disconnect()
        except:
            pass

        self.previousButton.clicked.connect(self.initWindow)

        self.nextButton.clicked.disconnect()
        self.nextButton.clicked.connect(self.videoFinal)

    def videoFinal(self):
        self.nextButton.hide()

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

        self.videoWidget = QVideoWidget(self)
        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(path)))

        self.videoWidget.show()
        self.videoWidget.resize(w, h)

        self.textField.hide()
        self.textBubble.hide()
        self.backgroundImage.hide()

        self.nextNewButton = QPushButton(self)
        self.nextNewButton.setStyleSheet(
            "QPushButton{background-color: white;}")
        # self.nextNewButton.setStyleSheet("QPushButton{background: transparent;}")
        self.nextNewButton.move(0.85 * w, 0.83 * h)
        self.nextNewButton.setIcon(
            QIcon(resource_path('./images/icons/next.png')))
        self.nextNewButton.show()

        self.mediaPlayer.play()

        # self.video.show()

        try:
            self.nextNewButton.clicked.disconnect()
        except:
            pass

        self.nextNewButton.clicked.connect(self.finalAnswer)

    def finalAnswer(self):
        self.nextNewButton.hide()
        self.videoWidget.hide()
        self.textField.setText(
            '''<p> - Finalment, de quina assignatura ha sigut l'examen que has fet avui? </p>'''
        )
        self.textField.setAlignment(Qt.AlignJustify)
        self.textField.setWordWrap(True)
        self.textField.resize(600, 200)
        self.textField.move(0.167 * w, 0.78 * h)

        self.inputPassword.show()
        self.checkButton.show()

        self.textField.show()
        self.textBubble.show()

    def checkAnswerSecondExercise(self):
        self.finalFinal = FinalFinal()
        self.close()
コード例 #9
0
class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("PyQt5 Media Player")
        self.setGeometry(0, 0, 700, 600)
        self.setWindowIcon(QIcon('player.png'))

        p = self.palette()
        p.setColor(QPalette.Window, Qt.black)
        self.setPalette(p)
        self.init_ui()
        self.show()
        self.audio_process = False
        self.position = 0
        self.filename = '.'

    def init_ui(self):
        #create media player object
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        #create videowidget object

        videoHboxLayout = QHBoxLayout()
        self.videowidget = QVideoWidget()
        self.videowidget.setFixedHeight(300)
        self.videowidget.setFixedWidth(352)

        self.imagewidget = QLabel()
        self.imagewidget.setFixedWidth(352)
        self.imagewidget.setFixedHeight(300)

        videoHboxLayout.addWidget(self.videowidget)
        videoHboxLayout.addWidget(self.imagewidget)
        videoHboxLayout.setContentsMargins(0, 0, 0, 0)
        videoHboxLayout.setSpacing(0)

        #create open button
        openBtn = QPushButton('Open Video')
        openBtn.clicked.connect(self.open_file)

        #create button for playing
        self.playBtn = QPushButton()
        self.playBtn.setEnabled(False)
        self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playBtn.clicked.connect(self.play_video)

        self.stopBtn = QPushButton()
        self.stopBtn.setEnabled(False)
        self.stopBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.stopBtn.clicked.connect(self.reset_video)

        #create label
        self.label = QLabel()
        self.label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)

        #create hbox layout
        hboxLayout = QHBoxLayout()
        hboxLayout.setContentsMargins(0, 0, 0, 0)

        #set widgets to the hbox layout
        hboxLayout.addWidget(openBtn)
        hboxLayout.addWidget(self.playBtn)
        hboxLayout.addWidget(self.stopBtn)

        synopLayout = QVBoxLayout()
        synopLayout.setContentsMargins(0, 0, 0, 0)
        synopLayout.setSpacing(0)
        self.generate_synopsis_video(synopLayout)
        self.generate_synopsis_image(synopLayout)

        # image1 = ClickLabel()
        # pixmap = QPixmap('../test.jpg')
        # image1.setPixmap(pixmap)
        # image1.setFixedSize(100, 50)
        #
        # image1.clicked.connect(self.synopsis_click_handler)
        # synopImageLayout.addWidget(image1)

        #create vbox layout
        vboxLayout = QVBoxLayout()
        vboxLayout.addLayout(videoHboxLayout)
        vboxLayout.addLayout(hboxLayout)
        vboxLayout.addWidget(self.label)
        vboxLayout.addLayout(synopLayout)

        self.setLayout(vboxLayout)

        self.mediaPlayer.setVideoOutput(self.videowidget)

        pal = self.palette()
        pal.setBrush(QPalette.Window, QBrush(QPixmap("../keyimages/1.png")))
        self.videowidget.setPalette(pal)

        #media player signals

        self.mediaPlayer.stateChanged.connect(self.mediastate_changed)
        self.mediaPlayer.positionChanged.connect(self.position_changed)

        self.imagewidget.hide()

    def generate_synopsis_video(self, synopLayout):

        frame_folder = os.path.join(parent_dir, 'keyframes')
        image_dir = os.listdir(frame_folder)
        image_dir.remove('.gitignore')
        image_dir.remove('.DS_Store')
        image_dir.sort(key=lambda img: (int(img.split('_')[0][-1]) * 10000 +
                                        int(img.split('_')[1].split('.')[0])))
        images = [image for image in image_dir]
        count = 0

        synopImageLayout = QHBoxLayout()
        synopImageLayout.setContentsMargins(0, 0, 0, 0)
        synopImageLayout.setSpacing(0)

        for imageName in images:
            # frame_time = int(imageName.split('_')[1].split('.')[0])
            video_no = int(imageName.split('_')[0][-1])
            timestamp = (int(imageName.split('_')[1].split('.')[0]))
            image_label = ClickLabel()
            pixmap = QPixmap(os.path.join(parent_dir, 'keyframes', imageName))\
                .scaled(44, 36, Qt.KeepAspectRatio, Qt.FastTransformation)
            image_label.setPixmap(pixmap)
            image_label.clicked.connect(lambda t=timestamp, n=video_no: self.
                                        synopsis_click_handler(t, n))
            synopImageLayout.addWidget(image_label)
            count += 1
            if count == 17:
                synopLayout.addLayout(synopImageLayout)
                synopImageLayout = QHBoxLayout()
                synopImageLayout.setContentsMargins(0, 0, 0, 0)
                synopImageLayout.setSpacing(0)
                count = 0

    def generate_synopsis_image(self, synopLayout):
        image_folder = os.path.join(parent_dir, 'keyimages')
        image_dir = os.listdir(image_folder)
        image_dir.remove('.DS_Store')
        image_dir.sort(key=lambda img: int(img.split('.')[0]))
        images = [image for image in image_dir]
        count = 0
        rowcount = 0
        synopImageLayout = QHBoxLayout()
        synopImageLayout.setContentsMargins(0, 0, 0, 0)
        synopImageLayout.setSpacing(0)
        for imageName in images:
            image_no = int(imageName.split('.')[0])
            image_label = ClickLabel()
            pixmap = QPixmap(os.path.join(image_folder, imageName)) \
                .scaled(44, 36, Qt.KeepAspectRatio, Qt.FastTransformation)
            image_label.setPixmap(pixmap)
            image_label.clicked.connect(
                lambda filename=os.path.join(image_folder, imageName): self.
                image_synopsis_click_handler(filename))
            synopImageLayout.addWidget(image_label)
            count += 1
            if count == 17:
                synopLayout.addLayout(synopImageLayout)
                rowcount += 1
                if rowcount > 3:
                    return
                synopImageLayout = QHBoxLayout()
                synopImageLayout.setContentsMargins(0, 0, 0, 0)
                synopImageLayout.setSpacing(0)
                count = 0

    def open_video_file(self, filename):
        path = os.path.join(parent_dir, 'videos')
        mp4_path = os.path.join(path, 'mp4')
        avi_path = os.path.join(path, 'avi')
        mp4_name = filename + '.mp4'
        avi_name = filename + '.avi'
        mp4_dir = os.listdir(mp4_path)
        for mp4 in mp4_dir:
            if mp4_name == mp4:
                self.mediaPlayer.setMedia(
                    QMediaContent(
                        QUrl.fromLocalFile(os.path.join(mp4_path, mp4_name))))
                self.stopBtn.setEnabled(True)
                self.playBtn.setEnabled(True)
                self.filename = mp4_name
                return

        convert_avi_to_mp4(os.path.join(avi_path, avi_name),
                           os.path.join(mp4_path, mp4_name))
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(os.path.join(mp4_path,
                                                          mp4_name))))
        self.playBtn.setEnabled(True)
        self.stopBtn.setEnabled(True)
        self.filename = mp4_name

    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, "Open Video")
        if os.path.splitext(filename)[1] == '.avi':
            output_name = os.path.dirname(filename) + '/output.mp4'
            convert_avi_to_mp4(filename, output_name)
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(output_name)))
            self.playBtn.setEnabled(True)

        elif filename != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(filename)))
            self.playBtn.setEnabled(True)

    def play_video(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
            if self.audio_process:
                self.audio_process.kill()
                self.audio_process = False

        else:
            self.mediaPlayer.play()
            self.create_audio_process(
                '../videos/{filename}/audio.wav'.format(
                    filename=self.filename.split('.')[0]),
                self.position / 1000)

    def reset_video(self):
        self.mediaPlayer.pause()
        self.mediaPlayer.setPosition(0)
        if self.audio_process:
            self.audio_process.kill()
            self.audio_process = False

    def mediastate_changed(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 create_audio_process(self, filename, start_time):
        if self.audio_process:
            self.audio_process.kill()
        cmd = "python3 audio.py {filename} {start}".format(filename=filename,
                                                           start=start_time)
        self.audio_process = subprocess.Popen(cmd, shell=True)

    def position_changed(self, position):
        self.position = position

    def duration_changed(self, duration):
        self.slider.setRange(0, duration)

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

    def handle_errors(self):
        self.playBtn.setEnabled(False)
        self.label.setText("Error: " + self.mediaPlayer.errorString())

    def stop_video(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.play_video()

    def image_synopsis_click_handler(self, filename):
        self.imagewidget.show()
        self.videowidget.hide()
        self.stop_video()
        self.playBtn.setEnabled(False)
        self.stopBtn.setEnabled(False)
        pixmap = QPixmap(filename)
        self.imagewidget.setPixmap(pixmap)

    def synopsis_click_handler(self, frame, video_no):
        self.imagewidget.hide()
        self.videowidget.show()
        self.playBtn.setEnabled(True)
        self.stopBtn.setEnabled(True)
        new_filename = 'video' + str(video_no)
        if self.filename.split('.')[0] != new_filename:
            self.open_video_file(new_filename)

        time = frame / 30 * 1000
        self.mediaPlayer.setPosition(time)
        self.position = time
        self.stop_video()
コード例 #10
0
class Window(QWidget):
    COLUMNS_DICT = {
        # "Column label": {'index': column_ID, 'width': column_width}
        "ID": {
            "index": 0,
            "width": 25
        },
        "File name": {
            "index": 1,
            "width": 165
        },
        "Format": {
            "index": 2,
            "width": 50
        },
        "Dup": {
            "index": 3,
            "width": 5
        },
    }

    def __init__(self, statusBar):
        super().__init__()

        # store active image ID
        self.active_image_id = str()

        # Saves multiple duplicate windows references:
        self.duplicateRefs = {}

        # Gets status bar from QMainWindow:
        self.statusBar = statusBar

        # Initializes all window elements:
        self.folderField = QLineEdit()
        self.folderButton = QPushButton()
        self.folderTreeCheckbox = QCheckBox("Include sub-folders")
        self.processButton = QPushButton("Process media files")
        self.duplicateButton = QPushButton("Find duplicates")
        self.reindexButton = QPushButton("Reindex database files")
        self.tableTabs = QTabWidget()
        # init main images list table
        self.imageListTable = QTableWidget()
        # set main images list table fields unchanged
        self.imageListTable.setEditTriggers(QTableWidget.NoEditTriggers)
        # init main videos list table
        self.videoListTable = QTableWidget()
        # set main videos list table fields unchanged
        self.videoListTable.setEditTriggers(QTableWidget.NoEditTriggers)

        # set up image fields and elements
        self.imageField = QLabel()
        self.imageNameField = QLabel()
        self.imageParamsField = QLabel()

        self.imageCopyButton = QPushButton("Copy image")
        self.imageCopyButton.setIcon(QIcon("gui/static/icon_copy.png"))
        self.imageCopyButton.clicked.connect(self.copy_image_path)
        self.imageViewButton = QPushButton("View image")
        self.imageViewButton.setIcon(QIcon("gui/static/icon_open_image.svg"))
        self.imageViewButton.clicked.connect(self.open_image_file)
        self.imageOpenDirButton = QPushButton("Open dir")
        self.imageOpenDirButton.setIcon(
            QIcon("gui/static/icon_open_folder.svg"))
        self.imageOpenDirButton.clicked.connect(self.open_image_path)
        self.imageDeleteButton = QPushButton("Delete")
        self.imageDeleteButton.setIcon(
            QIcon("gui/static/icon_delete_file.png"))
        self.imageDeleteButton.clicked.connect(self.delete_image)

        self.videoField = QVideoWidget()
        self.videoPlayer = QMediaPlayer()

        # Adjusts settings for the window elements:
        self.folderField.setDisabled(True)

        self.folderButton.setIcon(QIcon("gui/static/icon_process_folder.png"))
        self.folderButton.clicked.connect(self.set_folder)

        self.processButton.clicked.connect(self.process_files)
        self.processButton.setFixedWidth(160)
        self.processButton.setDisabled(True)

        self.duplicateButton.clicked.connect(self.find_duplicates)
        self.duplicateButton.setFixedWidth(160)

        self.reindexButton.clicked.connect(self.reindex_db_data)
        self.reindexButton.setFixedWidth(160)

        # prepare tables for images and videos
        self.imagesTab = self.tableTabs.insertTab(0, self.imageListTable,
                                                  "Images")
        self.videosTab = self.tableTabs.insertTab(1, self.videoListTable,
                                                  "Videos")

        # images list table setup
        self.imageListTable.setColumnCount(len(self.COLUMNS_DICT.keys()))
        self.imageListTable.setHorizontalHeaderLabels(self.COLUMNS_DICT.keys())
        self.imageListTable.verticalHeader().setVisible(False)
        self.imageListTable.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.imageListTable.setSortingEnabled(True)
        self.imageListTable.cellClicked.connect(self.show_image)

        # videos list table setup
        self.videoListTable.setColumnCount(len(self.COLUMNS_DICT.keys()))
        self.videoListTable.setHorizontalHeaderLabels(self.COLUMNS_DICT.keys())
        self.videoListTable.verticalHeader().setVisible(False)
        self.videoListTable.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.videoListTable.setSortingEnabled(True)
        self.videoListTable.cellClicked.connect(self.show_video)

        # set images and videos duplicates columns width
        self.set_columns_width()

        # Places the window elements on the window:
        # Top-left cell of main grid box:
        subGridBox = QWidget()
        subGrid = QGridLayout()
        subGrid.addWidget(self.folderField, 0, 0)
        subGrid.addWidget(self.folderButton, 0, 1)
        subGrid.addWidget(self.folderTreeCheckbox, 1, 0)
        subGrid.addWidget(self.processButton, 2, 0, 1, 2, Qt.AlignCenter)
        subGrid.addWidget(self.duplicateButton, 3, 0, 1, 2, Qt.AlignCenter)
        subGrid.addWidget(self.reindexButton, 4, 0, 1, 2, Qt.AlignCenter)
        subGridBox.setLayout(subGrid)

        # image data grid box
        imageGridBox = QWidget()
        imageGrid = QGridLayout()
        imageGrid.addWidget(self.imageField, 0, 0, 1, 4, Qt.AlignCenter)
        # add image buttons
        imageGrid.addWidget(self.imageCopyButton, 1, 0, 1, 1)
        imageGrid.addWidget(self.imageViewButton, 1, 1, 1, 1)
        imageGrid.addWidget(self.imageOpenDirButton, 1, 2, 1, 1)
        imageGrid.addWidget(self.imageDeleteButton, 1, 3, 1, 1)

        imageGrid.addWidget(self.imageNameField, 2, 0, 1, 1)
        imageGrid.addWidget(self.imageParamsField, 2, 3, 1, 1)
        imageGridBox.setLayout(imageGrid)

        # Main grid box:
        self.mainGrid = QGridLayout()
        self.mainGrid.addWidget(subGridBox, 0, 0)
        self.mainGrid.addWidget(self.tableTabs, 1, 0)
        self.mainGrid.addWidget(imageGridBox, 1, 1)
        self.mainGrid.addWidget(self.videoField, 0, 1, 2, 1)
        self.mainGrid.setColumnMinimumWidth(0, 400)
        self.mainGrid.setRowMinimumHeight(1, 600)
        self.mainGrid.setColumnStretch(1, 1)

        self.setLayout(self.mainGrid)

        # Creates a QThread instance:
        self.thread = ProcessingThread(self.folderField, self.imageListTable,
                                       self.videoListTable,
                                       self.folderTreeCheckbox)

        self.thread.finishedTrigger.connect(self.finish_thread)

        # filling table while first run
        self.reindex_db_data()
        # hide image interface
        self.hide_active_image()

    def set_columns_width(self):
        # looping all columns and set with
        for value in self.COLUMNS_DICT.values():
            self.imageListTable.setColumnWidth(value["index"], value["width"])
            self.videoListTable.setColumnWidth(value["index"], value["width"])

    def reindex_db_data(self):
        self.duplicateButton.setDisabled(True)
        self.processButton.setDisabled(True)
        self.reindexButton.setDisabled(True)
        # Reindex already exist folders and files; Image and Video files
        reindex_image_files()
        reindex_video_files()
        # run table filling after reindexing
        self.table_data_init()
        self.duplicateButton.setEnabled(True)
        self.processButton.setEnabled(True)
        self.reindexButton.setEnabled(True)

    def center_widget_item(self, text: str) -> QTableWidgetItem:
        # create the item
        center_align_item = QTableWidgetItem(text)
        # change the alignment
        center_align_item.setTextAlignment(Qt.AlignCenter)
        return center_align_item

    def table_data_init(self):
        # get available images from DB
        with db_session():
            images = Image.all()

        for idx, image in enumerate(images):
            numRows = self.imageListTable.rowCount()
            self.imageListTable.insertRow(numRows)

            str_image_idx = str(idx)

            IMAGE_PATH_DICT[str_image_idx] = {
                "id": image.id,
                "name": image.image_name,
                "additional_attrs": {
                    "height": image.image_height,
                    "width": image.image_width
                },
                "folder": image.image_path,
                "type": (image.image_name.split(".")[-1]).lower(),
                "full_path": image.full_path(),
            }

            self.imageListTable.setItem(idx, self.COLUMNS_DICT["ID"]["index"],
                                        self.center_widget_item(str_image_idx))
            self.imageListTable.setItem(
                idx,
                self.COLUMNS_DICT["File name"]["index"],
                self.center_widget_item(image.image_name),
            )
            self.imageListTable.setItem(
                idx,
                self.COLUMNS_DICT["Format"]["index"],
                self.center_widget_item(
                    IMAGE_PATH_DICT[str_image_idx]["type"]),
            )

            duplicateIcon = QTableWidgetItem()
            duplicateIcon.setIcon(QIcon("gui/static/icon_view_duplicates.png"))
            self.imageListTable.setItem(idx, self.COLUMNS_DICT["Dup"]["index"],
                                        duplicateIcon)

    def hide_active_image(self):
        self.imageField.hide()
        self.imageCopyButton.hide()
        self.imageViewButton.hide()
        self.imageOpenDirButton.hide()
        self.imageDeleteButton.hide()
        self.imageNameField.hide()
        self.imageParamsField.hide()

    def show_active_image(self):
        self.imageField.show()
        self.imageCopyButton.show()
        self.imageViewButton.show()
        self.imageOpenDirButton.show()
        self.imageDeleteButton.show()
        self.imageNameField.show()
        self.imageParamsField.show()

    def open_image_file(self):
        open_path(path=IMAGE_PATH_DICT[self.active_image_id]["full_path"])

    def open_image_path(self):
        open_path(path=IMAGE_PATH_DICT[self.active_image_id]["folder"])

    def delete_image(self):
        # count image table position
        image_table_position = list(IMAGE_PATH_DICT.keys()).index(
            self.active_image_id)

        message = QMessageBox().question(
            self,
            "Confirm deletion",
            "Delete duplicate media file?",
            QMessageBox.Yes | QMessageBox.No,
        )
        if message == QMessageBox.Yes:
            self.imageListTable.removeRow(image_table_position)
            image_id = IMAGE_PATH_DICT[self.active_image_id]["id"]
            # run custom delete
            with db_session():
                Image[image_id].custom_delete()

            # delete image key from dict
            del IMAGE_PATH_DICT[self.active_image_id]

            self.hide_active_image()
            QMessageBox().information(self, "File deletion",
                                      "File success deleted", QMessageBox.Ok,
                                      QMessageBox.Ok)
        elif message == QMessageBox.No:
            pass

    def copy_image_path(self):
        try:
            result = copy_image(
                IMAGE_PATH_DICT[self.active_image_id]["full_path"])
            if result:
                QMessageBox.information(
                    self,
                    "Copy path",
                    "Success!\nFile copied to clipboard!",
                    QMessageBox.Ok,
                    QMessageBox.Ok,
                )
            else:
                QMessageBox.warning(
                    self,
                    "Copy path",
                    "Error!\nSorry, i can`t copy image to clipboard.",
                    QMessageBox.Ok,
                    QMessageBox.Ok,
                )

        except Exception:
            print(traceback.format_exc())
            QMessageBox.warning(
                self,
                "Copy path",
                f"Error!\n{traceback.format_exc()}",
                QMessageBox.Ok,
                QMessageBox.Ok,
            )

    # Get a folder full of multimedia files to work with
    def set_folder(self):
        self.folderPath = QFileDialog.getExistingDirectory(self)
        if self.folderPath == "":
            self.folderPath = self.folderField.text()
        self.folderField.setText(self.folderPath)
        self.processButton.setEnabled(True)
        self.statusBar.clearMessage()

    # Start the thread and fill the table with those files
    def process_files(self):
        # set other buttons disabled
        self.duplicateButton.setDisabled(True)
        self.reindexButton.setDisabled(True)

        # Clears both tables upon restarting function:
        self.imageListTable.clearContents()
        self.imageListTable.setRowCount(0)
        self.videoListTable.clearContents()
        self.videoListTable.setRowCount(0)

        self.statusBar.setStyleSheet("color: black")
        self.statusBar.showMessage("Processing...")

        if self.folderField.text() == "":
            self.statusBar.setStyleSheet("color: red")
            self.statusBar.showMessage("Please choose a directory")
            self.duplicateButton.setEnabled(True)
            self.reindexButton.setEnabled(True)
            return None

        if not self.thread.isRunning():
            self.duplicateRefs.clear()
            self.thread.start()
            self.processButton.setText("Stop")

        elif self.thread.isRunning():
            self.thread.terminate()
            self.processButton.setText("Process media files")
            self.duplicateButton.setEnabled(True)
            self.reindexButton.setEnabled(True)

    # Thread done and ded
    def finish_thread(self):
        self.statusBar.setStyleSheet("color: black")
        self.statusBar.showMessage("Finished!")
        self.processButton.setText("Process media files")
        # set all buttons able
        self.duplicateButton.setEnabled(True)
        self.reindexButton.setEnabled(True)

    # Start the second thread and remove all unique files from the table
    def find_duplicates(self):
        if IMAGE_PATH_DICT == {}:
            self.statusBar.setStyleSheet("color: red")
            self.statusBar.showMessage("Please process your media files first")
            return None

        self.duplicateButton.setDisabled(True)
        self.processButton.setDisabled(True)
        self.reindexButton.setDisabled(True)
        self.statusBar.setStyleSheet("color: black")
        self.statusBar.showMessage("Finding duplicates...")

        with db_session():
            # get all images descriptors
            image_files_query = Image.get_descriptors()

        pairs_amount = int(
            len(image_files_query) * (len(image_files_query) - 1) / 2)

        QMessageBox.information(
            self,
            "Find duplicates",
            f"""
            Similar images search start. Please wait!\n
            You have ~{pairs_amount} images pairs;
            Work will get ~{round(pairs_amount*0.00006, 2)} sec.
            """,
            QMessageBox.Ok,
            QMessageBox.Ok,
        )

        # run function to find duplicates
        result = feature_description(images_list=image_files_query)
        with db_session():
            # save duplicates to DB
            save_images_duplicates(result)

        QMessageBox.information(self, "Find duplicates", "Success!",
                                QMessageBox.Ok, QMessageBox.Ok)
        # set all buttons able
        self.duplicateButton.setEnabled(True)
        self.reindexButton.setEnabled(True)
        self.processButton.setEnabled(True)

        # TODO: new thread removing all unique media. Only duplicates remain

    # Show an image upon clicking its name in the table
    def show_image(self, row, column):
        imageId = self.imageListTable.item(row, 0).text()

        # set new active image id
        self.active_image_id = imageId

        # Removes a video from screen if shown:
        self.videoPlayer.stop()
        self.videoField.hide()
        # show active image
        self.show_active_image()

        # show image and additional data
        self.imageNameField.setText(f"{IMAGE_PATH_DICT[imageId]['name']}")
        self.imageParamsField.setText(
            f"HxW: {IMAGE_PATH_DICT[imageId]['additional_attrs']['height']}px"
            + f" x {IMAGE_PATH_DICT[imageId]['additional_attrs']['width']}px")

        # Shows animated images
        if IMAGE_PATH_DICT[imageId]["name"].lower().endswith("gif"):
            gif = QMovie(IMAGE_PATH_DICT[imageId]["full_path"])
            gifSize = QSize(*self.smooth_gif_resize(
                IMAGE_PATH_DICT[imageId]["full_path"], 600, 600))
            gif.setScaledSize(gifSize)
            self.imageField.setMovie(gif)
            gif.start()

        # Shows static images
        else:
            self.imageField.setPixmap(
                QPixmap(IMAGE_PATH_DICT[imageId]["full_path"]).scaled(
                    600, 600, Qt.KeepAspectRatio, Qt.SmoothTransformation))

        if column == self.COLUMNS_DICT["Dup"]["index"]:
            self.duplicateWindow = DuplicateWindow(
                image_data=IMAGE_PATH_DICT[imageId], raw_id=imageId)
            if imageId not in self.duplicateRefs.keys():
                self.duplicateRefs[imageId] = self.duplicateWindow
                self.duplicateWindow.show()
            self.duplicateWindow.closeTrigger.connect(self.delete_reference)

    # Show a video upon clicking its name in the table
    def show_video(self, row, column):
        videoItem = self.videoListTable.item(row, column)
        videoId = self.videoListTable.item(row, 0).text()
        self.mainGrid.setColumnMinimumWidth(1, 800)

        # Prevents from KeyError when clicking the second column:
        if videoItem.text() == VIDEO_PATH_DICT[videoId][0]:
            videoItemPath = VIDEO_PATH_DICT[videoId][2]
            videoContent = QMediaContent(QUrl.fromLocalFile(videoItemPath))
            self.videoPlayer.setMedia(videoContent)
            self.videoPlayer.setVideoOutput(self.videoField)

            # Removes an image from screen if shown and starts video:
            self.imageField.clear()
            self.imageField.hide()
            self.videoField.show()
            self.videoPlayer.play()

    # Remove a previously added reference from a dict if a DuplicateWindow was closed
    # so it can be opened again
    def delete_reference(self, itemId):
        self.duplicateRefs.pop(itemId)

    # An amazing workaround for gif resizing procedure
    # because PyQt's native one doesn't work for some reason:
    def smooth_gif_resize(self, gif, frameWidth, frameHeight):
        gif = Pil_Image.open(gif)
        gifWidth0, gifHeight0 = gif.size

        widthRatio = frameWidth / gifWidth0
        heightRatio = frameHeight / gifHeight0

        if widthRatio >= heightRatio:
            gifWidth1 = gifWidth0 * heightRatio
            gifHeight1 = frameHeight
            return gifWidth1, gifHeight1

        gifWidth1 = frameWidth
        gifHeight1 = gifHeight0 * widthRatio
        return gifWidth1, gifHeight1
コード例 #11
0
class Ui_MainWindow(object):

    def __init__(self):
        self.timer_thread = TimerThread()
        self.timer_thread.update_signal.connect(self.update_lcd)

        self.rpi = revpimodio2.RevPiModIO(autorefresh=True)
        self.rpi.handlesignalend(self.cleanup_revpi)
        self.rpi.io.I_1.reg_event(toggle_input, prefire=True)
        self.rpi.io.I_1.reg_event(self.send_toggle_signal)

    def setup_ui(self, MainWindow):
        MainWindow.setObjectName("KnockOutMachine")

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.main_picture = QtWidgets.QLabel(self.centralwidget)
        self.pixmap = QtGui.QPixmap("display/main_menu.png")
        self.scaledPixmap = self.pixmap.scaled(900, 900, QtCore.Qt.KeepAspectRatio)
        self.main_picture.setPixmap(self.scaledPixmap)

        self.pictures = QtWidgets.QLabel()
        self.pictures.setObjectName("pictures")
        self.pictures.setAlignment(QtCore.Qt.AlignCenter)
        self.pictures.setMinimumSize(500, 500)
        self.pictures.hide()

        self.player = QtMultimedia.QMediaPlayer(None, QMediaPlayer.VideoSurface)

        self.video_frame = QVideoWidget()
        self.video_frame.resize(960, 540)
        self.video_frame.hide()

        palette = QtGui.QPalette()
        palette.setColor(QtGui.QPalette.Text, QtCore.Qt.white)
        mfont = QtGui.QFont("Times", 80, QtGui.QFont.Bold)
        self.messages = QtWidgets.QLineEdit(self.centralwidget)
        self.messages.setObjectName("messages")
        self.messages.setAlignment(QtCore.Qt.AlignCenter)
        self.messages.setPalette(palette)
        self.messages.setReadOnly(True)
        self.messages.setFont(mfont)
        self.messages.setFixedSize(1400, 200)
        self.messages.hide()

        self.model = QtGui.QStandardItemModel(self.centralwidget)
        tableFont = QtGui.QFont("Times", 16)
        self.tableview = QtWidgets.QTableView(self.centralwidget)
        self.tableview.setObjectName("tableView")
        self.tableview.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.tableview.setMaximumWidth(500)
        self.tableview.setMaximumHeight(900)
        self.tableview.verticalHeader().setDefaultSectionSize(85)
        self.tableview.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
        self.tableview.setFont(tableFont)
        self.tableview.setModel(self.model)
        self.tableview.hide()

        self.input_window = QtWidgets.QWidget()
        self.input_window.setWindowTitle("Bitte Namen eingeben")
        self.input_window.resize(300, 100)
        self.input_window.move(850, 820)
        # self.input_window.setWindowFlags(
        #     QtCore.Qt.Window | QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        self.input_window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)

        self.input_layout = QtWidgets.QFormLayout()

        self.input_dialogue = QtWidgets.QLineEdit(self.centralwidget)
        self.input_dialogue.setMaxLength(30)

        buttonFont = QtGui.QFont("Times", 16, QtGui.QFont.Bold)
        self.startButton = QtWidgets.QPushButton(self.centralwidget)
        self.startButton.setFixedSize(191, 71)
        self.startButton.setFont(buttonFont)
        self.startButton.setObjectName("startButton")
        self.startButton.clicked.connect(lambda: self.on_start_button_clicked())

        self.inputButton = QtWidgets.QPushButton(self.centralwidget)
        self.inputButton.setObjectName("inputButton")
        self.inputButton.resize(self.inputButton.sizeHint())
        self.inputButton.setDisabled(True)

        self.highscoreButton = QtWidgets.QPushButton(self.centralwidget)
        self.highscoreButton.setFont(buttonFont)
        self.highscoreButton.setObjectName("highscoreButton")
        self.highscoreButton.setFixedSize(191, 71)
        self.highscoreButton.clicked.connect(lambda: self.on_high_score_button_clicked())

        self.cancelTimerButton = QtWidgets.QPushButton(self.centralwidget)
        self.cancelTimerButton.setFont(buttonFont)
        self.cancelTimerButton.setObjectName("cancelTimerButton")
        self.cancelTimerButton.setFixedSize(191, 71)
        self.cancelTimerButton.clicked.connect(lambda: self.exit_timer_function())
        self.cancelTimerButton.hide()

        self.cancelScoreButton = QtWidgets.QPushButton(self.centralwidget)
        self.cancelScoreButton.setFont(buttonFont)
        self.cancelScoreButton.setObjectName("cancelScoreButton")
        self.cancelScoreButton.setFixedSize(191, 71)
        self.cancelScoreButton.clicked.connect(lambda: self.exit_score_function())
        self.cancelScoreButton.hide()

        self.lcdCounter = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdCounter.setEnabled(False)
        self.lcdPalette = self.lcdCounter.palette()
        self.lcdCounter.setFixedSize(1350, 750)
        self.lcdCounter.setSmallDecimalPoint(False)
        self.lcdCounter.setDigitCount(5)
        self.lcdCounter.setObjectName("lcdCounter")
        self.lcdCounter.display("00.00")
        self.lcdCounter.hide()

        self.glass_not_set_timer, self.glass_set_timer = QtCore.QTimer(), QtCore.QTimer()

        self.glass_set_timer.setSingleShot(True)
        self.glass_set_timer.setInterval(100)
        self.glass_set_timer.timeout.connect(self.glass_set)

        self.glass_not_set_timer.setSingleShot(True)
        self.glass_not_set_timer.setInterval(100)
        self.glass_not_set_timer.timeout.connect(self.glass_not_set)

        self.vboxPictures = QtWidgets.QVBoxLayout()
        self.vboxPictures.addWidget(self.main_picture, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.lcdCounter, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.messages, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.pictures, 1)
        self.vboxPictures.addWidget(self.video_frame, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.tableview, 0, QtCore.Qt.AlignCenter)

        self.hboxButtons = QtWidgets.QHBoxLayout()
        self.hboxButtons.addWidget(self.startButton)
        self.hboxButtons.addWidget(self.highscoreButton)
        self.hboxButtons.addWidget(self.cancelTimerButton)
        self.hboxButtons.addWidget(self.cancelScoreButton)

        self.input_layout.addRow("", self.input_dialogue)
        self.input_layout.addRow("", self.inputButton)
        self.input_window.setLayout(self.input_layout)

        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addLayout(self.vboxPictures)
        self.vbox.addStretch(1)
        self.vbox.addLayout(self.hboxButtons)
        self.vbox.addStretch(1)

        self.input_dialogue.textChanged.connect(self.enable_input_button)
        self.input_dialogue.returnPressed.connect(self.inputButton.click)
        self.inputButton.clicked.connect(lambda: self.update_scores(self.input_dialogue.text(), runTime))
        self.inputButton.clicked.connect(lambda: self.input_window.close())
        self.inputButton.clicked.connect(lambda: self.exit_timer_function())
        self.centralwidget.setLayout(self.vbox)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        locale.setlocale(locale.LC_ALL, '')

        self.retranslate_ui(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslate_ui(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("KnockOutMachine", "KnockOutMachine"))
        MainWindow.showFullScreen()
        MainWindow.setStyleSheet("background-color: #113f0c;")

        self.startButton.setText(_translate("KnockOutMachine", "Messung starten"))
        self.startButton.setStyleSheet("background-color: white;")
        self.inputButton.setText(_translate("KnockOutMachine", "Eingabe bestätigen"))
        self.messages.setStyleSheet("border: none;")
        self.highscoreButton.setText(_translate("KnockOutMachine", "Bestenliste"))
        self.highscoreButton.setStyleSheet("background-color: white;")
        # self.cancelButton.setText(_translate("KnockOutMachine", "Abbrechen"))
        self.cancelTimerButton.setIcon(QtGui.QIcon("display/cancel_button.png"))
        self.cancelTimerButton.setIconSize(QtCore.QSize(50, 50))
        self.cancelTimerButton.setStyleSheet("background-color: white;")
        self.cancelScoreButton.setIcon(QtGui.QIcon("display/cancel_button.png"))
        self.cancelScoreButton.setIconSize(QtCore.QSize(50, 50))
        self.cancelScoreButton.setStyleSheet("background-color: white;")
        self.lcdCounter.setStyleSheet("background-color: #113f0c;")
        self.lcdCounter.setStyleSheet("color: white;")
        self.tableview.setStyleSheet("background-color: white;")

    def enable_input_button(self):
        if len(self.input_dialogue.text()) > 0:
            self.inputButton.setDisabled(False)
        else:
            self.inputButton.setDisabled(True)

    def on_start_button_clicked(self):
        self.lcdCounter.display("00.00")
        self.movie = QtGui.QMovie("")
        self.lcdCounter.setEnabled(True)
        self.lcdCounter.show()
        self.cancelTimerButton.show()
        self.startButton.hide()
        self.highscoreButton.hide()
        self.main_picture.hide()
        self.rpi.mainloop(blocking=False)

        if Input_I1:
            self.glass_not_set()
        else:
            self.glass_set()

    def on_high_score_button_clicked(self):
        self.highscoreButton.hide()
        self.startButton.setDisabled(True)
        self.startButton.hide()
        self.main_picture.hide()
        self.video_frame.hide()
        self.cancelScoreButton.show()
        self.tableview.show()
        self.model.clear()
        self.model.setHorizontalHeaderLabels(['Name', 'Zeit in Sekunden'])
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.Qt.AlignJustify, QtCore.Qt.TextAlignmentRole)
        self.delimiter = ';'

        try:
            with open('timeList.csv', 'r') as timeFile:
                reader = csv.reader(timeFile, delimiter=self.delimiter)
                reader = [[x.replace(',', '.') for x in l] for l in reader]
                highscore_list_sorted = sorted(reader, key=lambda x: float(x[1]))[:10]

                for row in highscore_list_sorted:
                    times = [
                        QtGui.QStandardItem(field.replace(".", ","))
                        for field in row
                    ]
                    self.model.appendRow(times)
                    self.tableview.setColumnHidden(2, True)
        except FileNotFoundError:
            print("Timelist File does not exist")

    def glass_not_set(self):
        self.glass_not_set_timer.start()
        self.messages.show()
        self.messages.setText("Bitte Glas vor Sensor stellen!")
        if not Input_I1:
            self.glass_not_set_timer.stop()
            self.glass_set()

    def glass_set(self):
        self.glass_set_timer.start()
        self.messages.show()
        self.messages.setText("Glas erkannt, wenn bereit los!")
        if Input_I1:
            self.glass_set_timer.stop()
            self.start_timer()

    def start_timer(self):
        self.messages.hide()
        # self.pictures.setMovie(self.movie)
        # self.lcdCounter.display(runTime)
        self.timer_thread.start()

    def update_lcd(self):
        self.lcdCounter.display(runTime)

    def update_scores(self, inputName, runTime):
        self.datetime = QtCore.QDateTime.currentDateTime()
        self.delimiter = ';'
        row = [inputName, runTime.replace(".", ","), self.datetime.toString(QtCore.Qt.DefaultLocaleShortDate)]

        with open('timeList.csv', 'a', newline='') as timeFile:
            writer = csv.writer(timeFile, delimiter=self.delimiter)
            writer.writerow(row)
        self.input_dialogue.clear()

    def play_sound(self, fileName, playVideo):
        if playVideo:
            self.file_path = "/var/lib/revpipyload/KnockOutMachine/display/" + fileName
            self.video_frame.show()
            self.player.setVideoOutput(self.video_frame)
            self.player.setPosition(0)
        else:
            self.file_path = "/var/lib/revpipyload/KnockOutMachine/sounds/" + fileName
        self.url = QtCore.QUrl.fromLocalFile(self.file_path)
        self.content = QtMultimedia.QMediaContent(self.url)
        self.player.setMedia(self.content)
        self.player.play()

    def show_pictures(self, runTime):
        self.messages.hide()
        self.lcdCounter.setFixedSize(1050, 450)
        self.play_video = False
        if runTime <= 200:
            self.file_name = "cheering.mp3"
            self.rand = randint(0, 2)
            self.case = lambda x: self.rand < x
            #if self.case(1):
            self.pictures.show()
            self.movie = QtGui.QMovie("display/Trump.gif")
            #else:
                #self.file_name = "endlich_normale_leute.mp4"
                #self.play_video = True
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

        elif runTime <= 500:
            self.file_name = "applause-2.mp3"
            self.rand = randint(0, 6)
            self.case = lambda x: self.rand < x
            if self.case(1):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/Bier.gif")
            elif self.case(2):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/2.gif")
            elif self.case(3):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/3.gif")
            elif self.case(4):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/4.gif")
            elif self.case(5):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/5.gif")
            else:
                self.pictures.show()
                self.movie = QtGui.QMovie("display/6.gif")
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

        elif runTime <= 800:
            self.file_name = "laughter-2.mp3"
            self.rand = randint(0, 2)
            self.case = lambda x: self.rand < x
            if self.case(1):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/Bier2.gif")
            else:
                self.pictures.show()
                self.movie = QtGui.QMovie("display/1.jpeg")
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

        else:
            self.pictures.show()
            self.file_name = "laughter-2.mp3"
            self.movie = QtGui.QMovie("display/dog.gif")
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

    # TODO toggle outputs in certain pattern
    def change_output(self, highscore):
        # red leds
        if highscore:
            self.rpi.io.O_5 = True
            self.rpi.io.O_6 = True
            self.rpi.io.O_7 = True

        t_end = time.time() + 10
        while time.time() < t_end:
            self.rpi.io.O_1 = not self.rpi.io.O_1
            self.rpi.io.O_2 = not self.rpi.io.O_2
            self.rpi.io.O_3 = not self.rpi.io.O_3

    def send_toggle_signal(self, ioname, iovalue):
        self.timer_thread.toggle_signal.emit()

    def exit_score_function(self):
        self.tableview.hide()
        self.cancelScoreButton.hide()
        self.pictures.hide()
        self.highscoreButton.show()
        self.startButton.setEnabled(True)
        self.startButton.show()
        self.main_picture.show()

    def exit_timer_function(self):
        self.rpi.exit(full=False)
        self.timer_thread.stop_timer_signal.emit()
        self.glass_set_timer.stop()
        self.glass_not_set_timer.stop()
        self.player.stop()
        self.lcdCounter.setEnabled(False)
        self.lcdCounter.hide()
        self.lcdCounter.setFixedSize(1350, 750)
        self.tableview.hide()
        self.video_frame.hide()
        self.cancelTimerButton.hide()
        self.messages.hide()
        self.pictures.hide()
        self.highscoreButton.show()
        self.startButton.setEnabled(True)
        self.startButton.show()
        self.main_picture.show()

    # TODO add cleanup if necessary
    def cleanup_revpi(self):
        return None