class ReleasePetDialog(QDialog): def __init__(self, UserId): super(ReleasePetDialog, self).__init__() self.UserId = UserId self.filePath = "" self.type = "" self.froml = "" self.fromt = "" self.stayl = "" self.resize(800, 500) self.setWindowTitle('myPet——发布招领') self.setWindowIcon(QIcon('./images/icon.png')) self.initUI() def initUI(self): self.plabel = QLabel(self) self.plabel.setFixedSize(370, 370) self.plabel.move(20, 20) self.hbox11 = QHBoxLayout() self.hbox11.addStretch(1) self.hbox11.addWidget(self.plabel) self.hbox11.addStretch(1) self.obtn = QPushButton(self) self.obtn.setText("打开本地图片") self.obtn.setFont(QFont("苏新诗柳楷繁", 15)) self.obtn.resize(200, 50) self.obtn.move(560, 30) self.obtn.clicked.connect(self.openimage) self.obtn.setFixedSize(180, 50) self.hbox12 = QHBoxLayout() self.hbox12.addStretch(1) self.hbox12.addWidget(self.obtn) self.hbox12.addStretch(1) self.vbox1 = QVBoxLayout() self.vbox1.addLayout(self.hbox11) self.vbox1.addLayout(self.hbox12) self.typelabel = QLabel() self.typelabel.setText("动物种类") self.typelabel.setFont(QFont("苏新诗柳楷繁", 13)) self.typeedit = QLineEdit() self.typeedit.setFixedSize(180, 30) self.typeedit.setFont(QFont("苏新诗柳楷繁", 13)) self.hbox21 = QHBoxLayout() self.hbox21.addStretch(1) self.hbox21.addWidget(self.typelabel) self.hbox21.addStretch(1) self.hbox21.addWidget(self.typeedit) self.hbox21.addStretch(1) self.fromllabel = QLabel() self.fromllabel.setText("出现地点") self.fromllabel.setFont(QFont("苏新诗柳楷繁", 13)) self.fromledit = QLineEdit() self.fromledit.setFixedSize(180, 30) self.fromledit.setFont(QFont("苏新诗柳楷繁", 13)) self.hbox22 = QHBoxLayout() self.hbox22.addStretch(1) self.hbox22.addWidget(self.fromllabel) self.hbox22.addStretch(1) self.hbox22.addWidget(self.fromledit) self.hbox22.addStretch(1) self.fromtlabel = QLabel() self.fromtlabel.setText("出现时间") self.fromtlabel.setFont(QFont("苏新诗柳楷繁", 13)) self.fromtedit = QDateTimeEdit() self.fromtedit.setFixedSize(180, 30) self.fromtedit.setFont(QFont("苏新诗柳楷繁", 13)) self.hbox23 = QHBoxLayout() self.hbox23.addStretch(1) self.hbox23.addWidget(self.fromtlabel) self.hbox23.addStretch(1) self.hbox23.addWidget(self.fromtedit) self.hbox23.addStretch(1) self.stayllabel = QLabel() self.stayllabel.setText("收留地点") self.stayllabel.setFont(QFont("苏新诗柳楷繁", 13)) self.stayledit = QLineEdit() self.stayledit.setFixedSize(180, 30) self.stayledit.setFont(QFont("苏新诗柳楷繁", 13)) self.hbox24 = QHBoxLayout() self.hbox24.addStretch(1) self.hbox24.addWidget(self.stayllabel) self.hbox24.addStretch(1) self.hbox24.addWidget(self.stayledit) self.hbox24.addStretch(1) self.rbtn = QPushButton(self) self.rbtn.setText("发布招领") self.rbtn.setFont(QFont("苏新诗柳楷繁", 15)) self.rbtn.resize(200, 50) self.rbtn.move(560, 30) self.rbtn.setFixedSize(180, 50) self.hbox25 = QHBoxLayout() self.hbox25.addStretch(1) self.hbox25.addWidget(self.rbtn) self.hbox25.addStretch(1) self.vbox2 = QVBoxLayout() self.vbox2.addLayout(self.hbox21) self.vbox2.addLayout(self.hbox22) self.vbox2.addLayout(self.hbox23) self.vbox2.addLayout(self.hbox24) self.vbox2.addLayout(self.hbox25) self.hbox = QHBoxLayout() self.hbox.addLayout(self.vbox1) self.hbox.addLayout(self.vbox2) self.setLayout(self.hbox) self.type = self.typeedit.text() self.rbtn.clicked.connect(self.rbtnClicked) def openimage(self): self.filePath, imgType = QFileDialog.getOpenFileName( self, "打开本地图片", "", "*.jpg;;*.png;;All Files(*)") self.jpg = QPixmap(self.filePath).scaled(self.plabel.width(), self.plabel.height()) self.plabel.setPixmap(self.jpg) def rbtnClicked(self): self.type = self.typeedit.text() self.froml = self.fromledit.text() self.fromt = self.fromtedit.text() self.stayl = self.stayledit.text() self.petid = 'p' + str(time.strftime("%g%m%d")) + str( random.randint(0, 9999)).zfill(4) db = QSqlDatabase.addDatabase("QSQLITE") db.setDatabaseName('./db/myPet.db') db.open() query = QSqlQuery() sql = "select * from user where UserId = '%s' and UserAuthority = '黑名单'" % ( self.UserId) query.exec_(sql) if (query.next()): print( QMessageBox.warning(self, "警告", "你是黑名单用户,无法发布宠物!", QMessageBox.Yes, QMessageBox.Yes)) return if (self.type == "" or self.filePath == "" or self.froml == "" or self.froml == "" or self.fromt == ""): print( QMessageBox.warning(self, "警告", "图片未插入或信息不完整!", QMessageBox.Yes, QMessageBox.Yes)) return sql = "select * from pet where PetId = '%s'" % (self.petid) query.exec_(sql) if (query.next()): # 宠物编号已存在 print( QMessageBox.warning(self, "警告", "系统错误,请重新提交", QMessageBox.Yes, QMessageBox.Yes)) return else: sql = "insert into pet values ('%s','待领养','%s','%s')" % ( self.petid, self.UserId, self.filePath) query.exec_(sql) db.commit() sql = "insert into pet_detail values ('%s','%s','%s','%s','%s')" % ( self.petid, self.type, self.froml, self.fromt, self.stayl) query.exec_(sql) db.commit() db.close() print( QMessageBox.information(self, "提醒", "您已成功发布领养信息!", QMessageBox.Yes, QMessageBox.Yes)) self.stayledit.setText("") self.typeedit.setText("") self.fromledit.setText("") self.filePath = "" self.jpg = QPixmap(self.filePath).scaled(self.plabel.width(), self.plabel.height()) self.plabel.setPixmap(self.jpg)
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()