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()
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()
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()
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()
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)
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)
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()
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()
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()
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
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