def importEvents(self, data): self.setRowCount(0) TimeStampsIndex = 0 for key in data: self.rowNumb = self.rowCount() self.setRowCount(self.rowNumb + len(data[key])) timeStamp = QDateTimeEdit() timeStamp.setDisplayFormat("dd.MM.yyyy") timeStamp.setReadOnly(True) timeStampCell = QDateTime.currentDateTime() timeStampCell = QDateTime.fromString(key, "dd.MM.yyyy") timeStamp.setDateTime(timeStampCell) self.setCellWidget(TimeStampsIndex, 0, timeStamp) if len(data[key]) > 1: self.setSpan(TimeStampsIndex, 0, len(data[key]) , 1) for row in range(len(data[key])): cell_0 = QTableWidgetItem('') cell_0.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_0.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) cell_1 = QTableWidgetItem('') cell_1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_1.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self.setItem(TimeStampsIndex + row, 1, cell_0) self.setItem(TimeStampsIndex + row, 2, cell_1) self.item(TimeStampsIndex + row, 1).setText(self._IncomeSourceCategory[data[key][row][0]['cell_0']]) try: if len(data[key][row][1]) == 2: self.item(TimeStampsIndex + row, 2).setText("%.2f" % round(float(data[key][row][1]['cell_1.1']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.2']]) elif len(data[key][row][1]) == 4: self.item(TimeStampsIndex + row, 2).setText("%.2f" % round(float(data[key][row][1]['cell_1.1']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.2']] + " -- კონვერტირდა --> " + "%.2f" % round(float(data[key][row][1]['cell_1.3']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.4']]) except ValueError: pass TimeStampsIndex = TimeStampsIndex + len(data[key]) self.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents) self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) self.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch) self.scrollToBottom()
def importEvents(self, data): self.setRowCount(0) TimeStampsIndex = 0 for key in data: self.rowNumb = self.rowCount() self.setRowCount(self.rowNumb + len(data[key])) timeStamp = QDateTimeEdit() timeStamp.setDisplayFormat("dd.MM.yyyy") timeStamp.setReadOnly(True) timeStampCell = QDateTime.currentDateTime() timeStampCell = QDateTime.fromString(key, "dd.MM.yyyy") timeStamp.setDateTime(timeStampCell) self.setCellWidget(TimeStampsIndex, 0, timeStamp) if len(data[key]) > 1: self.setSpan(TimeStampsIndex, 0, len(data[key]) , 1) for row in range(len(data[key])): cell_0 = QTableWidgetItem('') cell_0.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_0.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) cell_1 = QTableWidgetItem('') cell_1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_1.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) cell_2 = QTableWidgetItem('') cell_2.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_2.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) cell_3 = QTableWidgetItem('') cell_3.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_3.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) cell_4 = QTableWidgetItem('') if data[key][row][4]['cell_4']: cell_4.setIcon(QtGui.QIcon('icon/cash.svg')) else: cell_4.setIcon(QtGui.QIcon('icon/card.svg')) cell_4.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter) cell_4.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled ) self.setItem(TimeStampsIndex + row, 1, cell_0) self.setItem(TimeStampsIndex + row, 2, cell_1) self.setItem(TimeStampsIndex + row, 3, cell_2) self.setItem(TimeStampsIndex + row, 4, cell_3) self.setItem(TimeStampsIndex + row, 5, cell_4) self.item(TimeStampsIndex + row, 1).setText(data[key][row][0]['cell_0']) if self._units[data[key][row][1]['cell_1.2']] == "--": self.item(TimeStampsIndex + row, 2).setText(self._units[data[key][row][1]['cell_1.2']]) else: self.item(TimeStampsIndex + row, 2).setText(data[key][row][1]['cell_1.1'] + self._units[data[key][row][1]['cell_1.2']]) self.item(TimeStampsIndex + row, 3).setText(self._category[data[key][row][2]['cell_2.1']]) try: if data[key][row][3]['cell_3.3'] == "--" or data[key][row][3]['cell_3.3'] == "": self.item(TimeStampsIndex + row, 4).setText("%.2f" % round(float(data[key][row][3]['cell_3.1']), 2) + self._CurrencyIndex[data[key][row][3]['cell_3.2']]) else: self.item(TimeStampsIndex + row, 4).setText("%.2f" % round(float(data[key][row][3]['cell_3.1']), 2) + self._CurrencyIndex[data[key][row][3]['cell_3.2']] + " ---> " + "%.2f" % round(float(data[key][row][3]['cell_3.3']), 2) + self._CurrencyIndex[data[key][row][3]['cell_3.4']]) except ValueError: pass if data[key][row][4]['cell_4']: self.item(TimeStampsIndex + row, 5).setText("ნაღდი") else: self.item(TimeStampsIndex + row, 5).setText("გადარიცხვა") TimeStampsIndex = TimeStampsIndex + len(data[key]) self.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents) self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch) self.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents) self.horizontalHeader().setSectionResizeMode(3, QHeaderView.ResizeToContents) self.horizontalHeader().setSectionResizeMode(4, QHeaderView.ResizeToContents) self.horizontalHeader().setSectionResizeMode(5, QHeaderView.ResizeToContents) self.scrollToBottom()
class Player(QMainWindow): """ A simple Media Player using VLC and Qt """ def __init__(self, master=None): super().__init__() self.setWindowTitle("CCTV by @XII") # creating a basic vlc instance self.instance = vlc.Instance() # creating an empty vlc media player self.mediaplayer = self.instance.media_player_new() self.path = '' self.initUI() self.isPaused = False self.setStyleSheet(open("style.qss", "r").read()) def initUI(self): """ Set up the user interface, signals & slots For better understaning, I made some shortcuts for variables, which is the instance of the QtWidgets classes. List of shortcuts(made): *btn - QPushButton; *lbl - QLabel; *slr - QSlider; *lyt - Q_lyt; *ctrl - ctrl; """ self.widget = QWidget(self) self.setCentralWidget(self.widget) #video widget self.videoframe = QFrame() self.palette = self.videoframe.palette() self.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(0, 0, 0)) self.videoframe.setPalette(self.palette) self.videoframe.setAutoFillBackground(True) #time value self.timevalue = QDateTimeEdit() self.timevalue.setDisplayFormat('hh:mm:ss') self.timevalue.setReadOnly(True) self.timevalue.setFixedSize(80, 30) #position slider self.position_slr = QSlider(QtCore.Qt.Horizontal, self) self.position_slr.setToolTip("Position") self.position_slr.setMaximum(1000) self.position_slr.sliderMoved.connect(self.set_position) #play button self.play_btn = QPushButton() self.play_btn.setProperty("onplay", True) self.play_btn.setObjectName("play") self.play_btn.clicked.connect(self.play_pause) #stop button self.stop_btn = QPushButton() self.stop_btn.setObjectName('stop') self.stop_btn.clicked.connect(self.stop) #analyse button self.analyse_btn = QPushButton('Analyse') self.analyse_btn.setObjectName('analyse') self.analyse_btn.setFixedSize(70, 28) self.analyse_btn.clicked.connect(self.start_analyse) self.analyse_window = Analyse(self) self.analyse_window.off() self.analyse_btn.setEnabled(False) self.on_analyse = False self.details_btn = QPushButton('Details') self.details_btn.setVisible(False) self.details_btn.setObjectName('details') self.details_btn.setFixedSize(70, 28) self.details_btn.clicked.connect(self.show_details) self.details_wd = pictureViewer() self.details_wd.close() self.threadpool = QtCore.QThreadPool() self.threadpool.setMaxThreadCount(1) worker = loadModules(self) self.threadpool.start(worker) self.path_input = pathLineEdit(self) self.path_input.setObjectName('path') self.folder_btn = QPushButton() self.folder_btn.setObjectName('folder') self.folder_btn.clicked.connect( lambda x: self.select_folder(foldername='')) self.fileslist_lbl = QLabel('Playlist:') self.fileslist_lbl.setObjectName('lbl') self.fileslist_lbl.setIndent(12) self.fileslist = QListWidget() self.fileslist.itemClicked.connect(self.select_file) self.warnings_lbl = QLabel('Warnings time:') self.warnings_lbl.setObjectName('lbl') self.warnings_lbl.setIndent(12) self.warningslist = QListWidget() #volume slider self.volume_slr = QSlider(QtCore.Qt.Horizontal, self) self.volume_slr.setMaximum(100) self.volume_slr.setValue(self.mediaplayer.audio_get_volume()) self.volume_slr.setToolTip("Volume") self.volume_slr.valueChanged.connect(self.set_volume) #setting up layouts folder_lyt = QHBoxLayout() folder_lyt.addWidget(self.path_input) folder_lyt.addWidget(self.folder_btn) leftside_lyt = QVBoxLayout() leftside_lyt.setContentsMargins(0, 10, 0, 0) leftside_lyt.addSpacing(6) leftside_lyt.addWidget(self.fileslist_lbl) leftside_lyt.addWidget(self.fileslist) analyse_btns = QHBoxLayout() analyse_btns.addWidget(self.details_btn) analyse_btns.addWidget(self.analyse_btn) leftside_lyt.addLayout(analyse_btns) leftside_lyt.addWidget(self.warnings_lbl) leftside_lyt.addWidget(self.warningslist) leftside_lyt.addLayout(folder_lyt) leftside_lyt.addSpacing(6) self.leftside_bg = QWidget() self.leftside_bg.setObjectName("leftside_bg") self.leftside_bg.setLayout(leftside_lyt) ctrl_lyt = QHBoxLayout() ctrl_lyt.addSpacing(20) ctrl_lyt.addWidget(self.play_btn) ctrl_lyt.setSpacing(0) ctrl_lyt.addWidget(self.stop_btn) ctrl_lyt.addStretch(1) ctrl_lyt.addWidget(self.volume_slr) ctrl_panel_lyt = QVBoxLayout() ctrl_panel_lyt.setContentsMargins(60, 12, 60, 12) ctrl_panel_lyt.addWidget(self.timevalue, 0, QtCore.Qt.AlignLeft) ctrl_panel_lyt.addWidget(self.position_slr) ctrl_panel_lyt.addLayout(ctrl_lyt) rightside_lyt = QVBoxLayout() rightside_lyt.addWidget(self.videoframe) rightside_lyt.addLayout(ctrl_panel_lyt) main_lyt = QHBoxLayout() main_lyt.setSpacing(0) main_lyt.setContentsMargins(0, 0, 0, 0) main_lyt.addWidget(self.leftside_bg) main_lyt.addLayout(rightside_lyt, 60) self.widget.setLayout(main_lyt) self.timer = QtCore.QTimer(self) self.timer.setInterval(200) self.timer.timeout.connect(self.updateUI) #creates connection to db self.db = db_api.create_connection( os.path.join(os.getcwd(), 'db', 'data.db')) def play_pause(self): """ Toggle play/pause status """ if self.mediaplayer.is_playing(): self.mediaplayer.pause() self.play_btn.setProperty("onplay", True) self.play_btn.setStyle(self.play_btn.style()) self.isPaused = True else: if self.mediaplayer.play() == -1: return self.mediaplayer.play() self.play_btn.setProperty("onplay", False) self.play_btn.setStyle(self.play_btn.style()) self.timer.start() self.isPaused = False def start_analyse(self): self.analyse_btn.setEnabled(False) try: file = self.fileslist.currentItem().text() except AttributeError: self.analyse_btn.setEnabled(True) QMessageBox.information(self, "Warning!", "You should to select a file.") return if not self.on_analyse: self.setEnabled(False) self.analyse_window.on() try: worker = AnalyseWorker(file, self) self.threadpool.start(worker) except Exception as e: print(e) else: return def show_details(self): try: file = self.fileslist.currentItem().text() except AttributeError: self.analyse_btn.setEnabled(True) QMessageBox.information(self, "Warning!", "You should to select a file.") return item = self.fileslist.currentItem().text() if os.path.isdir(os.path.join('warnings', os.path.splitext(item)[0])): self.details_wd.show() self.details_wd.start(self.fileslist.currentItem().text()) else: return def stop_analyse(self): self.analyse_window.off() self.setEnabled(True) self.on_analyse = False def stop(self): """ stop player """ if self.mediaplayer.is_playing(): self.timevalue.setTime(QtCore.QTime.fromMSecsSinceStartOfDay(0)) self.mediaplayer.stop() def select_file(self, item): self.open_file(filename=self.path + '/' + item.text()) def check_warnings_time(self, filename): with self.db: file_id = db_api.select_file(self.db, filename) if file_id: #if file in db, then add warning times in list bellow timelist = db_api.select_time(self.db, file_id) self.warningslist.clear() for time in timelist: self.warningslist.addItem(time[0] + "-" + time[1]) self.details_btn.setVisible(True) else: self.details_btn.setVisible(False) self.warningslist.clear() self.warningslist.addItem("There is nothing to show.") def open_file(self, filename=''): """ Open a media file in a MediaPlayer """ if filename == '': filename = QFileDialog.getOpenFileName(self, "Open File", './')[0] if not filename: return self.check_warnings_time(os.path.split(filename)[1]) # create the media self.media = self.instance.media_new(filename) # put the media in the media player self.mediaplayer.set_media(self.media) # parse the metadata of the file self.media.parse_async() fullpath = re.escape(filename) # get video duration time = os.popen("ffmpeg -i {0}".format(fullpath) + " 2>&1 | grep Duration | awk '{print $2}' | tr -d ," ).read().split(':') self.duration = int(3600000 * int(time[0]) + 60000 * int(time[1]) + 1000 * float(time[2])) # set the title of the track as window title self.setWindowTitle("CCTV: " + self.media.get_meta(0)) # the media player has to be 'connected' to the QFrame # (otherwise a video would be displayed in it's own window) # this is platform specific! # you have to give the id of the QFrame (or similar object) to # vlc, different platforms have diffqerent functions for this if sys.platform == "linux": # for Linux using the X Server self.mediaplayer.set_xwindow(self.videoframe.winId()) elif sys.platform == "win32": # for Windows self.mediaplayer.set_hwnd(self.videoframe.winId()) elif sys.platform == "darwin": # for MacOS self.mediaplayer.set_agl(self.videoframe.windId()) self.play_pause() def set_volume(self, Volume): """ Set the volume """ self.mediaplayer.audio_set_volume(Volume) def set_position(self, position): """ Set the position """ # setting the position to where the slider was dragged self.mediaplayer.set_position(position / 1000.0) # the vlc MediaPlayer needs a float value between 0 and 1, Qt # uses integer variables, so you need a factor; the higher the # factor, the more precise are the results # (1000 should be enough) self.timevalue.setTime( QtCore.QTime.fromMSecsSinceStartOfDay( self.mediaplayer.get_position() * self.duration)) def set_time(self, time): """ Set time to display """ self.mediaplayer.set_time(time) def select_folder(self, foldername=''): if foldername == '': foldername = str( QFileDialog.getExistingDirectory(self, "Select Directory")) self.path_input.setText(foldername) self.path = foldername if not foldername: return files = os.listdir(foldername) self.path = foldername self.fileslist.clear() for file in files: self.fileslist.addItem(file) def updateUI(self): """ updates the user interface """ # setting the slider to the desired position self.position_slr.setValue(self.mediaplayer.get_position() * 1000) self.timevalue.setTime( QtCore.QTime.fromMSecsSinceStartOfDay( self.mediaplayer.get_position() * self.duration)) self.volume_slr.setValue(self.mediaplayer.audio_get_volume()) if not self.mediaplayer.is_playing(): # no need to call this function if nothing is played self.timer.stop() if not self.isPaused: # after the video finished, the play button stills shows # "Pause", not the desired behavior of a media player # this will fix it self.stop()