Esempio n. 1
0
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)
Esempio n. 2
0
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()