Exemple #1
0
class StatusBarView(QStatusBar):
    """
    The model of Navigation component
    """

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

        self.status_label = QLabel("", parent)
        self.status_label.setTextFormat(Qt.RichText)

        self.label_time = QLabel("", parent)

        self.combo_referential = QComboBox(parent)
        self.movie_loader = QMovie(":/icons/loader")
        self.label_loading = QLabel(parent)
        self.label_loading.setMovie(self.movie_loader)
        self.label_loading.setMaximumHeight(self.height())
        self.movie_loader.setScaledSize(QSize(16, 16))
        self.movie_loader.start()
        self.movie_loader.setPaused(True)
        self.addPermanentWidget(self.label_loading)
        self.addPermanentWidget(self.status_label, 2)
        self.addPermanentWidget(self.label_time)
        self.addPermanentWidget(self.combo_referential)

    def start_loading(self):
        self.movie_loader.setPaused(False)

    def stop_loading(self):
        self.movie_loader.setPaused(True)
Exemple #2
0
 def animationLabel(self, index, animationFile, speed=100):
     """
     Public slot to set an animated icon.
     
     @param index tab index (integer)
     @param animationFile name of the file containing the animation (string)
     @param speed animation speed of the icon in percent of the original
         icon's speed (integer)
     @return reference to the created label (QLabel)
     """
     if index == -1:
         return None
     
     if hasattr(self.__tabBar, 'setTabButton'):
         side = self.__freeSide()
         animation = QLabel(self)
         if animationFile and not animation.movie():
             movie = QMovie(animationFile, QByteArray(), animation)
             movie.setSpeed(speed)
             animation.setMovie(movie)
             movie.start()
         self.__tabBar.setTabButton(index, side, None)
         self.__tabBar.setTabButton(index, side, animation)
         return animation
     else:
         return None
Exemple #3
0
class GifWidget(QLabel):

    def __init__(self, parent = None, path = None):
        super(GifWidget, self).__init__(parent)
        self.setPath(path)

    def __del__(self):
        print("GifWidget __del__")
        if hasattr(self, "_movie"):
            self._movie.stop()
            del self._movie

    def setPath(self, path):
        if hasattr(self, "_movie"):
            self._movie.stop()
            del self._movie
        if not path:
            return
        self._movie = QMovie(path)
        self.setMovie(self._movie)
        self._movie.start()

    def start(self):
        if hasattr(self, "_movie"):
            self._movie.start()

    def stop(self):
        if hasattr(self, "_movie"):
            self._movie.stop()
Exemple #4
0
class MoviePlayer(QWidget):
    def __init__(self):
        super(MoviePlayer, self).__init__()

        self.setAttribute(Qt.WA_TranslucentBackground)        
        self.setWindowFlags(Qt.FramelessWindowHint)

        self.movie = QMovie(self)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignAbsolute)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)


        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.movieLabel)
        self.setLayout(self.mainLayout)
        
        #self.resize(400, 500)

        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName('icon/gears.gif')

        pos = kp.pos()

        x = pos.x() - ((self.width()/2) - (kp.width()/2)) +220
        y = pos.y() - ((self.height()/2) - (kp.height()/2)) +160
        
        self.setGeometry(x,y, 400, 500)

        self.movie.start()   
Exemple #5
0
    def initoptionspanel(self):
        label = QLabel('Filter')

        filtertype = QComboBox()
        filtertype.addItem('None')
        filtertype.addItem('Lowpass')
        filtertype.addItem('Highpass')
        filtertype.addItem('Bandreject')
        filtertype.addItem('Bandpass')
        filtertype.currentIndexChanged.connect(self.filtertypelistener)

        self.filterfunction = QComboBox()
        self.filterfunction.addItem('Ideal')
        self.filterfunction.addItem('Butterworth')
        self.filterfunction.addItem('Gaussian')
        self.filterfunction.currentIndexChanged.connect(self.filterfunctionlistener)
        self.filterfunction.setEnabled(False)

        self.filtercutoff = QDoubleSpinBox()
        self.filtercutoff.setValue(0.0)
        self.filtercutoff.setRange(0.0, 10000.0)
        self.filtercutoff.valueChanged.connect(self.filtercutofflistener)
        self.filtercutoff.setEnabled(False)

        self.filterbandwidth = QDoubleSpinBox()
        self.filterbandwidth.setValue(1.0)
        self.filterbandwidth.setRange(0.0, 10000.0)
        self.filterbandwidth.valueChanged.connect(self.filterbandwidthlistener)
        self.filterbandwidth.setEnabled(False)

        self.filterorder = QDoubleSpinBox()
        self.filterorder.setValue(1.0)
        self.filterorder.setRange(0.0, 10000.0)
        self.filterorder.valueChanged.connect(self.filterorderlistener)
        self.filterorder.setEnabled(False)

        loader = QMovie('loader.gif')
        loader.start()
        self.loadercontainer = QLabel()
        self.loadercontainer.setMovie(loader)
        self.loadercontainer.setVisible(False)

        formlayout = QFormLayout()
        formlayout.addRow('Type', filtertype)
        formlayout.addRow('Function', self.filterfunction)
        formlayout.addRow('Cut off', self.filtercutoff)
        formlayout.addRow('Bandwidth', self.filterbandwidth)
        formlayout.addRow('Order', self.filterorder)
        formlayout.addRow('', self.loadercontainer)

        filterbox = QGroupBox('Filter')
        filterbox.setLayout(formlayout)

        options = QDockWidget('Options')
        options.setFeatures(QDockWidget.DockWidgetFloatable)
        options.setFeatures(QDockWidget.DockWidgetMovable)
        options.setWidget(filterbox)
        self.addDockWidget(Qt.RightDockWidgetArea, options)
Exemple #6
0
class LoadingGifWin( QWidget):
    def __init__(self,parent=None):
        super(LoadingGifWin, self).__init__(parent)
        self.label =  QLabel('', self)
        self.setFixedSize(128,128)
        self.setWindowFlags( Qt.Dialog| Qt.CustomizeWindowHint)
        self.movie =  QMovie("./images/loading.gif")
        self.label.setMovie(self.movie)
        self.movie.start()
Exemple #7
0
 def open(self):
     self.file = QFileDialog.getOpenFileName(self, "Open File", self.pwd)[0]
     if self.file == "":
         return
     self.information = info.Information(self, self.file)
     movie = QMovie(self.file, QByteArray(), self)
     movie.setCacheMode(QMovie.CacheAll)
     movie.setSpeed(100)
     self.label.setMovie(movie)
     movie.start()
Exemple #8
0
 def __makeAnimatedLabel(self, fileName, label):
     """
     Private slot to create an animated label.
     
     @param fileName name of the file containing the animation (string)
     @param label reference to the label to be animated (QLabel)
     """
     movie = QMovie(fileName, QByteArray(), label)
     movie.setSpeed(100)
     label.setMovie(movie)
     movie.start()
class WaitDialog(QWidget):
    def __init__(self, parent=None, *args, **kwargs):
        super(WaitDialog, self).__init__(parent)
        self.label = QLabel(self)
        self.label.setAlignment(Qt.AlignCenter)
        self.setFixedSize(551, 401)
        self.setWindowOpacity(0.5)  # set transparent
        self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint | Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)  # background transparent
        self.setContentsMargins(0, 0, 0, 0)
        config = Config()
        self.movie = QMovie(os.path.join(config.images, 'wait.gif'))
        self.label.setMovie(self.movie)
        self.movie.start()
Exemple #10
0
class LoadingItem(QLabel):

    def __init__(self):
        super(LoadingItem, self).__init__()
        self.movie = QMovie(resources.IMAGES['loading'])
        self.setMovie(self.movie)
        self.movie.setScaledSize(QSize(16, 16))
        self.movie.start()

    def add_item_to_tree(self, folder, tree, item_type=None, parent=None):
        if item_type is None:
            item = QTreeWidgetItem()
            item.setText(0, (_translate("LoadingItem", "       LOADING: '%s'") % folder))
        else:
            item = item_type(parent, (
                _translate("LoadingItem", "       LOADING: '%s'") % folder), folder)
        tree.addTopLevelItem(item)
        tree.setItemWidget(item, 0, self)
        return item
Exemple #11
0
    def __init__(self, parent, text=""):
        QDialog.__init__(self, parent)

        # Create waiting image
        waitingImage = QMovie(qtUtils.getAbsoluteImagePath('waiting.gif'))
        waitingImage.start()
        waitingImageLabel = QLabel(self)
        waitingImageLabel.setMovie(waitingImage)

        waitingLabel = QLabel(text, self)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(waitingImageLabel)
        hbox.addSpacing(10)
        hbox.addWidget(waitingLabel)
        hbox.addStretch(1)

        self.setLayout(hbox)
Exemple #12
0
    def setupWidget1(self):
        #setup the tree
        movie = QMovie()
        movie.setFileName("res/tree.gif")
        self.ui.lb_tree.setMovie(movie)
        self.ui.lb_tree_big.setMovie(movie)
        movie.start()

        #setup the statistics
        self.ui.gridLayout.setHorizontalSpacing(60)
        self.ui.gridLayout.setVerticalSpacing(10)
        self.ui.gridLayout.setGeometry(QRect(0, 51, 291, 224))
        self.ui.gridLayout.setAlignment(QtCore.Qt.AlignCenter)
        self.statLabels = []
        for i in range(7):
            self.statLabels.append([])
            for j in range(4):
                self.statLabels[i].append(QLabel())
                self.statLabels[i][j].setScaledContents(True)
                self.statLabels[i][j].setAutoFillBackground(False)
                self.statLabels[i][j].setAlignment(QtCore.Qt.AlignCenter)
                self.ui.gridLayout.addWidget(self.statLabels[i][j], i, j, 1, 1)
Exemple #13
0
class IconManagement(object):

    def __init__(self, tray, interval = 100):
        self.tray = tray
        self.movie = QMovie(":/images/tray_animations/tray.gif")
        self.movie.setSpeed(interval)
        self.movie.frameChanged.connect(self.next_icon)
        self.icons = Enum(
            ok = QIcon(":/images/demerio.png"),
            problem = QIcon(":/images/demerio-problem.png"),
            conductor_problem = QIcon(":/images/demerio-conductor-problem.png")
        )
        self.icon = self.icons.ok
        self.update_icon()

    def internet_is_ok(self, internet_is_ok):
        self.icon = self.icons.ok if internet_is_ok else self.icons.problem
        self.update_icon()

    @pyqtSlot(int)
    def next_icon(self, i):
        self.tray.setIcon(QIcon(self.movie.currentPixmap()))

    def start(self):
        self.movie.start()

    def stop(self):
        self.update_icon()
        self.movie.stop()

    def update_icon(self):
        self.tray.setIcon(self.icon)

    def conductor_problem(self):
        if self.movie.state() == QMovie.Running:
            self.movie.stop()
        self.icon = self.icons.conductor_problem
        self.update_icon()
class QConnectingWidget(QWidget):

    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        # Create connecting image
        self.connectingGif = QMovie(qtUtils.getAbsoluteImagePath('waiting.gif'))
        self.connectingGif.start()
        self.connetingImageLabel = QLabel(self)
        self.connetingImageLabel.setMovie(self.connectingGif)
        self.connectingLabel = QLabel(self)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(self.connetingImageLabel, alignment=Qt.AlignCenter)
        hbox.addSpacing(10)
        hbox.addWidget(self.connectingLabel, alignment=Qt.AlignCenter)
        hbox.addStretch(1)

        self.setLayout(hbox)


    def setConnectingToNick(self, nick):
        self.connectingLabel.setText("Connecting to " + nick + "...")
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setGeometry(50, 50, 600, 750)
        self.setFixedSize(500, 500)
        self.startUIWindow()

        self.movie = QMovie("mail.gif")
        self.movie.frameChanged.connect(self.repaint)
        self.movie.start()


    def startUIWindow(self):
        self.Window = UIWindow(self)
        self.setWindowTitle("Email Dialog")
        self.show()

    def paintEvent(self, event):
        currentFrame = self.movie.currentPixmap()
        frameRect = currentFrame.rect()
        frameRect.moveCenter(self.rect().center())
        if frameRect.intersects(event.rect()):
            painter = QPainter(self)
            painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame)
Exemple #16
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(973, 636)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.remove_from_pending = QtWidgets.QPushButton(self.centralwidget)
        self.remove_from_pending.setGeometry(QtCore.QRect(20, 130, 241, 81))
        self.remove_from_pending.setObjectName("remove_from_pending")
        self.add_to_pending = QtWidgets.QPushButton(self.centralwidget)
        self.add_to_pending.setGeometry(QtCore.QRect(20, 40, 241, 81))
        self.add_to_pending.setStyleSheet("")
        self.add_to_pending.setObjectName("add_to_pending")
        self.incomplete_list = QtWidgets.QListWidget(self.centralwidget)
        self.incomplete_list.setGeometry(QtCore.QRect(20, 290, 251, 191))
        self.incomplete_list.setObjectName("incomplete_list")
        self.pending_list = QtWidgets.QListWidget(self.centralwidget)
        self.pending_list.setGeometry(QtCore.QRect(360, 40, 251, 191))
        self.pending_list.setObjectName("pending_list")
        self.completed_list = QtWidgets.QListWidget(self.centralwidget)
        self.completed_list.setGeometry(QtCore.QRect(690, 280, 251, 221))
        self.completed_list.setObjectName("completed_list")
        self.incomplete = QtWidgets.QLabel(self.centralwidget)
        self.incomplete.setGeometry(QtCore.QRect(60, 250, 161, 31))
        font = QtGui.QFont()
        font.setFamily("Comic Sans MS")
        font.setPointSize(20)
        self.incomplete.setFont(font)
        self.incomplete.setObjectName("incomplete")
        self.pending = QtWidgets.QLabel(self.centralwidget)
        self.pending.setGeometry(QtCore.QRect(450, 0, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Comic Sans MS")
        font.setPointSize(20)
        self.pending.setFont(font)
        self.pending.setObjectName("pending")
        self.completed = QtWidgets.QLabel(self.centralwidget)
        self.completed.setGeometry(QtCore.QRect(730, 240, 161, 31))
        font = QtGui.QFont()
        font.setFamily("Comic Sans MS")
        font.setPointSize(20)
        self.completed.setFont(font)
        self.completed.setObjectName("completed")
        self.jugglingGif = QtWidgets.QLabel(self.centralwidget)
        self.jugglingGif.setGeometry(QtCore.QRect(290, 260, 381, 351))
        self.jugglingGif.setFrameShape(QtWidgets.QFrame.Box)
        self.jugglingGif.setText("")
        self.jugglingGif.setObjectName("jugglingGif")
        self.movie = QMovie('JugglingGIF.gif')
        self.jugglingGif.setMovie(self.movie)
        self.movie.start()
        self.add_to_completed = QtWidgets.QPushButton(self.centralwidget)
        self.add_to_completed.setGeometry(QtCore.QRect(700, 40, 241, 81))
        font = QtGui.QFont()
        font.setPointSize(8)
        self.add_to_completed.setFont(font)
        self.add_to_completed.setObjectName("add_to_completed")
        self.remove_from_completed = QtWidgets.QPushButton(self.centralwidget)
        self.remove_from_completed.setGeometry(QtCore.QRect(700, 140, 241, 81))
        self.remove_from_completed.setObjectName("remove_from_completed")
        self.incomplete_search_bar = QtWidgets.QTextBrowser(self.centralwidget)
        self.incomplete_search_bar.setGeometry(QtCore.QRect(20, 470, 251, 16))
        self.incomplete_search_bar.setObjectName("incomplete_search_bar")
        self.pending_search_bar = QtWidgets.QTextBrowser(self.centralwidget)
        self.pending_search_bar.setGeometry(QtCore.QRect(360, 220, 251, 16))
        self.pending_search_bar.setObjectName("pending_search_bar")
        self.completed_search_bar = QtWidgets.QTextBrowser(self.centralwidget)
        self.completed_search_bar.setGeometry(QtCore.QRect(690, 490, 251, 16))
        self.completed_search_bar.setObjectName("completed_search_bar")
        self.browser = QtWidgets.QPushButton(self.centralwidget)
        self.browser.setGeometry(QtCore.QRect(20, 500, 241, 81))
        self.browser.setObjectName("browser")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(700, 510, 101, 16))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 973, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        self.add_to_pending.clicked.connect(self.add_pending)

    def loadIncomplete(self):
        cursor.execute('''SELECT *
                          FROM trickslist
                          WHERE trick_status = "INCOMPLETE"''')
        for i in cursor:
            self.incomplete_list.addItem(i[0])

    def loadComplete(self):
        cursor.execute('''SELECT *
                          FROM trickslist
                          WHERE trick_status = "COMPLETE"''')
        for i in cursor:
            self.completed_list.addItem(i[0])

    def loadPending(self):
        cursor.execute('''SELECT *
                          FROM trickslist
                          WHERE trick_status = "PENDING"''')
        for i in cursor:
            self.pending_list.addItem(i[0])

    def add_pending(self):
        trick = self.incomplete_list.currentItem().text()
        cursor.execute('''UPDATE trickslist
                          SET trick_status = "PENDING"
                          WHERE tricks = "%s"''' % trick)
        print(trick)
        database.commit()
        self.loadLists()

    def loadLists(self):
        self.pending_list.clear()
        self.incomplete_list.clear()
        self.completed_list.clear()
        self.loadComplete()
        self.loadIncomplete()
        self.loadPending()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.remove_from_pending.setText(
            _translate("MainWindow", "Remove from Pending"))
        self.add_to_pending.setText(_translate("MainWindow", "Add to Pending"))
        self.incomplete.setText(_translate("MainWindow", "Incomplete"))
        self.pending.setText(_translate("MainWindow", "Pending"))
        self.completed.setText(_translate("MainWindow", "Completed"))
        self.add_to_completed.setText(
            _translate("MainWindow", "Add to Completed"))
        self.remove_from_completed.setText(
            _translate("MainWindow", "Remove from Completed"))
        self.browser.setText(_translate("MainWindow", "View Trick in Browser"))
        self.label.setText(_translate("MainWindow", "Gui by Jaden Leake"))
Exemple #17
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(920, 820)
        MainWindow.setMinimumSize(QSize(920, 820))
        MainWindow.setMaximumSize(QSize(920, 820))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget)
        self.stackedWidget.setGeometry(QtCore.QRect(0, 0, 920, 820))
        self.stackedWidget.setObjectName("stackedWidget")

        # #page0
        # self.page0 = QtWidgets.QWidget()
        # self.page0.setObjectName("page0")
        # self.loading = QtWidgets.QWidget(self.page0)
        # self.loading.setGeometry(QtCore.QRect(0, 0, 920, 820))
        # icon = QtGui.QIcon()
        # icon.addPixmap(QtGui.QPixmap("D:/Umbrella/dahyoung/umbrella2/logo/umbrella11.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        # self.loading.setIcon(icon)
        # self.loading.setStyleSheet("background-color : #ffffff")
        # self.loading.setObjectName("loading")
        # self.stackedWidget.addWidget(self.page0)

        #page1
        #Intro_frame
        self.page = QtWidgets.QWidget()
        self.page.setObjectName("page")

        self.intro_frame = QtWidgets.QFrame(self.page)
        self.intro_frame.setGeometry(QtCore.QRect(0, 0, 920, 820))
        self.intro_frame.setStyleSheet("background-color : #000000")
        self.intro_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.intro_frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.intro_frame.setObjectName("intro_frame")

        self.intro_button = QtWidgets.QPushButton(self.intro_frame)
        self.intro_button.setGeometry(QtCore.QRect(0, 0, 920, 820))
        self.intro_button.setObjectName("intro_button")

        # self.widget_main = QtWidgets.QWidget(self.intro_frame)
        # self.widget_main.setGeometry(QtCore.QRect(20, 480, 420, 250))
        # self.widget_main.setObjectName("widget_main")
        # self.widget_1 = QtWidgets.QWidget(self.widget_main)
        # self.widget_1.setGeometry(QtCore.QRect(0, 0, 210, 125))
        # self.widget_1.setStyleSheet("background-color : #ff0000")
        # self.widget_1.setObjectName("widget_1")
        # self.widget_2 = QtWidgets.QWidget(self.widget_main)
        # self.widget_2.setGeometry(QtCore.QRect(210, 0, 210, 125))
        # self.widget_2.setStyleSheet("background-color : #0000ff")
        # self.widget_2.setObjectName("widget_2")
        # self.widget_3 = QtWidgets.QWidget(self.widget_main)
        # self.widget_3.setGeometry(QtCore.QRect(0, 125, 210, 125))
        # self.widget_3.setStyleSheet("background-color : #ff8c00")
        # self.widget_3.setObjectName("widget_3")
        # self.widget_4 = QtWidgets.QWidget(self.widget_main)
        # self.widget_4.setGeometry(QtCore.QRect(210, 125, 210, 125))
        # self.widget_4.setStyleSheet("background-color : #808080")
        # self.widget_4.setObjectName("widget_4")

        self.widget_main = QtWidgets.QWidget(self.intro_frame)
        self.widget_main.setGeometry(QtCore.QRect(20, 480, 420, 250))
        self.widget_main.setObjectName("widget_main")
        self.widget_1 = QtWidgets.QPushButton(self.widget_main)
        self.widget_1.setGeometry(QtCore.QRect(0, 0, 210, 125))
        self.widget_1.setStyleSheet("background-color : #ff0000")
        self.widget_1.setObjectName("widget_1")
        self.widget_2 = QtWidgets.QPushButton(self.widget_main)
        self.widget_2.setGeometry(QtCore.QRect(210, 0, 210, 125))
        self.widget_2.setStyleSheet("background-color : #0000ff")
        self.widget_2.setObjectName("widget_2")
        self.widget_3 = QtWidgets.QPushButton(self.widget_main)
        self.widget_3.setGeometry(QtCore.QRect(0, 125, 210, 125))
        self.widget_3.setStyleSheet("background-color : #ff8c00")
        self.widget_3.setObjectName("widget_3")
        self.widget_4 = QtWidgets.QPushButton(self.widget_main)
        self.widget_4.setGeometry(QtCore.QRect(210, 125, 210, 125))
        self.widget_4.setStyleSheet("background-color : #808080")
        self.widget_4.setObjectName("widget_4")

        # self.listView_3 = QtWidgets.QListView(self.intro_frame)
        # self.listView_3.setGeometry(QtCore.QRect(20, 480, 420, 251))
        # self.listView_3.setStyleSheet("background-color : #ffffff")
        # self.listView_3.setObjectName("listView_3")
        self.pushButton_3 = QtWidgets.QPushButton(self.intro_frame)
        self.pushButton_3.setGeometry(QtCore.QRect(150, 100, 301, 300))
        # self.pushButton_3.setGeometry(QtCore.QRect(170, 0, 601, 321))
        # icon = QtGui.QIcon()
        # icon.addPixmap(QtGui.QPixmap("D:/Umbrella/dahyoung/umbrella2/logo/rolling_umb.gif"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.movie = QMovie("logo/rolling_umb.gif")
        self.movie.setScaledSize(QtCore.QSize(200, 200))
        self.label_23 = QtWidgets.QLabel(self.pushButton_3)
        self.label_23.setGeometry(QtCore.QRect(20, 20, 200, 200))
        self.label_23.setMovie(self.movie)
        self.label_23.setText("")
        self.label_23.setObjectName("label_23")
        self.movie.start()
        # self.pushButton_3.setIcon(icon)
        # self.pushButton_3.setIconSize(QtCore.QSize(600, 231))
        self.pushButton_3.setObjectName("pushButton_3")

        self.pushButton_4 = QtWidgets.QPushButton(self.intro_frame)
        self.pushButton_4.setGeometry(QtCore.QRect(400, 57, 400, 200))
        icon_text = QtGui.QIcon()
        icon_text.addPixmap(QtGui.QPixmap("logo/text1.jpg"),
                            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_4.setIcon(icon_text)
        self.pushButton_4.setIconSize(QtCore.QSize(400, 200))
        self.pushButton_4.setObjectName("pushButton_4")
        #마스크 보유 현황
        self.pushButton_5 = QtWidgets.QPushButton(self.intro_frame)
        self.pushButton_5.setGeometry(QtCore.QRect(420, 200, 350, 200))
        icon_text1 = QtGui.QIcon()
        icon_text1.addPixmap(QtGui.QPixmap("logo/mask2.jpg"),
                             QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_5.setIcon(icon_text1)
        self.pushButton_5.setIconSize(QtCore.QSize(400, 200))
        self.pushButton_5.setObjectName("pushButton_5")

        self.widget_graph = QtWidgets.QWidget(self.intro_frame)
        self.widget_graph.setGeometry(QtCore.QRect(460, 480, 420, 250))
        self.widget_graph.setStyleSheet("background-color : #ffffff")
        self.widget_graph.setObjectName("listView_5")
        self.stackedWidget.addWidget(self.intro_frame)
        #page2
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setObjectName("page_2")
        self.frame = QtWidgets.QFrame(self.page_2)
        self.frame.setGeometry(QtCore.QRect(0, 0, 921, 630))
        self.frame.setStyleSheet("background-color : #ffffff")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.webEngineView = QtWebEngineWidgets.QWebEngineView(self.frame)
        self.webEngineView.setGeometry(QtCore.QRect(-1, 0, 921, 601))
        self.webEngineView.setUrl(QtCore.QUrl("about:blank"))
        self.webEngineView.setObjectName("webEngineView")

        #stack1로 돌아가는 버튼
        self.pushButton__image = QtWidgets.QPushButton(self.frame)
        self.pushButton__image.setGeometry(QtCore.QRect(0, 0, 30, 30))
        # icon = QtGui.QIcon()
        # icon.addPixmap(QtGui.QPixmap("logo/umbrella.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        # self.pushButton__image.setIcon(icon)
        # self.pushButton__image.setIconSize(QtCore.QSize(30, 30))
        # self.pushButton__image.setObjectName("pushButton__image")

        self.movie2 = QMovie("logo/rolling_umb.gif")
        self.movie2.setScaledSize(QtCore.QSize(30, 30))
        self.label_24 = QtWidgets.QLabel(self.pushButton__image)
        self.label_24.setGeometry(QtCore.QRect(0, 0, 30, 30))
        self.label_24.setMovie(self.movie2)
        self.label_24.setText("")
        self.label_24.setObjectName("label_24")
        self.movie2.start()

        self.lineEdit = QtWidgets.QLineEdit(self.frame)
        self.lineEdit.setGeometry(QtCore.QRect(0, 600, 281, 31))
        self.lineEdit.setObjectName("lineEdit")
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setGeometry(QtCore.QRect(281, 601, 101, 31))
        self.pushButton.setObjectName("pushButton")
        self.pushButton2 = QtWidgets.QPushButton(self.frame)
        self.pushButton2.setGeometry(QtCore.QRect(381, 601, 101, 31))
        self.pushButton2.setObjectName("pushButton2")
        self.pushButton3 = QtWidgets.QPushButton(self.frame)
        self.pushButton3.setGeometry(QtCore.QRect(481, 601, 101, 31))
        self.pushButton3.setObjectName("pushButton3")
        #1개 미만
        self.radio1 = QtWidgets.QRadioButton(self.frame)
        self.radio1.setGeometry(QtCore.QRect(600, 600, 71, 31))
        self.radio1.setObjectName("radio1")
        self.radio2 = QtWidgets.QRadioButton(self.frame)
        self.radio2.setGeometry(QtCore.QRect(670, 600, 71, 31))
        self.radio2.setObjectName("radio2")
        self.radio3 = QtWidgets.QRadioButton(self.frame)
        self.radio3.setGeometry(QtCore.QRect(750, 600, 71, 31))
        self.radio3.setObjectName("radio3")
        self.radio4 = QtWidgets.QRadioButton(self.frame)
        self.radio4.setGeometry(QtCore.QRect(830, 600, 81, 31))
        self.radio4.setObjectName("radio4")
        self.listWidget = QtWidgets.QListWidget(self.page_2)
        self.listWidget.setGeometry(QtCore.QRect(0, 630, 921, 191))
        self.listWidget.setObjectName("listWidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 920, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.stackedWidget.addWidget(self.page_2)
        # self.statusbar = QtWidgets.QStatusBar(MainWindow)
        # self.statusbar.setObjectName("statusbar")
        # MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.stackedWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.radio1.setChecked(True)

        #graph
        self.page_3 = QtWidgets.QWidget()
        self.page_3.setObjectName("page_3")

        self.frame2 = QtWidgets.QFrame(self.page_3)
        self.frame2.setGeometry(QtCore.QRect(0, 0, 920, 820))
        self.frame2.setStyleSheet("background-color : #ffffff")
        self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame2.setObjectName("frame2")

        self.comboBox = QtWidgets.QComboBox(self.frame2)
        self.comboBox.setGeometry(QtCore.QRect(29, 0, 201, 30))
        self.comboBox.setObjectName("comboBox")

        self.graph2 = QtWidgets.QWidget(self.frame2)
        self.graph2.setGeometry(QtCore.QRect(0, 30, 920, 790))
        self.graph2.setObjectName("graph2")
        # self.webEngineView2 = QtWebEngineWidgets.QWebEngineView(self.frame2)
        # self.webEngineView2.setGeometry(QtCore.QRect(200, 120, 720, 700))
        # self.webEngineView2.setUrl(QtCore.QUrl("about:blank"))
        # self.webEngineView2.setObjectName("webEngineView2")

        #stack1로 돌아가는 버튼
        self.pushButton__image2 = QtWidgets.QPushButton(self.frame2)
        self.pushButton__image2.setGeometry(QtCore.QRect(0, 0, 30, 30))
        self.pushButton__image2.setObjectName("pushButton__image")
        self.movie3 = QMovie("logo/rolling_umb.gif")
        self.movie3.setScaledSize(QtCore.QSize(30, 30))
        self.label_25 = QtWidgets.QLabel(self.pushButton__image2)
        self.label_25.setGeometry(QtCore.QRect(0, 0, 30, 30))
        self.label_25.setMovie(self.movie2)
        self.label_25.setText("")
        self.label_25.setObjectName("label_24")
        self.movie3.start()

        self.stackedWidget.addWidget(self.page_3)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "이동"))
        self.pushButton2.setText(_translate("MainWindow", "판매처 탐색"))
        self.pushButton3.setText(_translate("MainWindow", "내 위치"))
        self.radio1.setText(_translate("MainWindow", "전체"))
        self.radio2.setText(_translate("MainWindow", "1개 ↑"))
        self.radio3.setText(_translate("MainWindow", "30개 ↑"))
        self.radio4.setText(_translate("MainWindow", "100개 ↑"))
Exemple #18
0
class NoteMain(QMainWindow):
    def __init__(self, parent=None):
        super(NoteMain, self).__init__(parent)
        self.setWindowTitle("CSDN 同步笔记(author:rechard)")
        #os.path.dirname(os.path.realpath(__file__) 获取到当前文件的路径
        #self.setWindowIcon(QtGui.QIcon(os.path.join(os.path.dirname(os.path.realpath(__file__)), "icon.png" )))
        self.setWindowIcon(QIcon("./images/icon.png"))
        self.blogCache = BlogCache()
        self.browser = BrowserWidget()
        self.browser.cookieAdd.connect(self.on_browser_cookieAdd)
        self.split = QSplitter()
        self.articleList = ArticleList()
        self.articleList.itemClicked.connect(self.articleItemClick)
        self.initCategory()
        self.split.addWidget(self.articleList)
        self.split.addWidget(self.browser)
        self.toolbar = MDToolBarWidget(self.browser)
        self.split.addWidget(self.toolbar)
        self.split.setSizes([0, 0, 900, 0])
        self.setCentralWidget(self.split)
        self.showMaximized()
        #self.setGeometry(200, 200, 800, 500)
        self.cookies = {}  # 存放domain的key-value
        self.loginDone = False
        #self.loginSuccessInit()

    #点击article list里的选项
    def articleItemClick(self, clickItem: ArticleItem):
        self.showArticleInLeftFrame(clickItem.getBlog())

    def on_browser_cookieAdd(self, cookie):  # 处理cookie添加的事件
        name = cookie.name().data().decode('utf-8')  # 先获取cookie的名字,再把编码处理一下
        value = cookie.value().data().decode('utf-8')  # 先获取cookie值,再把编码处理一下
        self.cookies[name] = value
        if self.cookies.get('UserToken') and not self.loginDone:
            self.loginSuccessInit()

    def onLoadFinished(self, finished):
        if finished and self.cookies.get('UserToken') and not self.loginDone:
            self.loginSuccessInit()

    def loginSuccessInit(self):
        self.initMenu()
        self.loadAllBlogsCategories()
        self.loadAllDraftBlogCategories()
        self.statusBar = QStatusBar()
        self.setStatusBar(self.statusBar)
        self.loginDone = True
        self.browser.setHtml('welcome!')
        self.split.setSizes([250, 250, 900, 50])

    # 显示文章到左边的显示框里
    def showArticleInLeftFrame(self, blog: Blog = None):
        if blog != None:
            self.browser.setBlog(blog)
            self.browser.setTitle(blog.title)
            if blog.url == 'draft':
                self.showHtml(blog)
            else:
                self.backend = LoadArticleThread(blog,
                                                 CSDNService(self.cookies))
                self.backend.trigger.connect(self.showHtml)
                self.backend.start()

    def showHtml(self, data: Blog):
        searchTxt = self.searchTxt.text()
        html = data.content
        if len(searchTxt.strip()) > 0:
            html = html.replace(
                searchTxt, '<font style=\'background-color:yellow\'>' +
                searchTxt + '</font>')
        self.browser.setHtml(html)
        self.browser.setMD(data.mdText)

    # 加载loading 条
    def startloading(self):
        self.imageLabel = QLabel()
        self.movie = QMovie("./images/loading.gif")
        self.imageLabel.setMovie(self.movie)
        self.movie.start()
        self.setCentralWidget(self.imageLabel)

    def stopLoading(self):
        self.setCentralWidget(self.browser)

    def initMenu(self):
        tb: QToolBar = self.addToolBar("toolbar")
        add = QAction(QIcon('./images/add.png'), '&新建草稿', self)
        add.setStatusTip('新建文章')
        tb.addAction(add)

        refreshAct = QAction(QIcon('./images/refresh.png'), '&同步文章', self)
        refreshAct.setShortcut('Ctrl+R')
        refreshAct.setStatusTip('从csdn同步文章...')
        tb.addAction(refreshAct)

        personal = QAction(QIcon('./images/personal.png'), '&个人信息', self)
        personal.setStatusTip('个人信息')
        tb.addAction(personal)

        help = QAction(QIcon('./images/help.png'), '&帮助', self)
        help.setStatusTip('帮助说明')
        tb.addAction(help)

        tb.actionTriggered[QAction].connect(self.windowaction)
        tb.setFloatable(False)
        logging.info("menu ini success")

    def windowaction(self, q):
        if q.text() == "&新建草稿":
            self.createDraft()
        elif q.text() == "&同步文章":
            self.reloadArticles()
        elif q.text() == "&个人信息":
            QMessageBox.about(self, "个人信息", "用户名:%s" % self.cookies['UN'])
        elif q.text() == "&帮助":
            QMessageBox.about(
                self, "帮助说明", '''
             同步csdn文章的一个笔记工具,模仿有道笔记的界面,使用到了python,pyqt5, sqllite等
            ''')

    def createDraft(self):
        blog = Blog()
        blog.title = '无标题笔记'
        blog.category = 'draft'
        blog.categoryUrl = 'none'
        blog.content = ''
        blog.mdText = ''
        blog.url = 'draft'
        c = TreeWidgetItem(blog=blog)
        c.setText(0, blog.title)
        c.setIcon(0, QIcon("./images/draft.png"))
        self.draftArticles.addChild(c)
        # todo: how to focus on new created item
        BlogCache().saveArticlies([blog])
        item = ListWidgetItem(blog=blog)
        item.setSizeHint(QSize(100, 80))
        item.setIcon(QIcon("./images/draft.png"))
        item.setText(blog.title)
        self.articleList.addItem(item)

    def reloadArticles(self):
        service = CSDNService(self.cookies)
        #self.reloadPublish=ReloadBlogThread(url='https://blog.csdn.net/guo_xl',service=service,parent=self)
        self.reloadPublish = ReloadBlogThread(url='https://blog.csdn.net/' +
                                              self.cookies['UN'],
                                              service=service,
                                              parent=self)
        self.reloadPublish.start()
        self.reloadPublish.trigger.connect(self.handleReloadMessage)
        self.reloadDraft = ReloadDraftBlogThread(service=service)
        self.reloadDraft.start()
        self.reloadDraft.trigger.connect(self.handleDraftReloadMessage)
        self.statusBar.showMessage("博客加载中...")
        MessageTip("开始同步").show()

    #返回的data是个[],里面装了Blog对象
    def handleDraftReloadMessage(self, data):
        if isinstance(data, str):
            self.statusBar.showMessage(data)
            if data == "加载完毕":
                self.loadAllDraftBlogCategories()
        elif isinstance(data, List):
            self.draftArticles.takeChildren()
            for blog in data:
                c = TreeWidgetItem(blog=blog)
                c.setText(0, blog.title)
                c.setIcon(0, QIcon("./images/draft.png"))
                self.draftArticles.addChild(c)
        elif isinstance(data, Blog):
            self.blogCache.saveArticlies([data])

    def handleReloadMessage(self, data):
        if isinstance(data, str):
            self.statusBar.showMessage(data)
            if data == "加载完毕":
                self.loadAllBlogsCategories()
        elif isinstance(data, dict):
            list = data["data"]
            type = data["type"]
            if type == BlogLoadType.categories:
                self.handleDisplayCategories(list)
            elif type == BlogLoadType.subCategories:
                categoryName = data["categoryName"]
                logging.info("处理%s" % categoryName)
                #找到categoryName对应的menu item
                #坑爹,不要用publishArticlesCategory.takeChildren()移除所有的item
                count = self.publishArticlesCategory.childCount()
                i = 0
                while i < count:
                    c = self.publishArticlesCategory.child(i)
                    i += 1
                    if categoryName == c.text(0):
                        self.handleDisplaySubCategories(list, c)
                        logging.info("处理完%s" % categoryName)
                        return
        elif isinstance(data, Blog):
            self.blogCache.saveArticlies([data])

    #记载草稿
    def loadAllDraftBlogCategories(self):
        data = self.blogCache.searchAllDraft()
        self.draftArticles.takeChildren()
        for blog in data:
            c = TreeWidgetItem(blog=blog)
            c.setText(0, blog.title)
            c.setIcon(0, QIcon("./images/draft.png"))
            self.draftArticles.addChild(c)
            item = ListWidgetItem(blog=blog)
            item.setSizeHint(QSize(100, 80))
            item.setIcon(QIcon("./images/draft.png"))
            item.setText(blog.title)
            self.articleList.addItem(item)

    #加载blog's all categories
    def loadAllBlogsCategories(self):
        # 注意这里写法
        # 这样是错误的,为什么?
        # backend=BackendThread()
        # backend.start()
        # backend.articleCategory.connect(self.handleDisplay)
        data = self.blogCache.searchAllPublished()
        publicCategory = self.publishArticlesCategory
        publicCategory.takeChildren()
        for k, v in data.items():
            child = QTreeWidgetItem()
            child.setText(0, v.get("category"))  # title
            child.setText(1, v.get("categoryUrl"))  # url
            child.setText(2, 'category')
            child.setIcon(0, QIcon("./images/folder_close.png"))
            publicCategory.addChild(child)
            for blog in v.get("blogs"):
                c = TreeWidgetItem(blog=blog)
                c.setText(0, blog.title)
                c.setIcon(0, QIcon("./images/blog_normal.png"))
                child.addChild(c)
                item = ListWidgetItem(blog=blog)
                item.setSizeHint(QSize(100, 80))
                item.setIcon(QIcon("./images/blog_normal.png"))
                item.setText(blog.title)
                self.articleList.addItem(item)
        self.publishArticlesCategory.setDisabled(False)

    def handleDisplayCategories(self, data):
        publicCategory = self.publishArticlesCategory
        for item in data:
            if self.findCategoryByUrl(item["url"], publicCategory) == None:
                child = QTreeWidgetItem()
                child.setText(0, item["title"])  # title
                child.setText(1, item["url"])  # url
                child.setText(2, 'category')
                child.setIcon(0, QIcon("./images/folder_close.png"))
                publicCategory.addChild(child)

    def findCategoryByUrl(self, url, widget):
        total = widget.childCount()
        i = 0
        while i < total:
            if widget.child(i).text(1) == url:
                return widget.child(i)
            i = i + 1
        return None

    def initCategory(self):
        self.container = QWidget(self)
        layout = QVBoxLayout(self.container)
        self.tree = QTreeWidget()
        # 设置列数
        self.tree.setColumnCount(3)
        self.tree.setColumnHidden(1, True)
        self.tree.setColumnHidden(2, True)
        # 设置头的标题
        self.tree.setHeaderLabels(['title', 'url', 'category'])
        self.tree.setHeaderHidden(True)
        # 设置列宽
        self.tree.setColumnWidth(0, 320)
        self.searchTxt = QLineEdit()
        self.searchTxt.setPlaceholderText("关键字查询")
        self.searchTxt.textChanged.connect(self.search)
        layout.addWidget(self.searchTxt)
        layout.addWidget(self.tree)
        self.initPublishArticle()
        self.initDraftArticle()
        self.tree.itemClicked.connect(self.onClicked)
        self.tree.itemCollapsed.connect(self.onCollapsed)
        self.tree.itemExpanded.connect(self.onExpended)
        self.split.addWidget(self.container)

        self.tree.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tree.customContextMenuRequested.connect(self.onCustomContextMenu)

    def onCustomContextMenu(self, point):
        i = self.tree.indexAt(point)
        menu = QMenu()
        upload = QAction("上传到CSDN", self)
        menu.addAction(upload)
        t = time.time()
        k = menu.exec_(self.tree.mapToGlobal(point))
        #If the menu hasn't been open for more than 0.6s,
        #assume user did not have time to properly react to it opening
        if time.time() - t < 0.6:
            return
        if k == upload:
            msg = QMessageBox()
            msg.setText("同步到csdn")
            msg.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel)
            r = msg.exec_()
            if r == QMessageBox.Yes:
                MessageTip("开始同步到csdn").show()
                item = self.tree.currentItem()
                ut = UpdateThread(item.getBlog(), CSDNService(self.cookies))
                ut.update_proess_signal.connect(self.onUploaded)
                ut.start()

    def onUploaded(self, code: int):
        if (code == 200):
            win = MessageTip("发布到csdn成功")
            win.show()

    def onCollapsed(self, index: QModelIndex):
        index.setIcon(0, QIcon("./images/folder_open.png")
                      ) if index.isExpanded() else index.setIcon(
                          0, QIcon("./images/folder_close.png"))

    def onExpended(self, index: QModelIndex):
        index.setIcon(0, QIcon("./images/folder_open.png")
                      ) if index.isExpanded() else index.setIcon(
                          0, QIcon("./images/folder_close.png"))

    def search(self, data):
        result = self.blogCache.fuzzySearch(data)
        #public:QTreeWidgetItem=self.publishArticlesCategory # public
        # total=public.childCount()
        # i=0
        # while i<total:
        #   c=public.child(i)
        #   ctotal=c.childCount()
        #   j=0
        #   while j<ctotal:
        #       if len(data)>0 and (not result or c.child(j).text(0) not in result):
        #           c.child(j).setHidden(True)
        #       else:
        #           c.child(j).setHidden(False)
        #       j=j+1
        #   i=i+1
        i = 0
        articleList: QListWidget = self.articleList
        total = articleList.count()
        while i < total:
            if len(data) > 0 and (not result
                                  or articleList.item(i).text() not in result):
                articleList.item(i).setHidden(True)
            else:
                articleList.item(i).setHidden(False)
            i = i + 1

    def onClicked(self):
        try:
            item = self.tree.currentItem()
            if item != None:
                #None是root节点
                if isinstance(item, TreeWidgetItem):
                    self.showArticleInLeftFrame(item.getBlog())
        except Exception as ex:
            logging.exception(ex)

    #加载category下的子category
    # def loadSubCategories(self, item:QTreeWidgetItem):
    #     list=item.takeChildren()
    #     list.clear()
    #     #改成异步加载
    #     logging.info("loading sub category start")
    #     self.backend=BackendThread(url=item.text(1),type=BlogLoadType.subCategories)
    #     self.backend.trigger.connect(lambda data:self.handleDisplaySubCategories(data, item))
    #     self.backend.start()

    def handleDisplaySubCategories(self, articles, item):
        logging.info("loading %s subcategory" % item.text(0))
        for i in articles:
            if self.findCategoryByUrl(i["url"], item) == None:
                c = QTreeWidgetItem()
                c.setText(0, i['title'])  # title
                c.setText(1, i['url'])  # url
                c.setText(2, 'article')
                c.setText(3, i['updateTime'])
                item.addChild(c)

    def initDraftArticle(self):
        self.draftArticles = QTreeWidgetItem(self.tree)
        self.draftArticles.setText(0, '草稿箱')
        self.draftArticles.setIcon(0, QIcon("./images/folder_close.png"))
        self.tree.addTopLevelItem(self.draftArticles)

    def initPublishArticle(self):
        self.publishArticlesCategory = QTreeWidgetItem(self.tree)
        self.publishArticlesCategory.setText(0, '公开文章')
        self.publishArticlesCategory.setIcon(
            0, QIcon("./images/folder_close.png"))
        self.publishArticlesCategory.setDisabled(True)
        # self.label =  QLabel('', self)
        # self.movie =  QMovie("./images/loading.gif")
        # self.label.setMovie(self.movie)
        # self.movie.start()

        ### 设置节点的背景颜色
        #brush_red = QBrush(Qt.red)
        #self.publishArticles.setBackground(0, brush_red)
        #brush_green = QBrush(Qt.green)
        #self.publishArticlesCategories.setBackground(1, brush_green)
        self.tree.addTopLevelItem(self.publishArticlesCategory)
        #异步加载文章
        #self.statusBar.showMessage("博客加载中...")

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
Exemple #19
0
class MainCode(QMainWindow, UI.Ui_MainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        UI.Ui_MainWindow.__init__(self)
        self.setupUi(self)
        self.stackedWidget.setCurrentIndex(0)
        if not (os.path.exists("process")):
            os.makedirs("process")

        # 程序启动即初始化栈数据结构
        global s
        s = Stack()
        s.__init__()

        global lig
        lig = Lighting()

        global col
        col = Color()

        # 打开
        self.open_.clicked.connect(self.open)
        # 储存
        self.save_.clicked.connect(self.save)
        # 重置按钮
        self.reset_.clicked.connect(self.reset)
        # 撤销按钮
        self.undo_.clicked.connect(self.undo)
        # 裁剪
        self.btn_cut.clicked.connect(self.cut_)
        # 旋转
        self.rotate.clicked.connect(self.page_rotate_show)
        self.rotate_ensure.clicked.connect(self.rotate_)

        # 分页
        self.editor.clicked.connect(self.page_0_show)
        self.btn_text.clicked.connect(self.page_1_show)
        self.btn_denoise.clicked.connect(self.page_2_show)
        self.btn_statistic.clicked.connect(self.page_3_show)
        self.btn_filter.clicked.connect(self.page_4_show)
        self.btn_cutout.clicked.connect(self.page_5_show)
        self.btn_face.clicked.connect(self.page_6_show)
        self.btn_sticker.clicked.connect(self.page_7_show)
        self.btn_change_face.clicked.connect(self.page_8_show)
        self.filter_more.clicked.connect(self.page_9_show)
        self.filter_back.clicked.connect(self.page_4_show)

        # 光效
        self.brightness.sliderReleased.connect(self.bright_)
        self.contrast.sliderReleased.connect(self.contrast_)
        self.sharpness.sliderReleased.connect(self.sharpness_)
        # 色彩
        self.saturate.sliderReleased.connect(self.saturate_)

        # 直方图
        self.btn_rgb.clicked.connect(self.showRGB)
        self.btn_pixel.clicked.connect(self.showPixel)

        # 降噪
        self.btn_gaussian.clicked.connect(self.gaussian_)
        self.btn_blur.clicked.connect(self.blur_)
        self.btn_smooth_more.clicked.connect(self.smooth_more_)

        # 文字
        self.text_color.clicked.connect(self.text_color_)
        self.textEnsure.clicked.connect(self.text_)

        # 滤镜
        self.filter_pencil.clicked.connect(self.pencil)
        self.filter_emboss.clicked.connect(self.emboss)
        self.filter_blur.clicked.connect(self.blur__)
        self.filter_smooth.clicked.connect(self.smooth)
        self.filter_sharpen.clicked.connect(self.sharpen)
        self.filter_edge.clicked.connect(self.edge)
        self.filter_sunny.clicked.connect(lambda :self.filter_more_("sunny"))
        self.filter_trip.clicked.connect(lambda: self.filter_more_("trip"))
        self.filter_sakura.clicked.connect(lambda: self.filter_more_("sakura"))
        self.filter_jiangnan.clicked.connect(lambda: self.filter_more_("jiang_nan"))
        self.filter_wangjiawei.clicked.connect(lambda: self.filter_more_("wangjiawei"))
        self.filter_prague.clicked.connect(lambda: self.filter_more_("prague"))

        # 抠图
        self.cutout_auto.clicked.connect(self.autocutout_)
        self.cutout_manu.clicked.connect(self.manucutout_)

        # 人像
        self.face_ensure.clicked.connect(self.face_)

        # 贴图
        self.stick_select.clicked.connect(self.stick_open)
        self.stick_ensure.clicked.connect(self.stick_)

        # 换脸
        self.change_face_select.clicked.connect(self.change_face_open)
        self.change_face_ensure.clicked.connect(self.changeface_)

    # 打开
    def open(self):
        # 获取文件名及类型
        filename, filetype = QFileDialog.getOpenFileName(self, "打开文件", "C:",
                                                         "Files(*.png; *.jpg; *.jpeg; *.bmp; *.gif;)")
        if not filename == "":
            # 将打开的文件压入栈中
            s.push(filename)
            # 在lable中展示
            self.show_()

    # 储存
    def save(self):
        # 被保存的文件的路径
        path = s.peek()
        # 栈中有元素时
        if not path == None:
            img = Image.open(path)
            # 保存的路径
            save_path, file_type = QFileDialog.getSaveFileName(self, "文件保存", "C:",
                                                               "All Files (*);;Files (*.png);;Files (*.jpg);;Files ("
                                                               "*.jpeg);;Files (*.bmp);;Files (*.gif)")
            if not save_path == "":
                img.save(save_path)

    # 分页
    # 光效页
    def page_0_show(self):
        self.stackedWidget.setCurrentIndex(0)

    # 文字页
    def page_1_show(self):
        self.stackedWidget.setCurrentIndex(1)

    # 降噪页
    def page_2_show(self):
        self.stackedWidget.setCurrentIndex(2)

    # 统计页
    def page_3_show(self):
        self.stackedWidget.setCurrentIndex(3)

    # 滤镜页
    def page_4_show(self):
        self.stackedWidget.setCurrentIndex(4)

    # 抠图页
    def page_5_show(self):
        self.stackedWidget.setCurrentIndex(5)

    # 人像页
    def page_6_show(self):
        self.stackedWidget.setCurrentIndex(6)

    # 贴图页
    def page_7_show(self):
        self.stackedWidget.setCurrentIndex(7)

    # 换脸页
    def page_8_show(self):
        self.stackedWidget.setCurrentIndex(8)

    # 更多滤镜页
    def page_9_show(self):
        self.stackedWidget.setCurrentIndex(9)

    # 旋转页
    def page_rotate_show(self):
        self.stackedWidget_2.setCurrentIndex(1)

    # 展示图片
    def show_(self):
        # 获取此时栈顶元素
        path = s.peek()
        img = Image.open(path)
        img_type = img.format
        width, height = img.size
        if img_type == "PNG" or "JPG" or "BMP" or "JPEG":
            if width <= 1200 and height <= 750:
                # 居中显示图片
                self.display.setAlignment(Qt.AlignCenter)
                self.display.setPixmap(QPixmap(path))
            # 等比例压缩图片
            else:
                f1 = 1.0 * 1200 / width
                f2 = 1.0 * 750 / height
                factor = min(f1, f2)
                new_width = int(width * factor)
                new_height = int(height * factor)
                self.make_duplicate()
                img = Image.open(s.peek())
                out = img.resize((new_width, new_height), Image.ANTIALIAS)
                out.save(s.peek())
                self.display.setAlignment(Qt.AlignCenter)
                self.display.setPixmap(QPixmap(s.peek()))

        if img_type == "GIF":
            self.movie = QMovie(s.peek())
            self.display.setMovie(self.movie)
            self.movie.start()

    # 重置图片
    def reset(self):
        if not s.is_empty():
            if not s.size() == 1:
                s.reset()
                self.show_()

    # 撤销
    def undo(self):
        if not s.is_empty():
            if not s.size() == 1:
                # 删除栈顶元素
                s.pop()
                self.show_()

    # 为栈顶文件制作副本
    def make_duplicate(self):
        # 复制当前栈顶文件到img
        img = Image.open(s.peek())
        # 获得文件名并重新制作为 文件名 + (1) + .格式
        filename = s.peek()
        filename = filename.split("/")
        filename = filename[-1]
        filename = filename.split(".")
        filename = filename[0] + "(1)" + "." + filename[-1]
        # 副本的储存路径 = process/(相对路径) + 重新制作后的文件名
        path = "process/" + filename
        # 储存副本
        img.save(path)
        # 副本文件的路径入栈
        s.push(path)

    # 功能接口区
    # 缩放接口
    def wheelEvent(self, event):
        if not s.is_empty():
            self.make_duplicate()
            path = s.peek()
            angle = event.angleDelta() / 8
            angleY = angle.y()  # 竖直滚过的距离
            if angleY > 0:
                img = QImage(path)
                result = img.scaled(img.width() * 1.1, img.height() * 1.1)
                self.display.setPixmap(QPixmap(result))
                result.save(path)

            else:  # 滚轮下滚
                img = QImage(path)
                result = img.scaled(img.width() * 0.9, img.height() * 0.9)
                self.display.setPixmap(QPixmap(result))
                result.save(path)

    # 裁剪接口
    def cut_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            Cut.main(path)
            self.show_()

    # 旋转接口
    def rotate_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            angle = self.rotate_angle.value()
            img = Image.open(path)
            outcome = img.rotate(angle)
            outcome.save(path)
            self.show_()

    # 光效接口
    def bright_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            value = self.brightness.value()
            lig.bright(path, value)
            self.show_()

    def contrast_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            value = self.contrast.value()
            lig.contrast(path, value)
            self.show_()

    def sharpness_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            value = self.sharpness.value()
            lig.sharpness(path, value)
            self.show_()

    # 色彩接口
    def saturate_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            value = self.saturate.value()
            col.saturate(path, value)
            self.show_()

    # 降噪接口
    def gaussian_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            den = Denoise()
            den.gaussian(path)
            self.show_()

    def blur_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            den = Denoise()
            den.blur(path)
            self.show_()

    def smooth_more_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            den = Denoise()
            den.smooth_more(path)
            self.show_()

    # 直方图
    def showRGB(self):
        if s.is_empty():
            self.open()
        else:
            img = cv.imread(s.peek(), cv.IMREAD_COLOR)
            color_ = ('b', 'g', 'r')
            for i, colors in enumerate(color_):
                histr = cv.calcHist([img], [i], None, [256], [0, 256])
                plt.plot(histr, color=colors)
            plt.xlim([0, 256])
            plt.show()

    def showPixel(self):
        if s.is_empty():
            self.open()
        else:
            p = cv.imread(s.peek(), -1)
            plt.hist(p.ravel(), 256, [0, 256])
            plt.show()
            cv.waitKey(0)
            cv.destroyAllWindows()

    # 文字接口
    def text_color_(self):
        global text_r, text_g, text_b
        color = QColorDialog.getColor()
        if color.isValid():
            temp = color.name()
            temp = temp[1:]
            text_r = int(temp[0:2], 16)
            text_g = int(temp[2:4], 16)
            text_b = int(temp[4:6], 16)

    def text_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            content = self.textEdit.toPlainText()
            fontScale = int(self.text_fontScale.value())
            color = (text_b, text_g, text_r)
            x = int(self.text_x.toPlainText())
            y = int(self.text_y.toPlainText())
            thickness = int(self.text_thickess.value())
            txt = Text()
            txt.addText(path, content, fontScale, x, y, color, thickness)
            self.show_()

    # 滤镜接口
    def pencil(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            flt = Filter()
            flt.pencil(path)
            self.show_()

    def emboss(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            flt = Filter()
            flt.emboss(path)
            self.show_()

    def blur__(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            flt = Filter()
            flt.blur(path)
            self.show_()

    def smooth(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            flt = Filter()
            flt.smooth(path)
            self.show_()

    def edge(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            flt = Filter()
            flt.edge(path)
            self.show_()

    def sharpen(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            flt = Filter()
            flt.sharpen(path)
            self.show_()

    def filter_more_(self, filter_type):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            flt = Filter()
            flt.filter_more(path, filter_type)
            self.show_()

    # 抠图接口
    def autocutout_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            co = AutoCutout
            co.AutoCutout(path)
            self.show_()

    def manucutout_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            ManuCutout.main(path)
            self.show_()

    # 人像接口
    def face_(self):
        if s.is_empty():
            self.open()
        else:
            self.make_duplicate()
            path = s.peek()
            whitening = self.whitening.value()
            smoothing = self.smoothing.value()
            thinface = self.thinface.value()
            shrink_face = self.shrink_face.value()
            enlarge_eye = self.enlarge_eye.value()
            remove_eyebrow = self.remove_eyebrow.value()
            p = Portrait()
            p.face_beautify(path, whitening, smoothing, thinface, shrink_face, enlarge_eye, remove_eyebrow)
            self.show_()

    # 贴图接口
    def stick_open(self):
        filename, filetype = QFileDialog.getOpenFileName(self, "打开文件", "C:",
                                                         "Files(*.png; *.jpg; *.jpeg; *.bmp; *.gif;)")
        self.stick_address.setPlainText(filename)

    def stick_(self):
        path_stick = self.stick_address.toPlainText()
        if path_stick == "":
            self.stick_open()
        else:
            self.make_duplicate()
            path = s.peek()
            x = int(self.stick_x.toPlainText())
            y = int(self.stick_y.toPlainText())
            img1 = Image.open(path)
            img2 = Image.open(path_stick)
            img1.paste(img2, (x, y))
            img1.save(path)
            self.show_()

    # 换脸接口
    def change_face_open(self):
        filename, filetype = QFileDialog.getOpenFileName(self, "打开文件", "C:",
                                                         "Files(*.png; *.jpg; *.jpeg; *.bmp; *.gif;)")
        self.change_face_address.setPlainText(filename)

    def changeface_(self):
        path_change_face = self.change_face_address.toPlainText()
        if path_change_face == "":
            self.change_face_open()
        else:
            self.make_duplicate()
            path = s.peek()
            cf = ChangeFace
            cf.merge_face(path, path_change_face)
            self.show_()

    def closeEvent(self, event):
        if os.path.exists("process"):
            shutil.rmtree("process")
class SplashScreen(QSplashScreen):
    """PyQt 启动界面"""

    def __init__(self, name, image='', widget=None, above=False):
        super(SplashScreen, self).__init__()
        self.m_clients = set()
        self.m_movie = None
        self.m_server = None
        self.m_image = image
        self.m_widget = widget
        self.m_alignment = Qt.AlignHCenter | Qt.AlignBottom
        self.m_color = Qt.black
        self.initSplash(name, above)
        self.initPixmap()
        self.initWidget()

    def setAlignment(self, alignment):
        """设置文本位置
        :param alignment: Qt.AlignmentFlag
        """
        if isinstance(alignment, Qt.AlignmentFlag):
            self.m_alignment = alignment

    def setColor(self, color):
        """设置文本颜色
        :param color: Qt.GlobalColor, QColor, QGradient
        """
        if isinstance(color, (Qt.GlobalColor, QColor, QGradient)):
            self.m_color = color

    def showMessage(self, message, progress=0, alignment=None, color=None):
        """设置进度文本
        :param message: 纯文本或html文本
        :param progress: 进度条值
        :param alignment: 对齐方式
        :param color: 文字颜色
        """
        if self.m_widget and hasattr(self.m_widget, 'labelMessage'):
            label = getattr(self.m_widget, 'labelMessage', None)
            progressbar = getattr(self.m_widget, 'labelProgress', None)
            if progressbar and isinstance(progress, int):
                progressbar.setValue(progress)

            if message is not None:
                if hasattr(label, 'setHtml'):
                    label.setHtml(message)
                    return
                elif hasattr(label, 'setText'):
                    label.setText(message)
                    return

        elif message is not None:
            super(SplashScreen, self).showMessage(message,
                                                  alignment or self.m_alignment,
                                                  color or self.m_color)

    def mousePressEvent(self, event):
        """取消默认的鼠标点击隐藏
        :param event: QMouseEvent
        """
        event.ignore()

    def initSplash(self, name, above=False):
        """初始化启动画面
        :param name: local server name
        :param above: stays on top
        """
        # 鼠标
        self.setCursor(Qt.WaitCursor)

        # 是否置顶
        if above:
            self.setWindowFlags(
                self.windowFlags() | Qt.WindowStaysOnTopHint)

        # 创建本地server
        self.m_server = QLocalServer(self)
        if self.m_server.listen(self.getName(name)):
            self.m_server.newConnection.connect(self.slotNewConnection)

    def initPixmap(self):
        """加载背景图"""
        if self.m_image.endswith('.gif'):
            self.m_movie = QMovie(self.m_image, b'gif', self)
            self.m_movie.frameChanged.connect(
                lambda _: self.setPixmap(self.m_movie.currentPixmap()))
            self.m_movie.start()
        else:
            self.setPixmap(QPixmap(self.m_image))

    def initWidget(self):
        if self.m_widget and callable(self.m_widget):
            self.m_widget = self.m_widget()
        if not isinstance(self.m_widget, QWidget):
            return
        layout = QVBoxLayout(self)
        layout.setSpacing(0)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.m_widget)

    def slotNewConnection(self):
        """新客户端连接"""
        socket = self.m_server.nextPendingConnection()
        socket.readyRead.connect(self.slotReadyRead)
        socket.disconnected.connect(self.slotDisconnected)
        self.m_clients.add(socket)

    def slotReadyRead(self):
        """收到数据"""
        socket = self.sender()
        if not socket:
            return
        while 1:
            message = socket.readLine().data()
            if not (message and message.endswith(b'\n')):
                break
            message = message.strip(b'\n').decode('utf-8', errors='ignore')
            try:
                message = json.loads(message)
                print('recv:', message)
                text = message.get('text', None)
                progress = message.get('progress', None)
            except Exception as e:
                print(e)
                break
            if text == 'exit':
                self.close()
                QApplication.instance().quit()
                break
            elif text == progress is None:
                break
            else:
                self.showMessage(text, progress)

    def slotDisconnected(self):
        """客户端断开连接"""
        socket = self.sender()
        if socket:
            socket.deleteLater()
        if socket in self.m_clients:
            self.m_clients.remove(socket)

        if len(self.m_clients) == 0:
            self.close()
            QApplication.instance().quit()

    @classmethod
    def getName(cls, name=None):
        if not name or len(str(name)) == 0:
            name = hashlib.md5(
                os.path.dirname(sys.argv[0]).encode()).hexdigest()
        return str(name)

    @classmethod
    def connect(cls, single=False):
        """连接启动器
        :param single: 如果是单实例则客户端必须由启动器启动
        """
        name = os.environ.get('SplashConnectName', None)
        if not name:
            if single:
                # 单实例客户端必须由启动器启动
                sys.exit(-1)
            return
        cls.client = QLocalSocket()
        cls.client.connectToServer(name)

    @classmethod
    def disconnect(cls):
        if hasattr(cls, 'client'):
            cls.client.close()

    @classmethod
    def sendMessage(cls, message):
        """发送json消息
        :param message: json消息,必须\n结尾
        """
        if not hasattr(cls, 'client'):
            return
        if not message.endswith('\n'):
            message += '\n'
        print('send:', message)
        cls.client.write(message.encode())
        cls.client.flush()

    @classmethod
    def start(cls, path, image, widget=None, single=False, name=None,
              above=False, alignment=None, color=None):
        """
        :param path: 客户端路径
        :param image: 背景图片
        :param widget: 自定义的UI层
        :param single: 是否单实例,默认 False
        :param name: 单实例唯一名
        :param above: 是否置顶
        :param alignment: 文字对齐位置
        :param color: 文本颜色
        """
        name = cls.getName(name)
        os.environ['SplashConnectName'] = name

        # 单实例检测
        if single:
            s = QLocalSocket()
            s.connectToServer(name)
            if s.waitForConnected():
                # 应用已经启动则退出
                s.close()
                s.deleteLater()
                print('application is already running')
                sys.exit(0)

        app = QApplication(sys.argv)
        # 启动客户端并将参数传递
        QProcess.startDetached(path, sys.argv[1:])

        # 显示启动界面
        w = SplashScreen(name, image, widget, above)
        w.setAlignment(alignment)
        w.setColor(color)
        w.show()

        sys.exit(app.exec_())
Exemple #21
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(370, 600)
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(85, 85, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(85, 85, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(0, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        MainWindow.setPalette(palette)
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(9)
        MainWindow.setFont(font)
        MainWindow.setMouseTracking(False)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")


        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(160, 70, 41, 20))
        self.label.setObjectName("label")


        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(70, 130, 251, 16))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")


        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(140, 180, 41, 20))
        self.label_3.setObjectName("label_3")

        self.voiceFig = QtWidgets.QLabel(self.centralwidget)
        self.voiceFig.setGeometry(QtCore.QRect(100, 10, 161, 120))
        self.voiceFig.setText("")
        self.gif = QMovie("resource\\file\\voice3.gif")
        self.voiceFig.setMovie(self.gif)
        self.gif.start()
        self.voiceFig.setScaledContents(True)
        self.voiceFig.setObjectName("voiceFig")

        self.siriGif = QtWidgets.QLabel(self.centralwidget)
        self.siriGif.setGeometry(QtCore.QRect(-250, 150, 850, 77))
        self.siriGif.setText("")
        self.gif = QMovie("resource\\file\\voice2.gif")
        self.siriGif.setMovie(self.gif)
        self.gif.start()
        self.siriGif.setScaledContents(True)
        self.siriGif.setObjectName("voiceFig")


        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(90, 245, 241, 31))
        self.label_4.setWordWrap(True)
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(90, 280, 221, 51))
        self.label_5.setWordWrap(True)
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(90, 325, 251, 41))
        self.label_6.setWordWrap(True)
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(90, 370, 251, 41))
        self.label_7.setWordWrap(True)
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(90, 420, 261, 41))
        self.label_8.setWordWrap(True)
        self.label_8.setObjectName("label_8")
        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(40, 240, 31, 31))
        self.label_9.setText("")
        self.label_9.setPixmap(QtGui.QPixmap("resource\\file\\1.jpg"))
        self.label_9.setScaledContents(True)
        self.label_9.setObjectName("label_9")
        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(40, 290, 31, 31))
        self.label_10.setText("")
        self.label_10.setPixmap(QtGui.QPixmap("resource\\file\\2.jpg"))
        self.label_10.setScaledContents(True)
        self.label_10.setObjectName("label_10")
        self.label_11 = QtWidgets.QLabel(self.centralwidget)
        self.label_11.setGeometry(QtCore.QRect(40, 370, 31, 31))
        self.label_11.setText("")
        self.label_11.setPixmap(QtGui.QPixmap("resource\\file\\4.jpg"))
        self.label_11.setScaledContents(True)
        self.label_11.setObjectName("label_11")
        self.label_12 = QtWidgets.QLabel(self.centralwidget)
        self.label_12.setGeometry(QtCore.QRect(40, 330, 31, 31))
        self.label_12.setText("")
        self.label_12.setPixmap(QtGui.QPixmap("resource\\file\\3.jpg"))
        self.label_12.setScaledContents(True)
        self.label_12.setObjectName("label_12")
        self.label_13 = QtWidgets.QLabel(self.centralwidget)
        self.label_13.setGeometry(QtCore.QRect(40, 420, 31, 31))
        self.label_13.setText("")
        self.label_13.setPixmap(QtGui.QPixmap("resource\\file\\5.jpg"))
        self.label_13.setScaledContents(True)
        self.label_13.setObjectName("label_13")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 370, 24))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Siri"))
        self.label.setText(_translate("MainWindow", "1"))
        self.label_2.setText(_translate("MainWindow", "Hi! How can I help?"))
        self.label_3.setText(_translate("MainWindow", "1"))
        self.label_4.setText(_translate("MainWindow", "1. Enjoy music by saying \"Music\""))
        self.label_5.setText(_translate("MainWindow", "2. Take some notes by saying \"Notepad\""))
        self.label_6.setText(_translate("MainWindow", "3. Do math work by saying \"Calculator\""))
        self.label_7.setText(_translate("MainWindow", "4. Get weather in Shanghai by saing \"Weather\""))
        self.label_8.setText(_translate("MainWindow", "5. Open WeChat by saying \"Chat\""))

    def helpUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow","Hi! How can I help?"))

    def listeningUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow","I am listening!"))

    def playMusicUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow","Play Music Now!"))

    def openNotebookUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow","Open Notebook Now!"))

    def openCalculator(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow", "Open Calculator Now!"))

    def openWeatherWeb(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow", "Open Weather Web Now!"))

    def openWeChat(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow", "Open the WeChat Now!"))

    def notCatchUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label_2.setText(_translate("MainWindow","I didn't catch that."))
Exemple #22
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(314, 462)
        MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(60, 280, 201, 51))
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(14)
        self.label_3.setFont(font)
        self.label_3.setStyleSheet("color: rgb(0, 117, 210);")
        self.label_3.setWordWrap(True)
        self.label_3.setObjectName("label_3")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(60, 250, 201, 21))
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(14)
        self.label_2.setFont(font)
        self.label_2.setStyleSheet("color: rgb(0, 117, 210);")
        self.label_2.setWordWrap(True)
        self.label_2.setObjectName("label_2")
        self.voiceFig = QtWidgets.QLabel(self.centralwidget)
        self.voiceFig.setGeometry(QtCore.QRect(70, 50, 161, 121))
        self.voiceFig.setText("")
        self.gif = QMovie("icon/voice.gif")
        self.voiceFig.setMovie(self.gif)
        self.gif.start()
        self.voiceFig.setScaledContents(True)
        self.voiceFig.setObjectName("voiceFig")

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(70, 160, 161, 21))
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(14)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(0, 117, 210);")
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setWordWrap(True)
        self.label.setObjectName("label")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(60, 330, 201, 51))
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(14)
        self.label_4.setFont(font)
        self.label_4.setStyleSheet("color: rgb(0, 117, 210);")
        self.label_4.setWordWrap(True)
        self.label_4.setObjectName("label_4")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Voice Assistant"))
        self.label_3.setText(
            _translate("MainWindow",
                       "1. Enjoy music by saying \"Play music\""))
        self.label_2.setText(_translate("MainWindow", "You can:"))
        self.label.setText(_translate("MainWindow", "Hi! How can I help?"))
        self.label_4.setText(
            _translate("MainWindow",
                       "2. Take some notes by saying \"Open file\""))

    def listeningUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label.setText(_translate("MainWindow", "I am listening!"))

    def playMusicUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label.setText(_translate("MainWindow", "Playing Music Now!"))

    def openFileUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label.setText(_translate("MainWindow", "Opening File Now!"))

    def notCatchUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.label.setText(_translate("MainWindow", "I didn't catch that."))
Exemple #23
0
class HomeWidget(QWidget, Ui_Home):

    metaThreadPool = QThreadPool()

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

        self.setupUi(self)

        self.userInput.textChanged.connect(self.urlChanged)
        self.download.clicked.connect(self.startDownload)
        
        self.loadingGif = QMovie(":/icons/loading.gif")

        self.description.setReadOnly(True)
    
    def setConfig(self, config):
        self.config = config

    def startMetaDownloadThread(self):
        url = self.userInput.text()

        # Start loading gif
        self.clearMetaInfo()
        self.startLoadingAnimation()

        meta = MetaInformation(url)
        meta.signal.metaDownloaded.connect(self.loadMetaInfo)
        meta.signal.unableToRetrieveMeta.connect(self.noMetaInformationFound)

        self.metaThreadPool.start(meta)

    def startDownload(self):
        # validate(self.userInput.text())
        url = self.userInput.text()

        dl = Downloader(url, self.config["saveDirectory"], self.config["youtubedl"])

        self.metaThreadPool.start(dl)
        self.userInput.clear()
        self.clearMetaInfo()

    def startLoadingAnimation(self):
        self.image.setMovie(self.loadingGif)
        self.loadingGif.start()
    
    def stopLoadingAnimation(self):
        self.image.setMovie(None)
        self.loadingGif.stop()

    def clearMetaInfo(self):
        self.title.setText("...")
        # Description
        self.description.setText("""
        <p>
        ...
        </p>
        """)
        self.image.clear()

    @pyqtSlot(str)
    def urlChanged(self, text):
        # FIXME validate url later
        self.startMetaDownloadThread()
    
    # FIXME Find a better way to parse unicode to html format
    def convertDescToHtml(self, desc):
        html = "<p>"
        for char in desc:
            if char == '\n':
                html += "</p><p>"
            html += char
        html += "</p>"
        return html

    @pyqtSlot(dict)
    def loadMetaInfo(self, meta):
        self.stopLoadingAnimation()

        print("Loaded meta information")

        # Title
        self.title.setText(meta["title"])

        # Description
        self.description.setText(self.convertDescToHtml(meta["description"]))

        # Image (load from a byte array)
        pic = QPixmap()
        pic.loadFromData(meta["thumbnail"])
        pic = pic.scaledToWidth(self.width() * 0.75)
        self.image.setPixmap(pic)

    @pyqtSlot(str)
    def noMetaInformationFound(self, url):
        if url:
            print("No meta information found for " + url)
        else:
            print("No meta information found and no url provided.")
Exemple #24
0
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
            self.setWindowTitle("Pandora bedrijfs informatie systeem login scherm")
            self.setWindowIcon(QIcon('./images/logos/logo.jpg')) 
     
            self.setFont(QFont('Arial', 10))
            self.setStyleSheet("background-color: #D9E1DF")  
            grid = QGridLayout()
            grid.setSpacing(20)
            
            self.email = QLabel()
            emailEdit = QLineEdit()
            emailEdit.setStyleSheet("background: #F8F7EE")
            emailEdit.setFixedWidth(200)
            emailEdit.setFont(QFont("Arial",10))
            emailEdit.textChanged.connect(self.emailChanged)

            self.Wachtwoord = QLabel()
            wachtwEdit = QLineEdit()
            wachtwEdit.setStyleSheet("background: #F8F7EE")
            wachtwEdit.setEchoMode(QLineEdit.Password)
            wachtwEdit.setFixedWidth(200)
            wachtwEdit.setFont(QFont("Arial",10))
            wachtwEdit.textChanged.connect(self.wachtwChanged)
 
            lbl = QLabel()
            pixmap = QPixmap('./images/logos/verbinding.jpg')
            lbl.setPixmap(pixmap)
            grid.addWidget(lbl, 0, 0, 1, 2)
            
            lblinfo = QLabel(' Pandora login')
            grid.addWidget(lblinfo, 0, 1, 1, 2, Qt.AlignLeft)
            lblinfo.setStyleSheet("color:rgba(45, 83, 115, 255); font: 25pt Comic Sans MS")
            
            logo = QLabel()
            pixmap = QPixmap('./images/logos/logo.jpg')
            logo.setPixmap(pixmap)
            grid.addWidget(logo , 0, 2, 1, 1, Qt.AlignRight)
             
            pandora = QLabel()
            movie = QMovie('./images/logos/pyqt5.gif')
            pandora.setMovie(movie)
            movie.start()
            grid.addWidget(pandora, 1 ,0, 1, 3, Qt.AlignCenter)
                 
            grid.addWidget(QLabel('emailadres'), 3, 1)
            grid.addWidget(emailEdit, 3, 2)
    
            grid.addWidget(QLabel('Wachtwoord'), 4, 1)
            grid.addWidget(wachtwEdit, 4, 2)
                                   
            self.setLayout(grid)
            self.setGeometry(600, 250, 150, 150)
            
            applyBtn = QPushButton('Login')
            applyBtn.clicked.connect(self.accept)
            
            grid.addWidget(applyBtn, 5, 1, 1 , 2, Qt.AlignRight)
            applyBtn.setFont(QFont("Arial",10))
            applyBtn.setFixedWidth(90)
            applyBtn.setStyleSheet("color: black;  background-color: gainsboro")
                       
            cancelBtn = QPushButton('Afsluiten')
            cancelBtn.clicked.connect(lambda: sys.exit(totZiens()))
                                      
            grid.addWidget(cancelBtn,  5, 2)
            cancelBtn.setFont(QFont("Arial",10))
            cancelBtn.setFixedWidth(90)
            cancelBtn.setStyleSheet("color: black;  background-color: gainsboro")
            
            nwBtn = QPushButton('Nieuw Account')
            nwBtn.clicked.connect(lambda: maakAccount(self))
            
            grid.addWidget(nwBtn,  5, 0, 1, 2, Qt.AlignRight)
            nwBtn.setFont(QFont("Arial",10))
            nwBtn.setFixedWidth(140)
            nwBtn.setStyleSheet("color: black;  background-color: gainsboro")
            
            infoBtn = QPushButton('Informatie')
            infoBtn.clicked.connect(lambda: info())
            
            grid.addWidget(infoBtn,  5, 0, 1, 2)
            infoBtn.setFont(QFont("Arial",10))
            infoBtn.setFixedWidth(120)
            infoBtn.setStyleSheet("color: black;  background-color: gainsboro")           
            
            grid.addWidget(QLabel('\u00A9 2017 all rights reserved [email protected]'), 6, 0, 1, 3, Qt.AlignCenter)
Exemple #25
0
class Ui_Mine4(object):
    def myshow(self):
        exec('self.widget.show()')
        exec('self.widget_2.show()')

    def mytr(self, year, top):
        make_a_snapshot("wct%d.html" % (year * 100 + top),
                        ("wct%d.png" % (year * 100 + top)))
        make_a_snapshot("t4%d.html" % (year * 100 + top),
                        ("t4%d.png" % (year * 100 + top)))

    def click3(self):
        year = int(self.comboBox.currentText())
        top = int(self.comboBox_2.currentText())
        try:
            os.remove('wct%d.html' % (year * 100 + top))
            os.remove('t4%d.html' % (year * 100 + top))
            os.remove('wct%d.png' % (year * 100 + top))
            os.remove('t4%d.png' % (year * 100 + top))
        except:
            pass

    def click2(self):
        year = int(self.comboBox.currentText())
        top = int(self.comboBox_2.currentText())
        t1 = threading.Thread(target=self.myshow)
        t2 = threading.Thread(target=self.mytr, args=(year, top))
        conn = pymysql.connect(host='localhost',
                               user='******',
                               password='******',
                               port=3306,
                               db='maoyan',
                               charset='utf8mb4')
        sql = "select year,actor1,actor2,actor3,actor4 from films"
        db_0 = pd.read_sql(sql, conn)
        db = db_0[(db_0.year == year)]
        dict_ = dict(
            Counter(db['actor1'].append(db['actor2']).append(
                db['actor3']).append(db['actor4']).dropna()).most_common(top))
        x = list(dict_.keys())
        y = list(dict_.values())
        top_Bar = pyecharts.Bar(width=500)
        top_Bar.add("",
                    x,
                    y,
                    mark_line=['max'],
                    xaxis_interval=0,
                    is_labal_show=True)
        top_Bar.render("t4%d.html" % (year * 100 + top))
        value10 = [965, 847, 582, 555, 550, 462, 366, 360, 282, 273]
        value = value10[0:top]
        word = WordCloud(width=700)
        word.add("", x, value, word_size_range=[20, 100])
        word.render("wct%d.html" % (year * 100 + top))
        self.widget.load(QUrl('file:///wct%d.html' % (year * 100 + top)))
        #self.widget.show()
        self.widget_2.load(QUrl('file:///t4%d.html' % (year * 100 + top)))
        t1.start()
        t2.start()
        #self.widget_2.show()
        #top_Bar.render("t4%d.png" % (year * 100 + top))
        #word.render("wct%d.png" % (year * 100 + top))
    def click1(self):
        self.form.close()
        Form1 = QtWidgets.QMainWindow()
        self.ui = Mine.Ui_Mine()
        self.ui.setupUi(Form1)
        Form1.show()

    def setupUi(self, Mine4):
        Mine4.setObjectName("Mine4")
        Mine4.resize(1347, 790)
        Mine4.setStyleSheet("border-image: url(:/M6.jpg);")
        Mine4.setWindowFlags(Qt.FramelessWindowHint)
        self.form = Mine4
        self.centralwidget = QtWidgets.QWidget(Mine4)
        self.centralwidget.setObjectName("centralwidget")
        self.widget = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(0, 270, 601, 501))
        self.widget.setObjectName("widget")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(360, 0, 151, 51))
        self.comboBox.setAutoFillBackground(False)
        self.comboBox.setStyleSheet("font: 30pt \"隶书\";\n"
                                    "color: rgb(255, 0, 0);")
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(290, 0, 72, 51))
        self.label.setStyleSheet("font: 20pt \"隶书\";\n"
                                 "color: rgb(255, 0, 0);")
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(530, 0, 111, 51))
        self.label_2.setStyleSheet("font: 30pt \"Agency FB\";\n"
                                   "color: rgb(255, 0, 0);")
        self.label_2.setObjectName("label_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(110, 0, 71, 111))
        self.pushButton_3.setStyleSheet("font: 20pt \"隶书\";\n"
                                        "color: rgb(255, 0, 0);")
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 0, 71, 111))
        font = QtGui.QFont()
        font.setFamily("方正舒体")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("font: 20pt \"隶书\";\n"
                                      "color:rgb(255, 0, 0)")
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(200, 0, 81, 111))
        self.pushButton_2.setStyleSheet("font: 20pt \"隶书\";\n"
                                        "color: rgb(255, 0, 0);")
        self.pushButton_2.setObjectName("pushButton_2")
        self.comboBox_2 = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox_2.setGeometry(QtCore.QRect(620, 0, 151, 51))
        self.comboBox_2.setStyleSheet("font: 30pt \"隶书\";\n"
                                      "color: rgb(255, 0, 0);")
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        """
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(850, 30, 171, 181))
        self.label_3.setText("")
        self.gif = QMovie('M14.gif')
        self.label_3.setMovie(self.gif)
        self.gif.start()
        self.label_3.setObjectName("label_3")
        """
        self.widget_2 = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
        self.widget_2.setGeometry(QtCore.QRect(680, 270, 601, 481))
        self.widget_2.setObjectName("widget_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(1090, 20, 191, 181))
        self.label_4.setText("")
        self.label_4.setObjectName("label_4")
        self.gif = QMovie('M20.gif')
        self.label_4.setMovie(self.gif)
        self.gif.start()
        Mine4.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(Mine4)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1347, 26))
        self.menubar.setObjectName("menubar")
        Mine4.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(Mine4)
        self.statusbar.setObjectName("statusbar")
        Mine4.setStatusBar(self.statusbar)

        self.retranslateUi(Mine4)
        self.pushButton.clicked.connect(self.click1)
        self.pushButton_3.clicked.connect(self.click2)
        self.pushButton_2.clicked.connect(self.click3)
        QtCore.QMetaObject.connectSlotsByName(Mine4)

    def retranslateUi(self, Mine4):
        _translate = QtCore.QCoreApplication.translate
        Mine4.setWindowTitle(_translate("Mine4", "欢迎使用喵眼!"))
        self.comboBox.setItemText(0, _translate("Mine4", "2015"))
        self.comboBox.setItemText(1, _translate("Mine4", "2016"))
        self.comboBox.setItemText(2, _translate("Mine4", "2017"))
        self.comboBox.setItemText(3, _translate("Mine4", "2018"))
        self.label.setText(_translate("Mine4", "年份"))
        self.label_2.setText(_translate("Mine4", "Top"))
        self.pushButton_3.setText(_translate("Mine4", "查\n" "看"))
        self.pushButton.setText(_translate("Mine4", "返\n" "回"))
        self.pushButton_2.setText(_translate("Mine4", "不\n" "保\n" "存"))
        self.comboBox_2.setItemText(0, _translate("Mine4", "3"))
        self.comboBox_2.setItemText(1, _translate("Mine4", "5"))
        self.comboBox_2.setItemText(2, _translate("Mine4", "10"))
class PhotoBooth(Ui_PhotoBooth):
    def __init__(self):
        super(PhotoBooth, self).__init__()
        self.camera = Camera()

        self.initUI()
        self.status = 0

        #self.relais=relais(('light','fanCam','fanPrinter',''))

    def initUI(self):
        self.full = False
        self.MainWindow = QtWidgets.QMainWindow()
        self.setupUi(self.MainWindow)

        self.movie = QMovie('ressources\Spinner-1s-400px_white.gif')
        self.loading.setMovie(self.movie)
        self.movie.start()

        self.buttonExit.clicked.connect(lambda: self.CloseWindow())
        self.buttonRestart.clicked.connect(lambda: self.ShowCam())
        self.buttonPrinter.clicked.connect(lambda: self.send2printer())
        self.buttonDecrease.clicked.connect(lambda: self.changeNbPrint(-1))
        self.buttonIncrease.clicked.connect(lambda: self.changeNbPrint(1))
        self.buttonCancel.clicked.connect(lambda: self.modeVeille())
        self.veilleButton.clicked.connect(lambda: self.ShowCam())
        self.buttonPhoto.clicked.connect(lambda: self.StartCountdown())

        self.widgetPrint.hide()
        self.widgetPhoto.hide()
        self.warning.hide()
        self.countdown.hide()

        self.getComptPrint()

        self.MainWindow.show()
        self.ShowCam()

        if DEVELOPERMODE:
            rect = win32gui.GetWindowRect(
                win32gui.FindWindow(None, 'PhotoBooth'))
            win32gui.MoveWindow(win32gui.FindWindow(None, 'PhotoBooth'),
                                rect[0] + 3000, rect[1], rect[2] + 3000,
                                rect[3], True)
        else:
            self.widgetDevelopper.hide()
        self.fullScreen()

    #@pyqtSlot(QImage)
    def setImage(self, image):
        self.camView.setPixmap(QPixmap.fromImage(image))

    def fullScreen(self):
        if self.full:
            self.MainWindow.showNormal()
        else:
            self.MainWindow.showFullScreen()
        self.full = not self.full
        #self.MainWindow.resize(1920, 1080)
        #self.centralwidget.resize(1920,1080)
        #self.background.resize(1920,1080)

    def CloseWindow(self):
        self.StopCam()
        self.MainWindow.close()

    def showPhoto(self):

        #pixmap = QPixmap(self.lastPhoto.path)
        pixmap = self.lastPhoto.QImage
        #pixmap=pixmap.scaledToWidth(self.lastPhoto.width)
        self.viewer.setPixmap(pixmap)

        self.widgetPhoto.hide()
        self.widgetPrint.show()

        self.changeNbPrint(0)

    def StartCountdown(self):
        self.countdown.setText(
            QtCore.QCoreApplication.translate("MainWindow", '10'))
        self.countdown.show()
        self.buttonPhoto.hide()
        self.th.StartCountdown(10)

    def ShowCam(self):
        #self.camView.setText(QtCore.QCoreApplication.translate("PhotoBooth", "654 photos restantes"))

        self.veilleButton.hide()
        self.widgetPrint.hide()
        self.widgetPhoto.show()
        self.lookUp.hide()

        self.th = Thread()
        self.th.changePixmap.connect(self.setImage)
        self.th.init(self)
        self.th.start()

    def StopCam(self):
        self.camView.clear()
        self.widgetPhoto.hide()
        try:
            self.th.stop()
        except:
            pass

    def TakePhoto(self):

        oldPic = photo()

        self.camera.Trigger()

        self.StopCam()
        self.countdown.setText(
            QtCore.QCoreApplication.translate("MainWindow", '0'))
        self.countdown.hide()
        self.buttonPhoto.show()

        self.lastPhoto = photo()
        while self.lastPhoto.path == oldPic.path:
            self.lastPhoto = photo()

        if self.lastPhoto.isDarker(1600):
            pass  #self.relais.ON('light')

        self.showPhoto()

    def modeVeille(self):
        self.StopCam()
        self.veilleButton.show()

    def changeNbPrint(self, i):
        if i == 0:  # Init
            self.nbPrint = 1
        else:
            self.nbPrint = min(max(1, self.nbPrint + i), 6)
        self.nbPrintLabel.setText(
            QtCore.QCoreApplication.translate("MainWindow", str(self.nbPrint)))

    def send2printer(self):
        for i in range(self.nbPrint):
            printer(self.lastPhoto)
        self.setComptPrint(self.nbPrint)
        self.ShowCam()

    def getComptPrint(self):
        file1 = open("compteur.txt", "r")
        self.comptPrint = int(file1.read())
        file1.close
        self.compteur.setText(
            QtCore.QCoreApplication.translate(
                "MainWindow",
                str(self.comptPrint) + ' photos restantes'))

    def setComptPrint(self, n):
        self.comptPrint -= n
        file1 = open("compteur.txt", "w")
        file1.write(str(self.comptPrint))
        file1.close
        self.compteur.setText(
            QtCore.QCoreApplication.translate(
                "MainWindow",
                str(self.comptPrint) + ' photos restantes'))

        file2 = open("Printlog.csv", "a")
        line = []
        line.append(str(datetime.now()))
        line.append(self.lastPhoto.name)
        line.append(str(n))
        file2.write(';'.join(line))
        file2.close
Exemple #27
0
 def set_loading(self):
     loader = QMovie(appctxt.get_resource("animations/loader.gif"))
     self.preview_box.setMovie(loader)
     loader.jumpToFrame(0)
     self.preview_box.resize(loader.currentImage().size())
     loader.start()
Exemple #28
0
class SlideshowMediaWindow(QDialog):
    def __init__(self, parent, area=None, *args, **kwargs):
        "parent: parent widget"
        "area: top-left-x(to screen), top-left-y(to screen), width, height"
        super(SlideshowMediaWindow, self).__init__(parent, *args, **kwargs)
        self.setWindowTitle("Slideshow External Media Window")
        sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.setSizePolicy(sizePolicy)
        self.setAttribute(Qt.WA_DeleteOnClose, on=True)
        self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint)
        self.setSizeGripEnabled(True)

        self.layout = QVBoxLayout()
        self.media_container = QLabel(self)
        self.media_container.setAttribute(Qt.WA_NativeWindow, on=True)
        # self.media_container.setFrameShape(QFrame.NoFrame)
        sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        sizePolicy.setHeightForWidth(
            self.media_container.sizePolicy().hasHeightForWidth())
        self.media_container.setSizePolicy(sizePolicy)
        self.media_container.setAlignment(Qt.AlignCenter)
        self.media_container.setStyleSheet("background-color: black;")

        self.layout.addWidget(self.media_container)
        self.layout.setContentsMargins(1, 1, 1, 1)
        self.setLayout(self.layout)
        self.area = area
        if any(area):
            self.resize(area[2], area[3])
            self.move(area[0], area[1])
        else:
            self.resize(400, 300)
        self.mouse_pos = [0, 0]
        self.allow_resize_mouse_press = False

        self.pic_image = None
        self.media_container.setScaledContents(False)
        self.media_container.original_resizeEvent = self.media_container.resizeEvent

        def media_container_resizeEvent(event):
            if self.pic_image and isinstance(self.pic_image, QPixmap):
                if self.pic_image.width() > self.media_container.width() - 2 \
                   and self.pic_image.height() > self.media_container.height() - 2:
                    target_width = self.media_container.width() - 2
                    target_height = self.media_container.height() - 2
                else:
                    target_width = self.pic_image.width()
                    target_height = self.pic_image.height()
                scaled_image = self.pic_image.scaled(
                    target_width,
                    target_height,
                    aspectRatioMode=Qt.KeepAspectRatio,
                    transformMode=Qt.FastTransformation)
                self.media_container.setPixmap(scaled_image)
            elif self.pic_image and isinstance(self.pic_image, QMovie):
                if self.pic_image.original_size.width() > self.media_container.width() - 2 \
                   and self.pic_image.original_size.height() > self.media_container.height() - 2:
                    target_width = self.media_container.width() - 2
                    target_height = self.media_container.height() - 2
                else:
                    target_width = self.pic_image.original_size.width()
                    target_height = self.pic_image.original_size.height()
                scaled_size = self.pic_image.original_size.scaled(
                    target_width, target_height, Qt.KeepAspectRatio)
                self.pic_image.setScaledSize(scaled_size)
            else:
                self.media_container.original_resizeEvent(event)

        self.media_container.resizeEvent = media_container_resizeEvent

        self.show()

        self.last_media_path = ""
        self.media_show_completed_notice = None
        # this should be a function to be called like self.stop_media_show()
        self.stop_media_show = lambda: None

        self.gif_completed_notice = threading.Event()

    def show_video(self, path):
        self.stop_media_show()
        self.media_container.clear()
        # some say the winId change all the time...so...
        mplayer_extended.setup(int(self.media_container.winId()))
        self.media_show_completed_notice = mplayer_extended.play(path)
        logger.debug("ext-media-win showed video: %s" % path)
        self.last_media_path = path
        self.stop_media_show = mplayer_extended.stop

    def show_pic(self, path):
        self.stop_media_show()
        self.media_container.clear()
        if not path.lower().endswith(".gif"):
            self.pic_image = QPixmap(path)
            if self.pic_image.width() > self.media_container.width() - 2 \
               and self.pic_image.height() > self.media_container.height() - 2:
                target_width = self.media_container.width() - 2
                target_height = self.media_container.height() - 2
            else:
                target_width = self.pic_image.width()
                target_height = self.pic_image.height()
            scaled_image = self.pic_image.scaled(
                target_width,
                target_height,
                aspectRatioMode=Qt.KeepAspectRatio,
                transformMode=Qt.SmoothTransformation)
            self.media_container.setPixmap(scaled_image)
            logger.debug("ext-media-win showed pic: %s" % path)
            self.stop_media_show = lambda: None
            self.media_show_completed_notice = None
        else:
            self.last_media_path = path
            self.pic_image = QMovie(path, QByteArray(), self)
            if not self.pic_image.isValid():
                self.media_show_completed_notice = None
                return
            self.pic_image.setCacheMode(QMovie.CacheAll)
            self.pic_image.jumpToNextFrame()
            self.pic_image.original_size = self.pic_image.currentPixmap().size(
            )
            if self.pic_image.original_size.width() > self.media_container.width() - 2 \
               and self.pic_image.original_size.height() > self.media_container.height() - 2:
                target_width = self.media_container.width() - 2
                target_height = self.media_container.height() - 2
            else:
                target_width = self.pic_image.original_size.width()
                target_height = self.pic_image.original_size.height()
            scaled_size = self.pic_image.original_size.scaled(
                target_width, target_height, Qt.KeepAspectRatio)
            self.pic_image.setScaledSize(scaled_size)
            self.pic_image.setSpeed(100)
            self.media_container.setMovie(self.pic_image)

            self.media_show_completed_notice = self.gif_completed_notice
            self.media_show_completed_notice.clear()

            def frameChanged_Handler(frameNumber):
                if frameNumber >= self.pic_image.frameCount() - 1:
                    self.pic_image.stop()
                    self.media_show_completed_notice.set()

            self.pic_image.frameChanged.connect(frameChanged_Handler)
            self.pic_image.start()
            logger.debug("ext-media-win showed gif: %s" % path)

            def stop_gif():
                try:
                    self.pic_image.stop()
                    self.media_show_completed_notice.set()
                except Exception:
                    pass

            self.stop_media_show = stop_gif

    def contextMenuEvent(self, event):
        m = QMenu(self)
        item = m.addAction("Stop Media")
        item.triggered.connect(self.stop_media_show)
        item = m.addAction("Exit Media Window")
        item.triggered.connect(self.close)
        m.popup(QCursor.pos())

    def mousePressEvent(self, event):
        self.mouse_pos[0] = event.x()
        self.mouse_pos[1] = event.y()
        if event.globalX() < self.x() + self.frameGeometry().width() - 20 \
           or event.globalY() < self.y() + self.frameGeometry().height() - 20:
            self.allow_resize_mouse_press = True
        else:
            self.allow_resize_mouse_press = True
        super().mousePressEvent(event)

    def mouseReleaseEvent(self, event):
        self.allow_resize_mouse_press = False
        super().mouseReleaseEvent(event)

    def mouseMoveEvent(self, event):
        if self.allow_resize_mouse_press:
            self.move(event.globalX() - self.mouse_pos[0],
                      event.globalY() - self.mouse_pos[1])
        super().mouseMoveEvent(event)

    def mouseDoubleClickEvent(self, event):
        self.setWindowState(self.windowState() ^ Qt.WindowFullScreen)
        super().mouseDoubleClickEvent(event)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_F11:
            self.setWindowState(self.windowState() ^ Qt.WindowFullScreen)
        else:
            super().keyPressEvent(event)

    def closeEvent(self, event):
        self.stop_media_show()
        self.area[0] = self.x()
        self.area[1] = self.y()
        self.area[2] = self.width()
        self.area[3] = self.height()
        event.accept()
Exemple #29
0
class MainWindow(QMainWindow):
    """ Main Application Window"""
    def __init__(self):
        super(MainWindow, self).__init__()
        # event dispatcher
        self.dispatcher = Dispatcher.instance()
        # translations
        self.translate = QtCore.QCoreApplication.translate
        self.interval = 'daily'
        self.hjson_value = None
        # thread which runs rsnapshot
        self.worker = Worker()
        # is rsnapshot still running?
        self.busy = False

        # connect to events
        self.dispatcher.error.connect(self.command_error)
        self.dispatcher.command_complete.connect(self.command_complete)

        # Install the custom output stream
        sys.stdout = EmittingStream(text_written=self.log_command)

        # init ui
        self.init_ui()

    def closeEvent(self, event):
        """ Do not close the app if rsnapshot is still running """
        if not self.busy:
            event.accept()
        else:
            event.ignore()
            QMessageBox.warning(
                self, 'Feed Checker',
                self.translate("MainWindow", "You badass, I'm still running!"),
                QMessageBox.Ok)

    def init_ui(self):
        # styles
        ssh_file = style()
        with open(ssh_file, "r") as fh:
            self.setStyleSheet(fh.read())
        # dimensions and positioning
        self.resize(800, 500)
        self.center()
        # window props
        self.setWindowTitle('Feed Checker')
        self.setWindowIcon(QIcon(icon('icon.png')))
        # system tray icon
        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(QIcon(icon('icon.png')))
        quit_action = QAction(self.translate('MainWindow', 'Quit'), self)
        quit_action.triggered.connect(qApp.quit)
        tray_menu = QMenu()
        tray_menu.addAction(quit_action)
        self.tray_icon.setContextMenu(tray_menu)
        self.tray_icon.show()
        # info
        infoAct = QAction(QIcon(icon('info-icon.png')), 'Exit', self)
        infoAct.triggered.connect(self.open_info_dialog)
        # toolbar
        self.toolbar = self.addToolBar('Toolbar')
        self.toolbar.addAction(infoAct)
        # layout
        self.wid = QWidget(self)
        self.setCentralWidget(self.wid)
        self.main_layout = QVBoxLayout()
        self.main_layout.setSpacing(20)
        self.init_ui_body()
        self.wid.setLayout(self.main_layout)

        # show
        self.show()

    def center(self):
        """ Place the window in the center of the screen """
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def init_ui_body(self):
        """ The ui body """
        # text info (displays rsnapshot output)
        self.text_info = QTextEdit()
        self.text_info.setReadOnly(True)
        self.text_info.setText('choose an hjson file, gringo!')
        # start button
        self.start_button = QLabel('<img src="%s" />' % icon('start-icon.png'))
        self.start_button.mousePressEvent = self.start
        self.start_button.setFixedSize(128, 136)
        # select file
        self.hjson_button = QPushButton(
            self.translate('MainWindow', 'choose hjson file'))
        self.hjson_button.clicked.connect(self.choose_hjson)
        self.hjson_button.setProperty('buttonClass', 'hjsonButton')
        self.hjson_button.setFixedSize(200, 40)
        self.hjson_value_label = QLabel('')
        self.hjson_value_label.setProperty('labelClass', 'hjsonValue')
        # loading icon
        self.loading_movie = QMovie(icon('loader.gif'))
        self.loading = QLabel()
        self.loading.setAlignment(QtCore.Qt.AlignCenter)
        self.loading.setMovie(self.loading_movie)
        self.loading.setHidden(True)

        # add all the stuff to the layout
        self.main_layout.addWidget(self.start_button)
        self.main_layout.addWidget(self.hjson_button)
        self.main_layout.addWidget(self.hjson_value_label)
        self.main_layout.addWidget(self.loading)
        self.main_layout.addWidget(self.text_info)
        self.main_layout.setAlignment(self.start_button, QtCore.Qt.AlignCenter)
        self.main_layout.setAlignment(self.hjson_button, QtCore.Qt.AlignCenter)
        self.main_layout.setAlignment(self.hjson_value_label,
                                      QtCore.Qt.AlignCenter)

    def open_info_dialog(self):
        """ opens the info window """
        info_dialog = InfoDialog()
        info_dialog.exec_()

    def choose_hjson(self):
        fname = QFileDialog.getOpenFileName(
            self, self.translate('MainWindow', 'Open file'),
            os.path.expanduser('~'))

        if fname[0]:
            self.hjson_value = fname[0]
            self.hjson_value_label.setText(self.hjson_value)
            self.text_info.setText(
                'what are you waiting for? Push the button asshole!')

    def start(self, event):
        """ Starts the check if not yet busy """
        if not self.hjson_value:
            QMessageBox.information(
                self, 'Feed Checker',
                self.translate(
                    'MainWindow',
                    'F**k, have you understood you must select an hjson file?'
                ), QMessageBox.Ok)
        elif not self.busy:
            self.set_busy(True)
            self.text_info.setText(
                'starting checking feeds, keep calm and drink water...\n')
            self.worker.run_check(self.hjson_value)

    def log_command(self, text):
        """ Logs sys.stdout in the text field """
        cursor = self.text_info.textCursor()
        cursor.movePosition(QTextCursor.End)
        cursor.insertText(text)
        self.text_info.setTextCursor(cursor)
        self.text_info.ensureCursorVisible()

    def command_error(self, message):
        """ Used to filter rsnapshot errors and perform actions or display
            info in some cases """
        if message == 'error-cannot-find-dest':
            reply = QMessageBox.warning(
                self, 'Feed Checker',
                self.translate('MainWindow', '''An error occurred.'''),
                QMessageBox.Ok)
            if reply == QMessageBox.Ok:
                self.text_info.setText('ready...')

    def command_complete(self, returncode):
        """ rsnapshot command complete """
        self.set_busy(False)
        # success with or without warnings
        if returncode == 0 or returncode == 2:
            # save last sync
            # show success dialog
            text, ok = QInputDialog.getText(
                self, self.translate('MainWindow', 'Ok buddy'),
                self.translate(
                    'MainWindow',
                    'If you want to save the corrected hjson list enter the file path and press enter, otherwise 🖕'
                ))
            if ok:
                corrected_hjson = self.worker.get_corrected_hjson()
                with open(text, 'w') as outfile:
                    json.dump(corrected_hjson,
                              outfile,
                              sort_keys=True,
                              indent=4,
                              ensure_ascii=False)

    def set_busy(self, busy):
        """ Is the application busy? """
        if busy:
            self.hjson_button.setDisabled(True)
            self.loading.setHidden(False)
            self.loading_movie.start()
        else:
            self.hjson_button.setDisabled(False)
            self.loading.setHidden(True)
            self.loading_movie.stop()
        self.busy = busy
class App(QWidget):
    #variables to store folders to backup
    source_folder = None
    destination_folder = None

    def __init__(self):
        super().__init__()
        self.title = 'ROBOCOPY Backup GUI'
        self.left = 10
        self.top = 10
        self.width = 500
        self.height = 500
        self.setWindowIcon(QtGui.QIcon('icon.png'))
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.movie = QMovie('cool.gif')
        self.movie.frameChanged.connect(self.repaint)
        self.movie.start()

        #Colors
        self.setAutoFillBackground(True)
        palette = QPalette()
        palette.setColor(QPalette.ButtonText, Qt.darkCyan)
        palette.setColor(self.backgroundRole(), Qt.darkGray)
        self.setPalette(palette)

        #buttons
        source_button = QPushButton('Source Folder', self)
        destination_button = QPushButton('Destination Folder', self)
        source_button.move(20, 20)
        destination_button.move(140, 20)
        copy_button = QPushButton('Start Copying', self)
        copy_button.move(260, 20)
        done_button = QPushButton('Click to Close', self)
        done_button.move(380, 20)

        source_button.resize(100, 40)
        destination_button.resize(100, 40)
        copy_button.resize(100, 40)
        done_button.resize(100, 40)

        #clicked buttons
        source_button.clicked.connect(self.select_source_folder)
        destination_button.clicked.connect(self.select_destination_folder)
        copy_button.clicked.connect(self.copying)
        done_button.clicked.connect(self.done)

        self.show()

    def select_source_folder(self):
        App.source_folder = QFileDialog.getExistingDirectory(
            self, 'SELECT DIRECTORY').strip()

    def select_destination_folder(self):
        App.destination_folder = QFileDialog.getExistingDirectory(
            self, 'SELECT DIRECTORY').strip()

    def copying(self):
        subprocess.run(
            ["robocopy", App.source_folder, App.destination_folder, "/S"])

    def done(self):
        sys.exit(1)

    def paintEvent(self, event):
        currentFrame = self.movie.currentPixmap()
        frameRect = currentFrame.rect()
        frameRect.moveCenter(self.rect().center())
        if frameRect.intersects(event.rect()):
            painter = QPainter(self)
            painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame)
Exemple #31
0
class WaitForTextOnPage(QDialog):
    """Wait until specific text is present on a page."""

    ACCEPTED = QDialog.Accepted
    REJECTED = QDialog.Rejected
    WAIT_TIME_EXPIRED = 3

    def __init__(self, parent, url, text, wait_time=150, monitor=False):
        """
        Parameters
        ----------
        parent
            The parent of this dialog window.

        url: str
            The url of the page to check for 'text'.

        text: str
            The text to search for on the page.

        wait_time: int
            The time to wait for the text to be present.

            default = 150 seconds

        Returns
        -------
            QDialog.Accepted if the text is found.
            QDialog.Rejected if dialog is cancelled.
            WaitForTextOnPage.WAIT_TIME_EXPIRED if 'wait_time' has elapsed.
        """
        super().__init__(parent)
        settings = QSettings()

        self.url = url
        self.text = text
        self.wait_time = wait_time
        self.monitor = monitor
        self.is_running = False
        self.request_timeout = int(settings.value("main/request_timeout"))
        self.check_interval = 10
        self.check_interval_remaining = self.check_interval

        self.setWindowTitle("Low Amperage Boot")

        self.main_layout = QVBoxLayout()
        self.serial_label_layout = QHBoxLayout()
        self.message_label_layout = QHBoxLayout()

        self.lbl_hourglass = QLabel()
        self.movie_hourglass = QMovie(
            r"laboot\resources\images\animations\activity_green_fast.gif")
        self.lbl_hourglass.setMovie(self.movie_hourglass)
        self.lbl_hourglass.setAlignment(Qt.AlignHCenter)

        self.lbl_serial_detect = QLabel(
            f"Serial number {self.text} was not detected.")
        font = self.lbl_serial_detect.font()
        font.setPointSize(10)
        self.lbl_serial_detect.setFont(font)
        self.lbl_serial_detect.setAlignment(Qt.AlignHCenter)

        text = ("Monitoring collector for refresh of serial numbers."
                if monitor else
                "Waiting for collector to refresh serial numbers.")
        self.lbl_main_message = QLabel(text)
        self.lbl_main_message.setFont(font)
        self.lbl_main_message.setAlignment(Qt.AlignHCenter)

        self.lbl_separator = QLabel("_" * 50)
        self.lbl_separator.setAlignment(Qt.AlignHCenter)

        btns = QDialogButtonBox()
        btns.setStandardButtons(QDialogButtonBox.Cancel)
        btns.rejected.connect(lambda: self.done(WaitForTextOnPage.REJECTED))

        self.main_layout.addWidget(self.lbl_hourglass, Qt.AlignHCenter)

        self.serial_label_layout.addWidget(self.lbl_serial_detect,
                                           Qt.AlignCenter)
        self.main_layout.addLayout(self.serial_label_layout, stretch=1)

        self.message_label_layout.addWidget(self.lbl_main_message,
                                            Qt.AlignCenter)
        self.main_layout.addLayout(self.message_label_layout, stretch=1)

        self.main_layout.addWidget(self.lbl_separator, Qt.AlignCenter)

        self.main_layout.addWidget(btns)

        self.check_page_timer = QTimer(self)
        self.check_page_timer.timeout.connect(self._check_page)

        self.setLayout(self.main_layout)

    def start(self):
        self.open()
        self.is_running = True
        self.movie_hourglass.start()
        self.check_page_timer.start(self.check_interval * 1000)

        # time to spend waiting for the collector to update
        QTimer(self).singleShot(self.wait_time * 1000, self.stop)

    def stop(self):
        self.check_page_timer.stop()
        self.done(WaitForTextOnPage.WAIT_TIME_EXPIRED)

    def _check_page(self):
        in_source: List[str] = self._get_source_as_list(
            self.url, self.request_timeout)
        if self._find(self.text, in_source):
            self.done(WaitForTextOnPage.ACCEPTED)

    @staticmethod
    def _get_source_as_list(url: str, timeout: int = 5) -> List[str]:
        r = requests.get(url, timeout=timeout)
        return r.text.split("\n")

    @staticmethod
    def _find(text: str, source: List[str]) -> bool:
        for line in source:
            if text in line.strip():
                return True

        return False
Exemple #32
0
class InformationWindow(QWidget):

    def __init__(self):
        QWidget.__init__(self, ctx.mainScreen)
        self.setObjectName("InformationWindow")
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.setFixedHeight(50)
        self.setMaximumWidth(800)
        self.setStyleSheet("""
            QFrame#frame { border: 1px solid rgba(255,255,255,30);
                           /*border-radius: 4px;*/
                           background-color: rgba(0,0,0,100);}

            QLabel { border:none;
                     color:#FFFFFF;}

            QProgressBar { border: 1px solid white;}

            QProgressBar::chunk { background-color: #F1610D;
                                  width: 0.5px;}
        """)

        self.gridlayout = QGridLayout(self)
        self.frame = QFrame(self)
        self.frame.setObjectName("frame")
        self.horizontalLayout = QHBoxLayout(self.frame)
        self.horizontalLayout.setContentsMargins(10, 0, 10, 0)

        # Spinner
        self.spinner = QLabel(self.frame)
        self.spinner.setMinimumSize(QSize(16, 16))
        self.spinner.setMaximumSize(QSize(16, 16))
        self.spinner.setIndent(6)
        self.movie = QMovie(':/images/working.mng')
        self.spinner.setMovie(self.movie)
        self.movie.start()
        self.horizontalLayout.addWidget(self.spinner)

        # Message
        self.label = QLabel(self.frame)
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.icon = QLabel(self.frame)
        self.icon.setFixedWidth(16)
        self.icon.setFixedHeight(16)
        self.horizontalLayout.setSpacing(10)
        self.horizontalLayout.addWidget(self.icon)
        self.horizontalLayout.addWidget(self.label)

        self.gridlayout.addWidget(self.frame,0,0,1,1)

    def update(self, message, type=None, spinner=False):
        fontMetric = self.label.fontMetrics()
        textWidth = fontMetric.width(message)

        if type:
            self.icon.show()
            if type == "error":
                self.icon.setPixmap(QPixmap(":/gui/pics/dialog-error.png"))
                self.setStyleSheet(" QFrame#frame {background-color: rgba(255,0,0,100);} ")

            elif type == "warning":
                self.icon.setPixmap(QPixmap(":/gui/pics/dialog-warning.png"))
                self.setStyleSheet(" QFrame#frame {background-color: rgba(0,0,0,100);} ")

            self.setFixedWidth(textWidth + self.icon.width() + 50)
            self.label.setText(message)

        else:
            self.icon.hide()
            self.setStyleSheet(" QFrame#frame {background-color: rgba(0,0,0,100);} ")
            self.setFixedWidth(textWidth + self.icon.width() + 100)
            self.label.setText(message)

        self.spinner.setVisible(spinner)
        self.move(ctx.mainScreen.width()/2 - self.width()/2,
                  ctx.mainScreen.height() - self.height()/2 - 50)

        self.show()

    def refresh(self):
        ctx.mainScreen.processEvents()

    def show(self):
        QWidget.show(self)
        self.refresh()

    def hide(self):
        QWidget.hide(self)
        self.refresh()
Exemple #33
0
class MainGui(QMainWindow, Ui_MainWindow):

    sig_recorder_abort_workers = pyqtSignal()
    sig_inference_abort_workers = pyqtSignal()

    btn_flag = 0

    def __init__(self, parent=None):

        super(MainGui, self).__init__(parent)
        self.setupUi(self)
        self.initial_ui()

        # Make any cross object connections.
        self._connectSignals()
        QThread.currentThread().setObjectName(
            'main')  # threads can be named, useful for log output
        self.__threads = None

    def _connectSignals(self):
        ## 放btn connect function
        self.startBtn.clicked.connect(self.btn_event)
        self.resetBtn.clicked.connect(self.reset_event)

    def initial_ui(self):
        # place the window
        self.move(200, 100)
        self.setWindowTitle('Deepspeech with PyQt')
        # PushButton
        self.startBtn.setEnabled(True)
        # GraphicsView
        self.graphicsView.paused = False
        self.graphicsView.logScale = False
        self.graphicsView.showPeaks = False
        self.graphicsView.downsample = True

        self.graphicsView.p1 = self.graphicsView.addPlot()
        self.graphicsView.p1.setLabel('bottom', 'RowData', 'PCM')
        self.graphicsView.p1.setYRange(0, 300)

        self.infoText.setDisabled(True)
        self.infereceText.setDisabled(True)
        # set start icon
        self.startBtn.setIcon(QtGui.QIcon('record.png'))
        self.startBtn.setIconSize(QtCore.QSize(100, 100))

        # set reset icon
        self.resetBtn.setIcon(QtGui.QIcon('reset.png'))
        self.resetBtn.setIconSize(QtCore.QSize(120, 120))
        self.resetBtn.setDisabled(True)

        # set waiting gif
        self.movie = QMovie("wait.gif", QtCore.QByteArray(), self)

        self.movie.setCacheMode(QtGui.QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.statusLabel.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
                                       QtWidgets.QSizePolicy.Expanding)
        self.movie.setCacheMode(QtGui.QMovie.CacheAll)

        self.statusLabel.setMovie(self.movie)
        self.movie.start()

        self.statusLabel.hide()

    def get_spectrum(self, data):
        T = 1.0 / RATE
        N = data.shape[0]
        Pxx = (1. / N) * np.fft.fft(data)
        f = np.fft.fftfreq(N, T)
        Pxx = np.fft.fftshift(Pxx)
        f = np.fft.fftshift(f)
        return f.tolist(), (np.absolute(Pxx)).tolist()

    def btn_event(self):
        if (self.btn_flag == 0):
            self.btn_flag = 1

            self.startBtn.setIcon(QtGui.QIcon('stop.png'))
            self.startBtn.setIconSize(QtCore.QSize(100, 100))

            self.__threads = []

            # create a recorder object
            record = Recorder()
            record_thread = QThread()
            record_thread.setObjectName('record thread')
            self.__threads.append(
                (record_thread,
                 record))  # need to store worker too otherwise will be gc'd

            record.moveToThread(record_thread)

            # get progress messages from worker:
            record.sig_step.connect(self.on_recorder_worker_step)

            # control worker:
            self.sig_recorder_abort_workers.connect(record.abort)

            # get read to start worker:record

            record_thread.started.connect(record.work)
            record_thread.start(
            )  # this will emit 'started' and start thread's event loop
        else:
            self.btn_flag = 0

            self.startBtn.setIcon(QtGui.QIcon('record.png'))
            self.startBtn.setIconSize(QtCore.QSize(100, 100))

            self.sig_recorder_abort_workers.emit()
            print('Asking each worker to abort')
            for record_thread, record in self.__threads:  # note nice unpacking by Python, avoids indexing
                record_thread.quit(
                )  # this will quit **as soon as thread event loop unblocks**
                record_thread.wait(
                )  # <- so you need to wait for it to *actually* quit
            self.startBtn.setDisabled(True)
            self.statusLabel.show()

            inference = Inference()
            inference_thread = QThread()
            inference_thread.setObjectName('Inference Thread')
            self.__threads.append(
                (inference_thread,
                 inference))  # need to store worker too otherwise will be gc'd

            inference.moveToThread(inference_thread)
            inference.sig_result.connect(self.on_inference_worker_end)

            self.sig_inference_abort_workers.connect(inference.abort)

            inference_thread.started.connect(inference.work)
            inference_thread.start(
            )  # this will emit 'started' and start thread's event loop

    def reset_event(self):

        # stop inference thread
        for inference_thread, inference in self.__threads:  # note nice unpacking by Python, avoids indexing
            inference_thread.quit(
            )  # this will quit **as soon as thread event loop unblocks**
            inference_thread.wait(
            )  # <- so you need to wait for it to *actually* quit

        self.resetBtn.setDisabled(True)
        self.startBtn.setEnabled(True)
        self.infoText.clear()
        self.infoText.setDisabled(True)
        self.infereceText.clear()
        self.infereceText.setDisabled(True)
        self.graphicsView.p1.clear()

    @pyqtSlot(np.ndarray)
    def on_recorder_worker_step(self, r_data):
        # draw gui chart
        f, Pxx = self.get_spectrum(r_data)
        self.graphicsView.p1.plot(x=f, y=Pxx, clear=True)

    @pyqtSlot(str)
    def on_inference_worker_end(self, str):
        self.statusLabel.hide()
        self.infoText.setEnabled(True)
        self.infereceText.setEnabled(True)
        result = str.split('\n')
        print('%%%%%%%%% : ', result[3])
        self.infereceText.setPlainText(result[3])
        self.infoText.setPlainText(str)
        self.resetBtn.setEnabled(True)
Exemple #34
0
class CalculationWindow(QFrame):

    def __init__(self, calc_func: Callable[[Params, CalcTracker], None],
                 back_window: Callable):
        super().__init__()

        self._calc_func = calc_func
        self._back_window = back_window

        self._calc_tracker = CalcTracker()
        self._calc_tracker.finished.connect(self._done_calculation)
        self._calc_tracker.error.connect(self._error_calculation)

        button_bar = QFrame()
        button_layout = QHBoxLayout()
        self._back_button = QPushButton('Back')
        self._back_button.setFixedSize(QSize(100, 30))
        self._back_button.setDisabled(True)
        self._back_button.clicked.connect(self._on_back)
        button_layout.addWidget(self._back_button, alignment=Qt.AlignRight)
        button_bar.setLayout(button_layout)

        self._center_bar = QFrame()

        loading_layout = QVBoxLayout()
        self._loading_label = QLabel()
        self._loading_movie = QMovie(str(LOADING_SPINNER))
        self._loading_label.setMovie(self._loading_movie)
        loading_layout.addWidget(self._loading_label)
        self._center_bar.setLayout(loading_layout)

        layout = QVBoxLayout()
        layout.addWidget(self._center_bar, alignment=Qt.AlignCenter)
        layout.addWidget(button_bar, alignment=Qt.AlignBottom)
        self.setLayout(layout)

    def start(self, params: Params):
        self._loading_label.show()
        self._loading_movie.start()

        self._calc_func(params, self._calc_tracker)

    def _on_back(self):
        self._back_window()

    def _done_calculation(self, result: Result):
        self._loading_movie.stop()
        self._loading_label.hide()
        self._back_button.setDisabled(False)

        group_canvas = self._plot_group_scatter(result)
        graphs_list, canvases = self._plot_group_routes(result)
        all_canvas = self._plot_combined_route(result, graphs_list)

        self._save_graphs(group_canvas, canvases, all_canvas)

        tabs = [('Groups', group_canvas), ('Routes', all_canvas)]
        for i, c in enumerate(canvases):
            tabs.append((f"Route {i}", c))
        self._show_graph_tabs(tabs)

    def _save_graphs(self, group_canvas, route_canvases, all_canvas):
        try:
            if not OUTPUT_PATH.exists():
                OUTPUT_PATH.mkdir()

            for i, canvas in enumerate(route_canvases):
                canvas.fig.savefig(str(OUTPUT_PATH / SINGLE_ROUTE_CANVAS_NAME.format(group_num=i)))
            group_canvas.fig.savefig(str(GROUP_CANVAS_PATH))
            all_canvas.fig.savefig(str(ALL_ROUTES_CANVAS_PATH))
        except Exception as e:
            dialogs.show_error_dialog(self, e)

    def _error_calculation(self, exception: Exception):
        self._loading_movie.stop()
        self._loading_label.hide()

        dialogs.show_error_dialog(self, exception)
        self._on_back()

    def _plot_group_routes(self, result: Result):
        canvases = []
        graphs_list = []
        for group_num, list_of_address_in_short_path in enumerate(result.list_of_address_in_short_path):
            sc = MplCanvas(self, width=5, height=4, dpi=100)
            G = plot_group_route(group_num, list_of_address_in_short_path, sc.axes)
            canvases.append(sc)
            graphs_list.append(G)

        return graphs_list, canvases

    def _plot_combined_route(self, result: Result, graphs_list):
        sc = MplCanvas(self, width=5, height=4, dpi=100)
        plot_combined_route(result, graphs_list, sc.axes)
        return sc

    def _plot_group_scatter(self, result: Result):
        # https://www.learnpyqt.com/tutorials/plotting-matplotlib/
        sc = MplCanvas(self, width=5, height=4, dpi=100)
        plot_group_scatter(result, sc.axes)
        return sc

    def _show_graph_tabs(self, graphs):
        tab_root = QTabWidget()

        # https://pythonspot.com/pyqt5-tabs/
        for name, graph in graphs:
            tab_root.addTab(graph, name)

        layout = QHBoxLayout()
        layout.addWidget(tab_root)
        switch_layout(self._center_bar, layout)
        ui_screen.box76.setPlainText(str(a[8][3]))
        ui_screen.box77.setPlainText(str(a[8][4]))
        ui_screen.box78.setPlainText(str(a[8][5]))
        ui_screen.box79.setPlainText(str(a[8][6]))
        ui_screen.box80.setPlainText(str(a[8][7]))
        ui_screen.box81.setPlainText(str(a[8][8]))
        QMessageBox.information(mainscreen, "Puzzle Solved Successfully",
                                "Sudoku puzzle has been solved")
    else:
        QMessageBox.warning(mainscreen, 'Invalid puzzle',
                            'Provided sudoku puzzle is unsolvable')


if __name__ == "__main__":

    mainscreen.show()
    ui_main.Start_Button.clicked.connect(shownextscreen)
    ui_main.Quit_Button.clicked.connect(app.exit)
    ui_main.About.clicked.connect(showabout)
    ui_screen.pushButton.clicked.connect(startsolving)
    ui_screen.back_button.clicked.connect(solverback)
    ui_screen.clear_button.clicked.connect(clear)

    ui_about.Back_Button.clicked.connect(aboutback)
    loader_img = QMovie("res/bggold.gif")
    ui_main.background.setMovie(loader_img)
    loader_img.setScaledSize(ui_main.background.size())
    loader_img.start()

    sys.exit(app.exec_())
Exemple #36
0
    def __init__(self):

        QMainWindow.__init__(self)
        #        super(MainWindow, self).__init__()

        #        QApplication.processEvents()
        #        QCoreApplication.processEvents()

        self.setFixedSize(1000, 500)
        self.setWindowTitle(" Sound Classification v3.0 ")
        self.setWindowIcon(QIcon("assets/icon.png"))

        # disable the windows title bar.
        #----------------------------------------------------------------------
        #self.setWindowFlags(Qt.FramelessWindowHint)
        #self.setWindowFlags(Qt.CustomizeWindowHint)

        #--------------------------------------------------------------------------------------------
        # This part is for the window postion.
        # At First geometry will be null, so by default the window appear on the center of the screen.
        # Next, when training window get closed the last postion will be saved and in that position
        # this window will appear.
        #--------------------------------------------------------------------------------------------

        self.settings = QSettings(" ", " ")
        if not self.settings.value("geometry") == None:
            self.restoreGeometry(self.settings.value("geometry"))
        if not self.settings.value("windowState") == None:
            self.restoreState(self.settings.value("windowState"))

        # if background image is not available then takin color as background.
        #----------------------------------------------------------------------
        if (os.path.exists('assets/main_background.jpg') == True):
            # Setting background Image.
            oImage = QImage("assets/main_background.jpg")
            sImage = oImage.scaled(QSize(1000, 500))
            palette = QPalette()
            palette.setBrush(10, QBrush(sImage))
            self.setPalette(palette)
        else:
            # Background Color.
            color = QColor("#3484A9")
            self.setAutoFillBackground(True)
            p = self.palette()
            p.setColor(self.backgroundRole(), color)
            self.setPalette(p)

        # defining all labels here.
        #----------------------------------------------------------------------
        self.Label_sbg_title = QLabel(self)
        self.Label_sbg_l = QLabel(self)
        self.Label_sbg_l1 = QLabel(self)
        self.Label_sbg_l2 = QLabel(self)
        self.Label_sbg_l3 = QLabel(self)
        self.Label_sbg_l4 = QLabel(self)
        self.Label_sbg_l11 = QLabel(self)
        self.Label_sbg_l21 = QLabel(self)
        self.Label_sbg_l31 = QLabel(self)
        self.Label_sbg_l41 = QLabel(self)
        self.Label_sbg_x = QLabel(self)
        self.Label_sbg_r = QLabel(self)
        self.Label_sbg_r1 = QLabel(self)
        self.Label_sbg_r2 = QLabel(self)
        self.Label_copyright = QLabel(self)

        self.Label_predict1 = QLabel(self)
        self.Label_accu1 = QLabel(self)
        self.Label_date = QLabel(self)
        self.Label_avg_freq = QLabel(self)
        self.Label_predict11 = QLabel(self)
        self.Label_predict12 = QLabel(self)
        self.Label_predict13 = QLabel(self)
        self.Label_predict14 = QLabel(self)
        self.Label_predict15 = QLabel(self)
        self.button_advance = QPushButton("Go To Advance Settings", self)
        self.button_train = QPushButton("TRAINING", self)
        self.button_stop = QPushButton("STOP", self)
        self.button_start = QPushButton("START", self)

        # setting title text image here 'SOUND CLASSIFICATION'.
        #----------------------------------------------------------------------
        if (os.path.exists('assets/title.png') == True):
            self.Label_title_ani = QLabel(self)
            self.Label_title_ani.resize(900, 150)
            self.Label_title_ani.move(100, 1)
            movie = QMovie("assets/title.png")
            self.Label_title_ani.setMovie(movie)
            movie.start()
        else:
            self.Label_title_ani = QLabel(self)
            self.Label_title_ani.setText("SOUND CLASSIFICATION")
            self.Label_title_ani.setStyleSheet(
                "color:#000000; font-weight:bold; font-size:50px")
            self.Label_title_ani.resize(900, 150)
            self.Label_title_ani.move(170, 1)

        # Defining blur label here.
        #----------------------------------------------------------------------
        self.label_blur_img = QLabel(self)

        # Running the display time here.
        #----------------------------------------------------------------------
        self.threadTimeDisplay()

        # calling init function here.
        #----------------------------------------------------------------------
        self.initUI()

        # calling stylesheet here.
        #----------------------------------------------------------------------
        from Gunshot_Recognition_CSS import styleSheetMain
        self.setStyleSheet(styleSheetMain)
Exemple #37
0
class GitNote(QWidget, GitNoteUi.Ui_Form_note):
    def __init__(self, parent=None):
        super(GitNote, self).__init__(parent)
        self.setupUi(self)
        self.initUi()
        self.show()
        self.updateUiAfterShow()

    def initUi(self):
        if not main.gitExist:
            self.mycloneGit()
        # 界面配置
        self.configfile = os.path.join(main.gitNoteHome, "config.json")
        self.initInterface()
        self.pushButton_update.clicked.connect(self.myupdateGit)
        self.treeWidget_tree.clicked.connect(self.onTreeClicked)
        self.treeWidget_tree.customContextMenuRequested.connect(
            self.menuTreeContextClicked)
        self.listWidget_list.clicked.connect(self.clickedListView)
        self.listWidget_list.customContextMenuRequested.connect(
            self.menuListContextClicked)
        #self.treeWidget_tree.addTopLevelItem(root)
        # set window background color
        self.setAutoFillBackground(True)
        self.listfileDir = main.gitNoteNoteHome
        self.viewfileName = ""
        self.viewTexts = ""
        self.plainTextEdit_markdown.hide()
        self.plainTextEdit_markdown.setTabStopDistance(
            QFontMetricsF(self.plainTextEdit_markdown.font()).width(' ') * 4)
        self.saveStatus = False
        self.createStatus = False
        self.pushButton_save.clicked.connect(self.clickedButtonSave)
        self.plainTextEdit_markdown.textChanged.connect(self.textChangedEdit)
        self.pushButton_save.setEnabled(False)
        self.updateListView(self.listfileDir)
        self.newDirName = ""
        self.pushButton_addpicture.setEnabled(False)
        self.pushButton_addpicture.clicked.connect(self.choosePictures)
        self.insertPictures = []
        # 设置更新图标
        icon = QIcon()
        icon.addPixmap(
            QPixmap(os.path.join(os.path.dirname(__file__), "loading.png")),
            QIcon.Normal, QIcon.Off)
        self.pushButton_update.setIcon(icon)
        saveicon = QIcon()
        saveicon.addPixmap(
            QPixmap(os.path.join(os.path.dirname(__file__), "edit.ico")),
            QIcon.Normal, QIcon.Off)
        self.pushButton_save.setIcon(saveicon)
        addpicturicon = QIcon()
        addpicturicon.addPixmap(
            QPixmap(os.path.join(os.path.dirname(__file__), "addpicture.png")),
            QIcon.Normal, QIcon.Off)
        self.pushButton_addpicture.setIcon(addpicturicon)
        # 保存打开时的文本
        self.oldTexts = ""
        # 更新恢复
        self.movietimer = QTimer(self)
        self.movietimer.start(500)
        self.movietimer.timeout.connect(self.movieTimeout)
        # 配置
        configicon = QIcon()
        configicon.addPixmap(
            QPixmap(os.path.join(os.path.dirname(__file__), "config.ico")),
            QIcon.Normal, QIcon.Off)
        self.toolButton_config.setIcon(configicon)
        toolmenu = QMenu()
        toolmenu.addAction("设置字体", self.setFont)
        toolmenu.addAction("默认主题", self.whiteTheme)
        toolmenu.addAction("暗黑主题", self.blackTheme)
        self.toolButton_config.setMenu(toolmenu)
        self.toolButton_config.setPopupMode(QToolButton.MenuButtonPopup)
        # 转换
        convertico = QIcon(
            os.path.join(os.path.dirname(__file__), "convert.ico"))
        self.toolButton_functions.setIcon(convertico)
        convertmenu = QMenu()
        convertmenu.addAction("另存为pdf文件", self.viewToPdf)
        self.toolButton_functions.setMenu(convertmenu)

    def viewToPdf(self):
        if not self.pushButton_save.isEnabled(
        ) and not self.pushButton_addpicture.isEnabled():
            return
        filename, filetype = QFileDialog.getSaveFileName(
            self, "文件保存", str(pathlib.Path.home()), "PdfFiles (*.pdf)")
        if filename != "":
            if filename[-4:] != '.pdf':
                oldfilename = filename
                filename = filename + '.pdf'
                if os.path.exists(
                        filename) and not os.path.exists(oldfilename):
                    replay = QMessageBox.question(
                        self, "文件覆盖警告",
                        "文件" + os.path.basename(filename) + "已存在,确定覆盖?",
                        QMessageBox.Yes, QMessageBox.No)
                    if replay == QMessageBox.No:
                        return
            markdown = mistune.Markdown()
            pdfkit.from_string(
                '<head><meta charset="UTF-8"></head>' +
                markdown(self.showRealPictures(self.viewTexts)), filename)
            #print(markdown(self.showRealPictures(self.viewTexts)))

    def initInterface(self):
        self.interfacedata = {'theme': 'white'}
        if not os.path.exists(self.configfile):
            self.whiteTheme()
            return
        with open(self.configfile, 'r') as f:
            self.interfacedata = json.load(f)
        if 'theme' in self.interfacedata and self.interfacedata[
                'theme'] == 'black':
            self.blackTheme()
        else:
            self.whiteTheme()
        if 'font' in self.interfacedata:
            font = QFont()
            font.fromString(self.interfacedata['font'])
            self.plainTextEdit_markdown.setFont(font)
            self.textEdit_show.setFont(font)

    def whiteTheme(self):
        self.dirIcon = QIcon(os.path.join(os.path.dirname(__file__),
                                          "dir.ico"))
        self.addTopDirs()
        pBack = self.palette()
        pBack.setColor(self.backgroundRole(), QColor(239, 235, 231))
        self.setPalette(pBack)
        self.treeWidget_tree.setStyleSheet(
            'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)')
        self.listWidget_list.setStyleSheet(
            "QListWidget{background-color: rgb(255, 255, 255);color: rgb(0, 0, 0);}"
            "QListWidget::item { border-bottom: 0.5px dotted black; margin-bottom:10px;}"
            "QListWidget::item:!selected{}"
            "QListWidget::item:selected:active{background:#FFFFFF;color:#19649F;border-width:-1;}"
            "QListWidget::item:selected{background:#FFFFFF;color:#19649F;}")
        self.lineEdit_title.setStyleSheet(
            'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)')
        self.plainTextEdit_markdown.setStyleSheet(
            'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)')
        self.textEdit_show.setStyleSheet(
            'background-color: rgb(255, 255, 255);color: rgb(0, 0, 0)')
        if self.interfacedata['theme'] != 'white':
            self.interfacedata['theme'] = 'white'
            with open(self.configfile, 'w') as f:
                json.dump(self.interfacedata, f)

    def blackTheme(self):
        self.dirIcon = QIcon(
            os.path.join(os.path.dirname(__file__), "blackdir.ico"))
        self.addTopDirs()
        pBack = self.palette()
        pBack.setColor(self.backgroundRole(), QColor(51, 51, 51))
        self.setPalette(pBack)
        self.treeWidget_tree.setStyleSheet(
            'background-color: rgb(51, 51, 51);color: rgb(200, 200, 200);')
        self.listWidget_list.setStyleSheet(
            "QListWidget{background-color: rgb(37, 37, 38);color: rgb(200, 200, 200);}"
            "QListWidget::item { border-bottom: 0.5px dotted white; margin-bottom:10px;}"
        )
        self.lineEdit_title.setStyleSheet(
            'background-color: rgb(30, 30, 30);color: rgb(200, 200, 200)')
        self.plainTextEdit_markdown.setStyleSheet(
            'background-color: rgb(30, 30, 30);color: rgb(200, 200, 200)')
        self.textEdit_show.setStyleSheet(
            'background-color: rgb(30, 30, 30);color: rgb(200, 200, 200)')
        if self.interfacedata['theme'] != 'black':
            self.interfacedata['theme'] = 'black'
            with open(self.configfile, 'w') as f:
                json.dump(self.interfacedata, f)

    def setFont(self):
        font, ok = QFontDialog.getFont()
        if ok:
            self.plainTextEdit_markdown.setFont(font)
            self.textEdit_show.setFont(font)
            self.interfacedata['font'] = font.toString()
            with open(self.configfile, 'w') as f:
                json.dump(self.interfacedata, f)

    def movieTimeout(self):
        global movieStatus
        if movieStatus:
            movieStatus = False
            self.setUpdateBack()

    def closeEvent(self, event):
        if self.saveStatus:
            unsavereturn = self.saveNote(False)
            if not unsavereturn:
                replay = QMessageBox.question(self, "未保存警告",
                                              "有未保存的未命名笔记,确定退出?",
                                              QMessageBox.Yes, QMessageBox.No)
                if replay == QMessageBox.Yes:
                    event.accept()
                    return
                elif replay == QMessageBox.No:
                    event.ignore()
                    return
        #self.saveNote(True)
        event.accept()

    def keyPressEvent(self, event):
        if (event.key() == Qt.Key_O):
            if QApplication.keyboardModifiers() == Qt.ControlModifier:
                self.pushButton_save.clicked.emit()

    def choosePictures(self):
        pictures, ok = QFileDialog.getOpenFileNames(
            self, "选取图片", str(pathlib.Path.home()),
            "Picture Files (*.png | *.jpg | *.jpeg | *.gif | *.ico | *.svg)")
        for eachfile in pictures:
            basenamewith = os.path.basename(eachfile)
            basename, suffix = os.path.splitext(basenamewith)
            i = 0
            while os.path.exists(
                    os.path.join(self.showTextDir,
                                 basename + "-" + str(i) + suffix)):
                i = i + 1
            lastbasename = basename + "-" + str(i) + suffix
            self.insertPictures.append(lastbasename)
            self.plainTextEdit_markdown.insertPlainText("\n![](" +
                                                        lastbasename + ")\n")
            lastname = os.path.join(self.showTextDir, lastbasename)
            shutil.copyfile(eachfile, lastname)
            time.sleep(0.01)

    def moveDirToDir(self):
        dir_choose = QFileDialog.getExistingDirectory(self, "选择目标文件夹",
                                                      main.gitNoteNoteHome)
        if self.listfileDir in dir_choose:
            QMessageBox.information(self, "警告", "文件夹不能移动到当前目录和子目录!",
                                    QMessageBox.Yes)
            return
        targetDir = self.getTargetName(dir_choose,
                                       os.path.basename(self.listfileDir))
        if os.path.exists(self.listfileDir):
            shutil.move(self.listfileDir, targetDir)
        if self.listfileDir in self.viewfileName:
            self.lineEdit_title.clear()
            self.plainTextEdit_markdown.clear()
            self.textEdit_show.clear()
        self.listfileDir = main.gitNoteNoteHome
        self.addTopDirs()
        self.listWidget_list.clear()
        self.pushButton_save.setEnabled(False)

    def deleteDir(self):
        countNotes = 0
        for dirpath, dirnames, filenames in os.walk(self.listfileDir):
            for eachone in filenames:
                if os.path.splitext(eachone)[1] == ".md":
                    countNotes = countNotes + 1
        replay = QMessageBox.warning(
            self, "警告",
            "文件夹 " + os.path.basename(os.path.normpath(self.listfileDir)) +
            "下有" + str(countNotes) + "篇笔记,您确定要删除吗?",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if replay == QMessageBox.Yes and os.path.exists(self.listfileDir):
            shutil.rmtree(self.listfileDir)
            if self.listfileDir in self.viewfileName:
                self.lineEdit_title.clear()
                self.plainTextEdit_markdown.clear()
                self.textEdit_show.clear()
            self.listfileDir = main.gitNoteNoteHome
            self.addTopDirs()
            self.listWidget_list.clear()
            self.pushButton_save.setEnabled(False)

    def getPicturesInOneNote(self, filename):
        pictures = []
        tmpf = open(filename, "r", encoding='UTF-8')
        tmpviewTexts = tmpf.read()
        tmpf.close()
        multilines = tmpviewTexts.split("\n")
        for eachline in multilines:
            if "![](" in eachline and ")" in eachline.split("![](")[1]:
                shotfile = (eachline.split("![](")[1]).split(")")[0]
                realfile = os.path.join(self.listfileDir, shotfile)
                if os.path.exists(realfile):
                    pictures.append(realfile)
        return pictures

    def deleteNote(self):
        if not os.path.exists(self.listmenufilename):
            return
        basename = os.path.basename(self.listmenufilename)
        realname = os.path.splitext(basename)[0]
        replay = QMessageBox.warning(self, "警告",
                                     "您确定要删除笔记 " + realname + " 吗?",
                                     QMessageBox.Yes | QMessageBox.No,
                                     QMessageBox.No)
        if replay == QMessageBox.Yes:
            # 先删除里面的图片
            pictures = self.getPicturesInOneNote(self.listmenufilename)
            for eachpicture in pictures:
                os.remove(eachpicture)
            # 然后删除markdown文件和更新控件显示
            os.remove(self.listmenufilename)
            self.addTopDirs()
            if os.path.exists(self.listfileDir):
                self.updateListView(self.listfileDir)
            if self.listmenufilename.strip() == self.viewfileName.strip():
                self.clearNoteShow()
            self.listmenufilename = ""

    def createRootDir(self):
        newDirName, ok = QInputDialog.getText(self, "创建新文件夹", "文件夹名")
        if len(newDirName) > 0:
            newWholeDirName = os.path.join(main.gitNoteNoteHome, newDirName)
            if not os.path.exists(newWholeDirName):
                os.mkdir(newWholeDirName)
                self.addTopDirs()

    def createDir(self):
        newDirName, ok = QInputDialog.getText(self, "创建新文件夹", "文件夹名")
        if len(newDirName) > 0:
            newWholeDirName = os.path.join(self.listfileDir, newDirName)
            if not os.path.exists(newWholeDirName):
                os.mkdir(newWholeDirName)
                self.addTopDirs()

    def menuListContextClicked(self, pos):
        item = self.listWidget_list.itemAt(pos)
        if item:
            itemCount = item.text()
            filename = (itemCount.split("\n"))[0]
            #self.viewfileName = os.path.join(self.listfileDir, filename)
            #if self.viewfileName[-3:] != ".md":
            #    self.viewfileName = self.viewfileName + ".md"
            self.listmenufilename = os.path.join(self.listfileDir, filename)
            if self.listmenufilename[-3:] != ".md":
                self.listmenufilename = self.listmenufilename + ".md"
            self.listmenu = QMenu()
            self.listmenu.addAction("删除笔记", self.deleteNote)
            self.listmenu.addAction("移动笔记", self.moveNoteToDir)
            self.listmenu.addAction("重命名笔记", self.renameNote)
            self.listmenu.exec_(self.listWidget_list.mapToGlobal(pos))

    def clearNoteShow(self):
        self.pushButton_save.setEnabled(False)
        self.lineEdit_title.clear()
        self.lineEdit_title.setReadOnly(True)
        self.pushButton_addpicture.setEnabled(False)
        self.plainTextEdit_markdown.clear()
        self.plainTextEdit_markdown.hide()
        self.textEdit_show.clear()
        self.viewfileName = ""

    def renameNote(self):
        newname, ok = QInputDialog.getText(self, "笔记重命名", "请输入新名:")
        newname = newname + ".md"
        if ok:
            newfilepath = os.path.join(self.listfileDir, newname)
            if os.path.exists(newfilepath):
                QMessageBox.warning(self, "警告", "笔记已存在,请重新命名", QMessageBox.Yes,
                                    QMessageBox.Yes)
                return
            if os.path.exists(self.listmenufilename):
                shutil.move(self.listmenufilename, newfilepath)
                if self.viewfileName.strip() == self.listmenufilename.strip():
                    realname = os.path.splitext(newname)[0]
                    self.lineEdit_title.setText(realname)
                    self.viewfileName = newfilepath
                if os.path.exists(self.listfileDir):
                    self.updateListView(self.listfileDir)

    def getTargetName(self, targetDir, basenamewith):
        if os.path.exists(os.path.join(targetDir, basenamewith)):
            basename, suffix = os.path.splitext(basenamewith)
            i = 0
            while os.path.exists(
                    os.path.join(targetDir, basename + "-" + str(i) + suffix)):
                i = i + 1
            basenamewith = basename + "-" + str(i) + suffix
        return os.path.join(targetDir, basenamewith)

    def replacePictureName(self, viewTexts, basename, newbasename):
        multilines = viewTexts.split("\n")
        newViewTexts = ""
        for eachline in multilines:
            if "![](" in eachline and ")" in eachline.split("![](")[1] and (
                    eachline.split("![](")[1]).split(")")[0] == basename:
                newViewTexts = newViewTexts + "![](" + newbasename + ")\n"
            else:
                newViewTexts = newViewTexts + eachline + "\n"
        return newViewTexts

    def moveNoteToDir(self):
        dir_choose = QFileDialog.getExistingDirectory(self, "选择目标文件夹",
                                                      main.gitNoteNoteHome)
        if main.gitNoteNoteHome in dir_choose and os.path.dirname(
                self.listmenufilename) != dir_choose:
            # 移动图片
            tmpf = open(self.listmenufilename, "r", encoding='UTF-8')
            tmpviewTexts = tmpf.read()
            tmpf.close()
            pictures = self.getPicturesInOneNote(self.listmenufilename)
            for eachpicture in pictures:
                basename = os.path.basename(eachpicture)
                targetfilename = self.getTargetName(dir_choose, basename)
                if os.path.exists(eachpicture):
                    shutil.move(eachpicture, targetfilename)
                newbasename = os.path.basename(targetfilename)
                tmpviewTexts = self.replacePictureName(tmpviewTexts, basename,
                                                       newbasename)
            tmpf = open(self.listmenufilename, "w", encoding='UTF-8')
            tmpf.write(tmpviewTexts)
            tmpf.close()
            # 移动日记文件
            basename = os.path.basename(self.listmenufilename)
            targetfilename = self.getTargetName(dir_choose, basename)
            if os.path.exists(self.listmenufilename):
                shutil.move(self.listmenufilename, targetfilename)
            if self.viewfileName.strip() == self.listmenufilename.strip():
                self.viewfileName = ""
                self.clearNoteShow()
            self.addTopDirs()
            if os.path.exists(self.listfileDir):
                self.updateListView(self.listfileDir)

    def renameDir(self):
        newname, ok = QInputDialog.getText(self, "笔记重命名", "请输入新名:")
        if ok:
            if self.listfileDir[-1] == '/' or self.listfileDir[-1] == '\\':
                self.listfileDir = self.listfileDir[:-1]
            newDir = os.path.join(os.path.dirname(self.listfileDir), newname)
            if os.path.exists(newDir):
                QMessageBox.warning(self, "警告", "文件夹已存在,请重新命名",
                                    QMessageBox.Yes, QMessageBox.Yes)
                return
            else:
                shutil.move(self.listfileDir, newDir)
                self.listfileDir = newDir
                self.addTopDirs()
                self.updateListView(self.listfileDir)
                self.clearNoteShow()

    def menuTreeContextClicked(self, pos):
        item = self.treeWidget_tree.itemAt(pos)
        if item:
            self.listfileDir = item.text(1)
            self.updateListView(self.listfileDir)
            self.treemenu = QMenu()
            self.treemenu.addAction("新建笔记", self.createNote)
            self.treemenu.addAction("新建日记", self.createDiaryNote)
            self.treemenu.addAction("新建文件夹", self.createDir)
            self.treemenu.addAction("删除文件夹", self.deleteDir)
            self.treemenu.addAction("移动文件夹", self.moveDirToDir)
            self.treemenu.addAction("重命名文件夹", self.renameDir)
            self.treemenu.exec_(self.treeWidget_tree.mapToGlobal(pos))
        else:
            self.listfileDir = main.gitNoteNoteHome
            self.treerootmenu = QMenu()
            self.treerootmenu.addAction("新建Root文件夹", self.createRootDir)
            self.treerootmenu.exec_(self.treeWidget_tree.mapToGlobal(pos))

    def createNote(self):
        self.insertPictures = []
        if self.saveStatus:
            self.saveNote(True)
        self.saveStatus = True
        saveicon = QIcon()
        saveicon.addPixmap(
            QPixmap(os.path.join(os.path.dirname(__file__), "save.ico")),
            QIcon.Normal, QIcon.Off)
        self.pushButton_save.setIcon(saveicon)
        self.pushButton_save.setEnabled(True)
        self.pushButton_addpicture.setEnabled(True)
        self.createStatus = True
        self.lineEdit_title.setReadOnly(False)
        self.lineEdit_title.clear()
        self.plainTextEdit_markdown.clear()
        self.plainTextEdit_markdown.show()
        self.textEdit_show.clear()
        self.lineEdit_title.setFocus()
        self.oldTexts = ""
        self.showTextDir = self.listfileDir

    def createDiaryNote(self):
        today = str(time.strftime("%Y-%m-%d", time.localtime()))
        self.createNote()
        self.lineEdit_title.setText(today)
        self.plainTextEdit_markdown.setFocus()

    def clickedListView(self, qmodelindex):
        item = self.listWidget_list.currentItem()
        if not item:
            return
        if self.saveStatus or self.createStatus:
            self.saveNote(True)
        itemCount = item.text()
        filename = (itemCount.split("\n"))[0]
        self.pushButton_save.setEnabled(True)
        self.viewfileName = os.path.join(self.listfileDir, filename)
        if self.viewfileName[-3:] != ".md":
            self.viewfileName = self.viewfileName + ".md"
        self.lineEdit_title.setText(filename)
        tmpf = open(self.viewfileName, "r", encoding='UTF-8')
        self.viewTexts = tmpf.read()
        tmpf.close()
        self.showTextDir = self.listfileDir
        #self.textEdit_show.setText(markdown2.markdown(self.showRealPictures(self.viewTexts)))
        #self.textEdit_show.setHtml(markdown2.markdown(self.showRealPictures(self.viewTexts)))
        markdown = mistune.Markdown()
        markdownTxt = markdown(self.showRealPictures(self.viewTexts))
        markdownTxt = markdownTxt.replace("\n<", "$&$&$&").strip()
        markdownTxt = markdownTxt.replace("\n", r"<br>")
        markdownTxt = markdownTxt.replace("$&$&$&", "\n<")
        if self.interfacedata['theme'] == 'black':
            markdownTxt = markdownTxt.replace(
                "<code>", r'<code style="color:rgb(0,215,215)">')
        else:
            markdownTxt = markdownTxt.replace(
                "<code>", r'<code style="color:rgb(0,0,255)">')
        self.textEdit_show.setHtml(markdownTxt)
        self.textEdit_show.moveCursor(QTextCursor.Start)

    def showRealPictures(self, inputtext):
        multilines = inputtext.split("\n")
        realtext = ""
        for eachline in multilines:
            if "![](" in eachline and ")" in eachline.split("![](")[1]:
                shotfile = (eachline.split("![](")[1]).split(")")[0]
                realfile = os.path.join(self.showTextDir, shotfile)
                #realtext = realtext + "![](" + realfile + ")\n"
                realtext = realtext + '<img src="' + realfile + '" />\n'
            else:
                realtext = realtext + eachline + "\n"
        return realtext

    def textChangedEdit(self):
        self.viewTexts = self.plainTextEdit_markdown.toPlainText()
        #therealmd = self.showRealPictures(self.viewTexts)
        #self.textEdit_show.clear()
        #self.textEdit_show.setText(markdown2.markdown(therealmd))
        #self.textEdit_show.setHtml(markdown2.markdown(therealmd))
        #renderer = HighlightRenderer()
        #markdown = mistune.Markdown(renderer=renderer)
        markdown = mistune.Markdown()
        markdownTxt = markdown(self.showRealPictures(self.viewTexts))
        markdownTxt = markdownTxt.replace("\n<", "$&$&$&").strip()
        markdownTxt = markdownTxt.replace("\n", r"<br>")
        markdownTxt = markdownTxt.replace("$&$&$&", "\n<")
        if self.interfacedata['theme'] == 'black':
            markdownTxt = markdownTxt.replace(
                "<code>", r'<code style="color:rgb(0,215,215)">')
        else:
            markdownTxt = markdownTxt.replace(
                "<code>", r'<code style="color:rgb(0,0,255)">')
        self.textEdit_show.setHtml(markdownTxt)
        #markdown = mistune.Markdown()
        #self.textEdit_show.setHtml(markdown(self.showRealPictures(self.viewTexts)))
        self.textEdit_show.moveCursor(QTextCursor.End)

    def clickedButtonSave(self):
        if not self.saveStatus:  # 编辑
            if len(self.viewfileName) > 1:
                # 更新已有的图片
                self.insertPictures = []
                multilines = self.viewTexts.split("\n")
                for eachline in multilines:
                    if "![](" in eachline and ")" in eachline.split("![](")[1]:
                        shotfile = (eachline.split("![](")[1]).split(")")[0]
                        self.insertPictures.append(shotfile)

                self.saveStatus = True
                self.plainTextEdit_markdown.setPlainText(self.viewTexts)
                self.plainTextEdit_markdown.show()
                saveicon = QIcon()
                saveicon.addPixmap(
                    QPixmap(os.path.join(os.path.dirname(__file__),
                                         "save.ico")), QIcon.Normal, QIcon.Off)
                self.pushButton_save.setIcon(saveicon)
                self.pushButton_addpicture.setEnabled(True)
                self.oldTexts = self.viewTexts
        else:  #保存
            self.pushButton_addpicture.setEnabled(False)
            self.saveNote(True)
            self.textEdit_show.moveCursor(QTextCursor.Start)

    def saveNote(self, checkwarning):
        if len(self.lineEdit_title.text()) < 1:
            if checkwarning:
                QMessageBox.information(self, "警告", "请输入记录名!", QMessageBox.Yes)
            return False
        if self.createStatus:
            self.viewfileName = os.path.join(
                self.showTextDir,
                self.lineEdit_title.text().strip())
            self.lineEdit_title.setReadOnly(True)
            if self.viewfileName[-3:] != ".md":
                self.viewfileName = self.viewfileName + ".md"
        self.saveStatus = False
        self.plainTextEdit_markdown.hide()
        saveicon = QIcon()
        saveicon.addPixmap(
            QPixmap(os.path.join(os.path.dirname(__file__), "edit.ico")),
            QIcon.Normal, QIcon.Off)
        self.pushButton_save.setIcon(saveicon)
        self.lineEdit_title.setReadOnly(True)
        if len(self.viewfileName) > 1:
            if not self.createStatus and self.oldTexts == self.viewTexts:
                return True
            tmpf = open(self.viewfileName, "w", encoding='UTF-8')
            tmpf.write(self.viewTexts)
            tmpf.close()
            self.updateListView(self.listfileDir)
            #pictures
            for eachpicture in self.insertPictures:
                if eachpicture not in self.viewTexts and os.path.exists(
                        os.path.join(self.listfileDir, eachpicture)):
                    os.remove(os.path.join(self.listfileDir, eachpicture))
            #self.treeWidget_tree.clear()
            #self.updateTreeItemName()
        if self.createStatus:
            self.createStatus = False
            self.addTopDirs()
        return True

    def updateUiAfterShow(self):
        self.treeWidget_tree.setColumnWidth(0, 100)

    def mycloneGit(self):
        if not main.gitExist:
            self.movie = QMovie(
                os.path.join(os.path.dirname(__file__), "loading.gif"),
                QByteArray(), self)
            self.movie.frameChanged.connect(self.setButtonIcon)
            self.movie.start()
            main.updateStatus = True
            self.cloneThread = CloneThread()
            self.cloneThread.start()

    def myupdateGit(self):
        if main.updateStatus:
            return
        else:
            main.updateStatus = True
        self.setUpdateStatus()
        self.updateThread = UpdateThread()
        self.updateThread.start()

    def setUpdateBack(self):
        self.movie = None
        icon = QIcon()
        icon.addPixmap(
            QPixmap(os.path.join(os.path.dirname(__file__), "loading.png")),
            QIcon.Normal, QIcon.Off)
        self.pushButton_update.setIcon(icon)
        self.addTopDirs()
        self.treeWidget_tree.expandAll()
        main.updateStatus = False
        #self.pushButton_update.setText("更新")

    def setButtonIcon(self):
        if self.movie:
            self.pushButton_update.setIcon(QIcon(self.movie.currentPixmap()))

    def setUpdateStatus(self):
        self.movie = QMovie(
            os.path.join(os.path.dirname(__file__), "loading.gif"),
            QByteArray(), self)
        self.movie.frameChanged.connect(self.setButtonIcon)
        self.movie.start()
        #self.pushButton_update.setText("更新中")

    def addTopDirs(self):
        self.treeWidget_tree.clear()
        files = os.listdir(main.gitNoteNoteHome)
        for eachone in files:
            eachone_d = os.path.join(main.gitNoteNoteHome, eachone)
            if os.path.isdir(eachone_d) and eachone[0] != '.':
                item = QTreeWidgetItem(self.treeWidget_tree)
                countMd = self.countMdFiles(eachone_d)
                dirName = eachone
                if countMd > 0:
                    dirName = eachone + " (" + str(countMd) + ")"
                item.setText(0, dirName)
                item.setText(1, eachone_d)
                item.setIcon(0, self.dirIcon)
                self.showDirs(eachone_d, item)
        self.treeWidget_tree.expandAll()

    def showDirs(self, filepath, item):
        files = os.listdir(filepath)
        for eachone in files:
            eachone_d = os.path.join(filepath, eachone)
            if os.path.isdir(eachone_d) and eachone[0] != '.':
                childitem = QTreeWidgetItem(item)
                countMd = self.countMdFiles(eachone_d)
                dirName = eachone
                if countMd > 0:
                    dirName = eachone + " (" + str(countMd) + ")"
                childitem.setText(0, dirName)
                childitem.setText(1, eachone_d)
                childitem.setIcon(0, self.dirIcon)
                self.showDirs(eachone_d, childitem)

    def updateTreeItemName(self):
        baseName = self.treeItem.text(0).split('(')[0]
        countMd = self.countMdFiles(self.treeItem.text(1))
        dirName = baseName
        if countMd > 0:
            dirName = dirName + " (" + str(countMd) + ")"
        self.treeItem.setText(0, dirName)

    def countMdFiles(self, filepath):
        files = os.listdir(filepath)
        number = 0
        for eachone in files:
            eachone_d = os.path.join(filepath, eachone)
            if not os.path.isdir(eachone_d) and eachone_d[-3:] == ".md":
                number = number + 1
        return number

    def onTreeClicked(self, qmodelindex):
        self.treeItem = self.treeWidget_tree.currentItem()
        if self.treeItem.text(1) != self.listfileDir:
            self.listfileDir = self.treeItem.text(1)
            self.updateListView(self.listfileDir)

    def updateListView(self, fileDir):
        self.listWidget_list.clear()
        if fileDir == main.gitNoteNoteHome:
            return
        self.fileList = self.traverseDir(fileDir)
        for eachone in self.fileList:
            tmpitem = QListWidgetItem(eachone[0])
            #if len(eachone[2]) > 1:
            #    tmpitem.setIcon(QIcon(eachone[2]))
            #tmpitem.setTextAlignment(Qt.AlignLeft)
            #tmpitem.setSizeHint(QSize(150, 100))
            self.listWidget_list.addItem(tmpitem)

    def traverseDir(self, filepath):
        files = os.listdir(filepath)
        fileList = []
        for eachone in files:
            eachone_d = os.path.join(filepath, eachone)
            if not os.path.isdir(eachone_d) and eachone_d[-3:] == ".md":
                tmpfileinfo = []
                tmpfileinfo.append(eachone[:-3] + "\n" +
                                   self.read20words(eachone_d))
                tmpfileinfo.append(os.path.getmtime(eachone_d))
                #tmpfileinfo.append(self.addPictureToList(eachone_d))
                fileList.append(tmpfileinfo)
        if len(fileList) > 1:
            fileList.sort(key=operator.itemgetter(1), reverse=True)
        return fileList

    def addPictureToList(self, filepath):
        returnStr = " "
        readHandle = open(filepath, "r", encoding='UTF-8')
        while True:
            oneline = readHandle.readline()
            if oneline:
                if "![](" in oneline and ")" in oneline.split("![](")[1]:
                    shotfile = (oneline.split("![](")[1]).split(")")[0]
                    realfile = os.path.join(self.listfileDir, shotfile)
                    if os.path.exists(realfile):
                        returnStr = realfile
            else:
                break
        readHandle.close()
        return returnStr

    def read20words(self, filepath):
        returnStr = ""
        readHandle = open(filepath, "r", encoding='UTF-8')
        while True:
            oneline = readHandle.readline()
            returnStr = returnStr + oneline.strip()
            if oneline and len(returnStr) < 20:
                oneline = readHandle.readline()
                returnStr = returnStr + oneline.strip()
            else:
                break
        readHandle.close()
        if len(returnStr) > 10:
            returnStr = returnStr[:10] + "\n" + returnStr[10:]
        returnStr = returnStr + "\n" + self.timeStampToTime(
            os.path.getmtime(filepath))
        return returnStr

    def timeStampToTime(self, timestamp):
        timeStruct = time.localtime(timestamp)
        return time.strftime("%Y-%m-%d %H:%M:%S", timeStruct)
Exemple #38
0
class SystemTrayIcon(QMainWindow):
    def __init__(self, parent=None):
        super(SystemTrayIcon, self).__init__(parent)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.settings = QSettings()
        self.language = self.settings.value('Language') or ''
        self.temp_decimal_bool = self.settings.value('Decimal') or False
        # initialize the tray icon type in case of first run: issue#42
        self.tray_type = self.settings.value('TrayType') or 'icon&temp'
        cond = conditions.WeatherConditions()
        self.temporary_city_status = False
        self.conditions = cond.trans
        self.clouds = cond.clouds
        self.wind = cond.wind
        self.wind_dir = cond.wind_direction
        self.wind_codes = cond.wind_codes
        self.inerror = False
        self.tentatives = 0
        self.baseurl = 'http://api.openweathermap.org/data/2.5/weather?id='
        self.accurate_url = 'http://api.openweathermap.org/data/2.5/find?q='
        self.forecast_url = ('http://api.openweathermap.org/data/2.5/forecast/'
                             'daily?id=')
        self.day_forecast_url = ('http://api.openweathermap.org/data/2.5/'
                                 'forecast?id=')
        self.wIconUrl = 'http://openweathermap.org/img/w/'
        apikey = self.settings.value('APPID') or ''
        self.appid = '&APPID=' + apikey
        self.forecast_icon_url = self.wIconUrl
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.refresh)
        self.menu = QMenu()
        self.citiesMenu = QMenu(self.tr('Cities'))
        self.tempCityAction = QAction(self.tr('&Temporary city'), self)
        self.refreshAction = QAction(self.tr('&Update'), self)
        self.settingsAction = QAction(self.tr('&Settings'), self)
        self.aboutAction = QAction(self.tr('&About'), self)
        self.exitAction = QAction(self.tr('Exit'), self)
        self.exitAction.setIcon(QIcon(':/exit'))
        self.aboutAction.setIcon(QIcon(':/info'))
        self.refreshAction.setIcon(QIcon(':/refresh'))
        self.settingsAction.setIcon(QIcon(':/configure'))
        self.tempCityAction.setIcon(QIcon(':/tempcity'))
        self.citiesMenu.setIcon(QIcon(':/bookmarks'))
        self.menu.addAction(self.settingsAction)
        self.menu.addAction(self.refreshAction)
        self.menu.addMenu(self.citiesMenu)
        self.menu.addAction(self.tempCityAction)
        self.menu.addAction(self.aboutAction)
        self.menu.addAction(self.exitAction)
        self.settingsAction.triggered.connect(self.config)
        self.exitAction.triggered.connect(qApp.quit)
        self.refreshAction.triggered.connect(self.manual_refresh)
        self.aboutAction.triggered.connect(self.about)
        self.tempCityAction.triggered.connect(self.tempcity)
        self.systray = QSystemTrayIcon()
        self.systray.setContextMenu(self.menu)
        self.systray.activated.connect(self.activate)
        self.systray.setIcon(QIcon(':/noicon'))
        self.systray.setToolTip(self.tr('Searching weather data...'))
        self.notification = ''
        self.notification_temp = 0
        self.notifications_id = ''
        self.systray.show()
        # The dictionnary has to be intialized here. If there is an error
        # the program couldn't become functionnal if the dictionnary is
        # reinitialized in the weatherdata method
        self.weatherDataDico = {}
        # The traycolor has to be initialized here for the case when we cannot
        # reach the tray method (case: set the color at first time usage)
        self.traycolor = ''
        self.refresh()

    def icon_loading(self):
        self.gif_loading = QMovie(":/loading")
        self.gif_loading.frameChanged.connect(self.update_gif)
        self.gif_loading.start()

    def update_gif(self):
        gif_frame = self.gif_loading.currentPixmap()
        self.systray.setIcon(QIcon(gif_frame))

    def manual_refresh(self):
        self.tentatives = 0
        self.refresh()

    def cities_menu(self):
        # Don't add the temporary city in the list
        if self.temporary_city_status:
            return
        self.citiesMenu.clear()
        cities = self.settings.value('CityList') or []
        if type(cities) is str:
            cities = eval(cities)
        try:
            current_city = (self.settings.value('City') + '_' +
                        self.settings.value('Country') + '_' +
                        self.settings.value('ID'))
        except:
            # firsttime run,if clic cancel in setings without any city configured
            pass
        # Prevent duplicate entries
        try:
            city_toadd = cities.pop(cities.index(current_city))
        except:
            city_toadd = current_city
        finally:
            cities.insert(0, city_toadd)
        # If we delete all cities it results to a '__'
        if (cities is not None and cities != '' and cities != '[]' and
                cities != ['__']):
            if type(cities) is not list:
                # FIXME sometimes the list of cities is read as a string (?)
                # eval to a list
                cities = eval(cities)
            # Create the cities list menu
            for city in cities:
                action = QAction(city, self)
                action.triggered.connect(partial(self.changecity, city))
                self.citiesMenu.addAction(action)
        else:
            self.empty_cities_list()

    @pyqtSlot(str)
    def changecity(self, city):
        cities_list = self.settings.value('CityList')
        logging.debug('Cities' + str(cities_list))
        if cities_list is None:
            self.empty_cities_list()
        if type(cities_list) is not list:
            # FIXME some times is read as string (?)
            cities_list = eval(cities_list)
        prev_city = (self.settings.value('City') + '_' +
                     self.settings.value('Country') + '_' +
                     self.settings.value('ID'))
        citytoset = ''
        # Set the chosen city as the default
        for town in cities_list:
            if town == city:
                ind = cities_list.index(town)
                citytoset = cities_list[ind]
                citytosetlist = citytoset.split('_')
                self.settings.setValue('City', citytosetlist[0])
                self.settings.setValue('Country', citytosetlist[1])
                self.settings.setValue('ID', citytosetlist[2])
                if prev_city not in cities_list:
                    cities_list.append(prev_city)
                self.settings.setValue('CityList', cities_list)
                logging.debug(cities_list)
        self.refresh()

    def empty_cities_list(self):
        self.citiesMenu.addAction(self.tr('Empty list'))

    def refresh(self):
        self.inerror = False
        self.window_visible = False
        self.systray.setIcon(QIcon(':/noicon'))
        if hasattr(self, 'overviewcity'):
            # if visible, it has to ...remain visible
            # (try reason) Prevent C++ wrapper error
            try:
                if not self.overviewcity.isVisible():
                    # kills the reference to overviewcity
                    # in order to be refreshed
                    self.overviewcity.close()
                    del self.overviewcity
                else:
                    self.overviewcity.close()
                    self.window_visible = True
            except:
                pass
        self.systray.setToolTip(self.tr('Fetching weather data ...'))
        self.city = self.settings.value('City') or ''
        self.id_ = self.settings.value('ID') or None
        if self.id_ is None:
            # Clear the menu, no cities configured
            self.citiesMenu.clear()
            self.empty_cities_list()
            # Sometimes self.overviewcity is in namespace but deleted
            try:
                self.overviewcity.close()
            except:
                e = sys.exc_info()[0]
                logging.error('Error closing overviewcity: ' + str(e))
                pass
            self.timer.singleShot(2000, self.firsttime)
            self.id_ = ''
            self.systray.setToolTip(self.tr('No city configured'))
            return
        # A city has been found, create the cities menu now
        self.cities_menu()
        self.country = self.settings.value('Country') or ''
        self.unit = self.settings.value('Unit') or 'metric'
        self.suffix = ('&mode=xml&units=' + self.unit + self.appid)
        self.interval = int(self.settings.value('Interval') or 30)*60*1000
        self.timer.start(self.interval)
        self.update()

    def firsttime(self):
        self.temp = ''
        self.wIcon = QPixmap(':/noicon')
        self.systray.showMessage(
            'meteo-qt:\n', self.tr('No city has been configured yet.') +
            '\n' + self.tr('Right click on the icon and click on Settings.'))

    def update(self):
        if hasattr(self, 'downloadThread'):
            if self.downloadThread.isRunning():
                logging.debug('remaining thread...')
                return
        logging.debug('Update...')
        self.icon_loading()
        self.wIcon = QPixmap(':/noicon')
        self.downloadThread = Download(
            self.wIconUrl, self.baseurl, self.forecast_url,
            self.day_forecast_url, self.id_, self.suffix)
        self.downloadThread.wimage['PyQt_PyObject'].connect(self.makeicon)
        self.downloadThread.finished.connect(self.tray)
        self.downloadThread.xmlpage['PyQt_PyObject'].connect(self.weatherdata)
        self.downloadThread.forecast_rawpage.connect(self.forecast)
        self.downloadThread.day_forecast_rawpage.connect(self.dayforecast)
        self.downloadThread.uv_signal.connect(self.uv)
        self.downloadThread.error.connect(self.error)
        self.downloadThread.done.connect(self.done, Qt.QueuedConnection)
        self.downloadThread.start()

    def uv(self, value):
        self.uv_coord = value

    def forecast(self, data):
        self.forecast_data = data

    def dayforecast(self, data):
        self.dayforecast_data = data

    def instance_overviewcity(self):
        try:
            self.inerror = False
            if hasattr(self, 'overviewcity'):
                logging.debug('Deleting overviewcity instance...')
                del self.overviewcity
            self.overviewcity = overview.OverviewCity(
                self.weatherDataDico, self.wIcon, self.forecast_data,
                self.dayforecast_data, self.unit, self.forecast_icon_url,
                self.uv_coord, self)
            self.overviewcity.closed_status_dialogue.connect(self.remove_object)
        except:
            self.inerror = True
            e = sys.exc_info()[0]
            logging.error('Error: ' + str(e))
            logging.debug('Try to create the city overview...\nAttempts: ' +
                          str(self.tentatives))
            return 'error'

    def remove_object(self):
        del self.overviewcity

    def done(self, done):
        if done == 0:
            self.inerror = False
        elif done == 1:
            self.inerror = True
            logging.debug('Trying to retrieve data ...')
            self.timer.singleShot(10000, self.try_again)
            return
        if hasattr(self, 'updateicon'):
            # Keep a reference of the image to update the icon in overview
            self.wIcon = self.updateicon
        if hasattr(self, 'forecast_data'):
            if hasattr(self, 'overviewcity'):
                # Update also the overview dialog if open
                if self.overviewcity.isVisible():
                    # delete dialog to prevent memory leak
                    self.overviewcity.close()
                    self.instance_overviewcity()
                    self.overview()
            elif self.window_visible is True:
                self.instance_overviewcity()
                self.overview()
            else:
                self.inerror = True
                self.try_create_overview()
        else:
            self.try_again()

    def try_create_overview(self):
        logging.debug('Tries to create overview :' + str(self.tentatives))
        instance = self.instance_overviewcity()
        if instance == 'error':
            self.inerror = True
            self.refresh()
        else:
            self.tentatives = 0
            self.inerror = False
            self.tooltip_weather()

    def try_again(self):
        self.nodata_message()
        logging.debug('Attempts: ' + str(self.tentatives))
        self.tentatives += 1
        self.timer.singleShot(5000, self.refresh)

    def nodata_message(self):
        nodata = QCoreApplication.translate(
            "Tray icon", "Searching for weather data...",
            "Tooltip (when mouse over the icon")
        self.systray.setToolTip(nodata)
        self.notification = nodata

    def error(self, error):
        logging.error('Error:\n' + str(error))
        self.nodata_message()
        self.timer.start(self.interval)
        self.inerror = True

    def makeicon(self, data):
        image = QImage()
        image.loadFromData(data)
        self.wIcon = QPixmap(image)
        # Keep a reference of the image to update the icon in overview
        self.updateicon = self.wIcon

    def weatherdata(self, tree):
        if self.inerror:
            return
        self.tempFloat = tree[1].get('value')
        self.temp = ' ' + str(round(float(self.tempFloat))) + '°'
        self.temp_decimal = '{0:.1f}'.format(float(self.tempFloat)) + '°'
        self.meteo = tree[8].get('value')
        meteo_condition = tree[8].get('number')
        try:
            self.meteo = self.conditions[meteo_condition]
        except:
            logging.debug('Cannot find localisation string for'
                          'meteo_condition:' + str(meteo_condition))
            pass
        clouds = tree[5].get('name')
        clouds_percent = tree[5].get('value') + '%'
        try:
            clouds = self.clouds[clouds]
            clouds = self.conditions[clouds]
        except:
            logging.debug('Cannot find localisation string for clouds:' +
                          str(clouds))
            pass
        wind = tree[4][0].get('name').lower()
        try:
            wind = self.wind[wind]
            wind = self.conditions[wind]
        except:
            logging.debug('Cannot find localisation string for wind:' +
                          str(wind))
            pass
        wind_codes = tree[4][2].get('code')
        try:
            wind_codes = self.wind_codes[wind_codes]
        except:
            logging.debug('Cannot find localisation string for wind_codes:' +
                          str(wind_codes))
            pass
        wind_dir = tree[4][2].get('name')
        try:
            wind_dir = self.wind_dir[tree[4][2].get('code')]
        except:
            logging.debug('Cannot find localisation string for wind_dir:' +
                          str(wind_dir))
            pass
        self.city_weather_info = (self.city + ' ' + self.country + ' ' +
                                  self.temp_decimal + ' ' + self.meteo)
        self.tooltip_weather()
        self.notification = self.city_weather_info
        self.weatherDataDico['City'] = self.city
        self.weatherDataDico['Country'] = self.country
        self.weatherDataDico['Temp'] = self.tempFloat + '°'
        self.weatherDataDico['Meteo'] = self.meteo
        self.weatherDataDico['Humidity'] = (tree[2].get('value'),
                                            tree[2].get('unit'))
        self.weatherDataDico['Wind'] = (
            tree[4][0].get('value'), wind, str(int(float(tree[4][2].get('value')))),
            wind_codes, wind_dir)
        self.weatherDataDico['Clouds'] = (clouds_percent + ' ' + clouds)
        self.weatherDataDico['Pressure'] = (tree[3].get('value'),
                                            tree[3].get('unit'))
        self.weatherDataDico['Humidity'] = (tree[2].get('value'),
                                            tree[2].get('unit'))
        self.weatherDataDico['Sunrise'] = tree[0][2].get('rise')
        self.weatherDataDico['Sunset'] = tree[0][2].get('set')
        rain_value = tree[7].get('value')
        if rain_value == None:
            rain_value = ''
        self.weatherDataDico['Precipitation'] = (tree[7].get('mode'), rain_value)

    def tooltip_weather(self):
        self.systray.setToolTip(self.city_weather_info)

    def tray(self):
        temp_decimal = eval(self.settings.value('Decimal') or 'False')
        try:
            if temp_decimal:
                temp_tray = self.temp_decimal
            else:
                temp_tray = self.temp
        except:
            # First time launch
            return
        if self.inerror or not hasattr(self, 'temp'):
            logging.critical('Cannot paint icon!')
            if hasattr(self, 'overviewcity'):
                try:
                    # delete dialog to prevent memory leak
                    self.overviewcity.close()
                except:
                    pass
            return
        try:
            self.gif_loading.stop()
        except:
            # In first time run the gif is not animated
            pass
        logging.debug('Paint tray icon...')
        # Place empty.png here to initialize the icon
        # don't paint the T° over the old value
        icon = QPixmap(':/empty')
        self.traycolor = self.settings.value('TrayColor') or ''
        self.fontsize = self.settings.value('FontSize') or '18'
        self.tray_type = self.settings.value('TrayType') or 'icon&temp'
        pt = QPainter()
        pt.begin(icon)
        if self.tray_type != 'temp':
            pt.drawPixmap(0, -12, 64, 64, self.wIcon)
        pt.setFont(QFont('sans-sertif', int(self.fontsize)))
        pt.setPen(QColor(self.traycolor))
        if self.tray_type == 'icon&temp':
            pt.drawText(icon.rect(), Qt.AlignBottom | Qt.AlignCenter,
                        str(temp_tray))
        if self.tray_type == 'temp':
            pt.drawText(icon.rect(), Qt.AlignCenter, str(temp_tray))
        pt.end()
        if self.tray_type == 'icon':
            self.systray.setIcon(QIcon(self.wIcon))
        else:
            self.systray.setIcon(QIcon(icon))
        try:
            if not self.overviewcity.isVisible():
                notifier = self.settings.value('Notifications') or 'True'
                notifier = eval(notifier)
                if notifier:
                    temp = int(re.search('\d+', self.temp_decimal).group())
                    if temp != self.notification_temp or self.id_ != self.notifications_id:
                        self.notifications_id = self.id_
                        self.notification_temp = temp
                        self.systray.showMessage('meteo-qt', self.notification)
        except:
            logging.debug('OverviewCity has been deleted' +
                          'Download weather information again...')
            self.try_again()
            return
        self.restore_city()
        self.tentatives = 0
        self.tooltip_weather()
        logging.info('Actual weather status for: ' + self.notification)

    def restore_city(self):
        if self.temporary_city_status:
            logging.debug('Restore the default settings (city)' +
                          'Forget the temporary city...')
            for e in ('ID', self.id_2), ('City', self.city2), ('Country', self.country2):
                self.citydata(e)
            self.temporary_city_status = False

    def activate(self, reason):
        if reason == 3:
            if self.inerror or self.id_ is None or self.id_ == '':
                return
            try:
                if hasattr(self, 'overviewcity') and self.overviewcity.isVisible():
                    self.overviewcity.hide()
                else:
                    self.overviewcity.hide()
                    # If dialog closed by the "X"
                    self.done(0)
                    self.overview()
            except:
                self.done(0)
                self.overview()
        elif reason == 1:
            self.menu.popup(QCursor.pos())

    def overview(self):
        if self.inerror or len(self.weatherDataDico) == 0:
            return
        self.overviewcity.show()

    def config_save(self):
        logging.debug('Config saving...')
        city = self.settings.value('City'),
        id_ = self.settings.value('ID')
        country = self.settings.value('Country')
        unit = self.settings.value('Unit')
        traycolor = self.settings.value('TrayColor')
        tray_type = self.settings.value('TrayType')
        fontsize = self.settings.value('FontSize')
        language = self.settings.value('Language')
        decimal = self.settings.value('Decimal')
        self.appid = '&APPID=' + self.settings.value('APPID') or ''
        if language != self.language and language is not None:
            self.systray.showMessage('meteo-qt:',QCoreApplication.translate(
                    "System tray notification",
                    "The application has to be restarted to apply the language setting", ''))
            self.language = language
        # Check if update is needed
        if traycolor is None:
            traycolor = ''
        if (self.traycolor != traycolor or self.tray_type != tray_type or
                self.fontsize != fontsize or decimal != self.temp_decimal):
            self.tray()
        if (city[0] == self.city and
           id_ == self.id_ and
           country == self.country and
           unit == self.unit):
            return
        else:
            logging.debug('Apply changes from settings...')
            self.refresh()

    def config(self):
        dialog = settings.MeteoSettings(self.accurate_url, self.appid, self)
        dialog.applied_signal.connect(self.config_save)
        if dialog.exec_() == 1:
            self.config_save()
            logging.debug('Update Cities menu...')
            self.cities_menu()

    def tempcity(self):
        # Prevent to register a temporary city
        # This happen when a temporary city is still loading
        self.restore_city()
        dialog = searchcity.SearchCity(self.accurate_url, self.appid, self)
        self.id_2, self.city2, self.country2 = (self.settings.value('ID'),
                                                self.settings.value('City'),
                                                self.settings.value('Country'))
        dialog.id_signal[tuple].connect(self.citydata)
        dialog.city_signal[tuple].connect(self.citydata)
        dialog.country_signal[tuple].connect(self.citydata)
        if dialog.exec_():
            self.temporary_city_status = True
            self.systray.setToolTip(self.tr('Fetching weather data...'))
            self.refresh()

    def citydata(self, what):
        self.settings.setValue(what[0], what[1])
        logging.debug('write ' + str(what[0]) + ' ' + str(what[1]))

    def about(self):
        title = self.tr("""<b>meteo-qt</b> v{0}
            <br/>License: GPLv3
            <br/>Python {1} - Qt {2} - PyQt {3} on {4}""").format(
                __version__, platform.python_version(),
                QT_VERSION_STR, PYQT_VERSION_STR, platform.system())
        image = ':/logo'
        text = self.tr("""<p>Author: Dimitrios Glentadakis <a href="mailto:[email protected]">[email protected]</a>
                        <p>A simple application showing the weather status
                        information on the system tray.
                        <p>Website: <a href="https://github.com/dglent/meteo-qt">
                        https://github.com/dglent/meteo-qt</a>
                        <br/>Data source: <a href="http://openweathermap.org/">
                        OpenWeatherMap</a>.
                        <br/>This software uses icons from the
                        <a href="http://www.kde.org/">Oxygen Project</a>.
                        <p>To translate meteo-qt in your language or contribute to
                        current translations, you can use the
                        <a href="https://www.transifex.com/projects/p/meteo-qt/">
                        Transifex</a> platform.
                        <p>If you want to report a dysfunction or a suggestion,
                        feel free to open an issue in <a href="https://github.com/dglent/meteo-qt/issues">
                        github</a>.""")

        contributors = QCoreApplication.translate("About dialog", """
            Pavel Fric<br/>
            [cs] Czech translation
            <p>Jürgen <a href="mailto:[email protected]">[email protected]</a><br/>
            [de] German translation
            <p>Peter Mattern <a href="mailto:[email protected]">[email protected]</a><br/>
            [de] German translation, Project
            <p>Dimitrios Glentadakis <a href="mailto:[email protected]">[email protected]</a><br/>
            [el] Greek translation
            <p>Ozkar L. Garcell <a href="mailto:[email protected]">[email protected]</a><br/>
            [es] Spanish translation
            <p>Laurene Albrand <a href="mailto:[email protected]">[email protected]</a><br/>
            [fr] French translation
            <p>Rémi Verschelde <a href="mailto:[email protected]">[email protected]</a><br/>
            [fr] French translation, Project
            <p>Daniel Napora <a href="mailto:[email protected]">[email protected]</a><br/>
            Tomasz Przybył <a href="mailto:[email protected]">[email protected]</a><br/>
            [pl] Polish translation
            <p>Artem Vorotnikov <a href="mailto:[email protected]">[email protected]</a><br/>
            [ru] Russian translation
            <p>Atilla Öntaş <a href="mailto:[email protected]">[email protected]</a><br/>
            [tr] Turkish translation
            <p>Yuri Chornoivan <a href="mailto:[email protected]">[email protected]</a><br/>
            [uk] Ukrainian translation
            <p>You-Cheng Hsieh <a href="mailto:[email protected]">[email protected]</a><br/>
            [zh_TW] Chinese (Taiwan) translation
            <p>pmav99<br/>
            Project""", "List of contributors")

        dialog = about_dlg.AboutDialog(title, text, image, contributors, self)
        dialog.exec_()
Exemple #39
0
class FileViewWindow(QMainWindow):

    def __init__(self, controller: 'Controller') -> None:
        super().__init__()

        self._message_area: Optional[MessageArea] = None

        self.controller = controller
        self.actions = self.controller.actions

        self.make_window()
        self.make_menubar()
        self.make_toolbar()
        self.addToolBarBreak()
        self.make_location_toolbar()
        self.make_filter_toolbar()
        self.make_search_toolbar()
        self.make_shortcut()

        self.file_view.setFocus()

        self.resize(1024, 768)
        self.move(QCursor.pos().x() - self.width() / 2,
                  QCursor.pos().y() - self.height() / 2)

        self.addAction(self.actions.rename)

    def closeEvent(self, ev):
        self.controller.on_exit()

    def make_shortcut(self):
        shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_L), self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(self.controller.show_location_toolbar)

        def show_filter():
            self.file_filter.setFocus(Qt.ShortcutFocusReason)
            self.filter_toolbar.show()

        shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_K), self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(show_filter)

        shortcut = QShortcut(QKeySequence(Qt.Key_F3), self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(self.controller.show_search)

        shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_F), self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(self.controller.show_search)

        shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_W), self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(self.controller.close_window)

        shortcut = QShortcut(QKeySequence(Qt.ALT + Qt.Key_Up), self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(self.controller.parent_directory)

        shortcut = QShortcut(Qt.Key_Home, self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(lambda: self.file_view.ensureVisible(0, 0, 1, 1))

        shortcut = QShortcut(Qt.Key_End, self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(
            lambda: self.file_view.ensureVisible(
                0, self.file_view._layout.get_bounding_rect().height(), 1, 1))

        shortcut = QShortcut(Qt.Key_PageUp, self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(lambda: self.file_view.scroll_by(0, -self.file_view.viewport().height()))

        shortcut = QShortcut(Qt.Key_PageDown, self)
        shortcut.setContext(Qt.WindowShortcut)
        shortcut.activated.connect(lambda: self.file_view.scroll_by(0, self.file_view.viewport().height()))

    def make_window(self):
        self.setWindowTitle("dt-fileview")
        self.setWindowIcon(QIcon(resource_filename("dirtools", "fileview/dt-fileview.svg")))
        self.vbox = QVBoxLayout()
        self.vbox.setContentsMargins(0, 0, 0, 0)

        self.file_view = FileView(self.controller)

        self.search_lineedit = SearchLineEdit(self.controller)
        self.location_lineedit = LocationLineEdit(self.controller)
        self.location_buttonbar = LocationButtonBar(self.controller)
        self.file_filter = FilterLineEdit(self.controller)
        # self.file_filter.setText("File Pattern Here")
        self.file_view.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.status_bar = self.statusBar()

        self.info = QLabel("")
        self.status_bar.addPermanentWidget(self.info)

        self.vbox.addWidget(self.file_view, Qt.AlignLeft)

        self._message_area = MessageArea()
        self._message_area.hide()
        self.vbox.addWidget(self._message_area)

        vbox_widget = QWidget()
        vbox_widget.setLayout(self.vbox)
        self.setCentralWidget(vbox_widget)

    def hide_filter(self):
        self.filter_toolbar.hide()

    def make_filter_toolbar(self):
        hbox = QHBoxLayout()

        form = QFormLayout()
        label = QLabel("Filter:")
        label.setBuddy(self.file_filter)
        form.addRow(label, self.file_filter)
        form.setContentsMargins(0, 0, 0, 0)
        hbox.addLayout(form)

        help_button = QPushButton("Help")
        help_button.clicked.connect(self.controller.show_filter_help)
        hbox.addWidget(help_button)
        hbox.setContentsMargins(0, 0, 0, 0)

        widget = QWidget()
        widget.setLayout(hbox)

        self.filter_toolbar = QToolBar("Filter")
        self.filter_toolbar.addWidget(widget)
        self.addToolBar(Qt.BottomToolBarArea, self.filter_toolbar)
        self.filter_toolbar.hide()

    def make_search_toolbar(self):
        hbox = QHBoxLayout()

        form = QFormLayout()
        label = QLabel("Search:")
        label.setBuddy(self.search_lineedit)
        form.addRow(label, self.search_lineedit)
        form.setContentsMargins(0, 0, 0, 0)
        hbox.addLayout(form)

        help_button = QPushButton("Help")
        help_button.clicked.connect(self.controller.show_search_help)
        hbox.addWidget(help_button)
        hbox.setContentsMargins(0, 0, 0, 0)

        widget = QWidget()
        widget.setLayout(hbox)

        self.search_toolbar = QToolBar("Search")
        self.search_toolbar.addWidget(widget)
        self.addToolBar(Qt.TopToolBarArea, self.search_toolbar)
        self.search_toolbar.hide()

    def make_location_toolbar(self):
        self.location_toolbar = self.addToolBar("Location")
        widget = QWidget()
        form = QFormLayout()
        label = Label("Location:")
        label.clicked.connect(self.controller.show_location_toolbar)

        def show_location_menu(pos):
            self.controller.on_context_menu(label.mapToGlobal(pos))

        label.setContextMenuPolicy(Qt.CustomContextMenu)
        label.customContextMenuRequested.connect(show_location_menu)

        both = QVBoxLayout()
        both.addWidget(self.location_buttonbar)
        both.addWidget(self.location_lineedit)
        form.addRow(label, both)

        form.setContentsMargins(0, 0, 0, 0)
        widget.setLayout(form)
        self.location_toolbar.addWidget(widget)

        self.addToolBarBreak(Qt.TopToolBarArea)

    def make_group_menu(self):
        menu = QMenu("Group Options")
        menu.addAction(self.actions.group_by_none)
        menu.addAction(self.actions.group_by_day)
        menu.addAction(self.actions.group_by_directory)
        menu.addAction(self.actions.group_by_duration)
        return menu

    def make_sort_menu(self):
        menu = QMenu("Sort Options")
        menu.addSeparator().setText("Sort Options")
        menu.addAction(self.actions.sort_directories_first)
        menu.addAction(self.actions.sort_reversed)
        menu.addSeparator().setText("Sort by")
        menu.addAction(self.actions.sort_by_name)
        menu.addAction(self.actions.sort_by_size)
        menu.addAction(self.actions.sort_by_ext)
        menu.addAction(self.actions.sort_by_date)
        menu.addAction(self.actions.sort_by_duration)
        menu.addAction(self.actions.sort_by_aspect_ratio)
        menu.addAction(self.actions.sort_by_framerate)
        menu.addAction(self.actions.sort_by_area)
        menu.addAction(self.actions.sort_by_user)
        menu.addAction(self.actions.sort_by_group)
        menu.addAction(self.actions.sort_by_permission)
        menu.addAction(self.actions.sort_by_random)
        return menu

    def make_view_menu(self):
        menu = QMenu("View Options")
        menu.addSeparator().setText("View Options")
        menu.addAction(self.actions.show_abspath)
        menu.addAction(self.actions.show_basename)
        menu.addSeparator()
        menu.addAction(self.actions.toggle_timegaps)
        return menu

    def make_menubar(self):
        self.menubar = self.menuBar()
        file_menu = self.menubar.addMenu('&File')
        file_menu.addAction(self.actions.new_window)
        file_menu.addAction(self.actions.parent_directory)
        file_menu.addAction(self.actions.debug)
        file_menu.addAction(self.actions.save_as)
        file_menu.addSeparator()
        file_menu.addAction(self.actions.exit)

        edit_menu = self.menubar.addMenu('&Edit')
        # edit_menu.addAction(self.actions.undo)
        # edit_menu.addAction(self.actions.redo)
        # edit_menu.addSeparator()
        edit_menu.addAction(self.actions.edit_cut)
        edit_menu.addAction(self.actions.edit_copy)
        edit_menu.addAction(self.actions.edit_paste)
        edit_menu.addSeparator()
        edit_menu.addAction(self.actions.edit_select_all)
        edit_menu.addSeparator()
        edit_menu.addAction(self.actions.show_preferences)

        view_menu = self.menubar.addMenu('&View')
        view_menu.addSeparator().setText("View Style")
        view_menu.addAction(self.actions.view_detail_view)
        view_menu.addAction(self.actions.view_icon_view)
        view_menu.addAction(self.actions.view_small_icon_view)
        view_menu.addSeparator().setText("Filter")
        view_menu.addAction(self.actions.show_hidden)
        view_menu.addAction(self.actions.show_filtered)
        view_menu.addSeparator().setText("Path Options")
        view_menu.addAction(self.actions.show_abspath)
        view_menu.addAction(self.actions.show_basename)
        view_menu.addSeparator().setText("Sort Options")
        view_menu.addAction(self.actions.sort_directories_first)
        view_menu.addAction(self.actions.sort_reversed)
        view_menu.addAction(self.actions.sort_by_name)
        view_menu.addAction(self.actions.sort_by_size)
        view_menu.addAction(self.actions.sort_by_ext)
        view_menu.addAction(self.actions.sort_by_duration)
        view_menu.addAction(self.actions.sort_by_aspect_ratio)
        view_menu.addAction(self.actions.sort_by_framerate)
        view_menu.addAction(self.actions.sort_by_area)
        view_menu.addAction(self.actions.sort_by_user)
        view_menu.addAction(self.actions.sort_by_group)
        view_menu.addAction(self.actions.sort_by_permission)
        view_menu.addAction(self.actions.sort_by_random)
        view_menu.addSeparator().setText("Zoom")
        view_menu.addAction(self.actions.zoom_in)
        view_menu.addAction(self.actions.zoom_out)
        view_menu.addSeparator()

        self.bookmarks_menu = Menu('&Bookmarks')
        self.menubar.addMenu(self.bookmarks_menu)

        def create_bookmarks_menu():
            bookmarks = self.controller.app.bookmarks

            entries = bookmarks.get_entries()

            self.bookmarks_menu.clear()

            if self.controller.location is None:
                action = self.bookmarks_menu.addAction(QIcon.fromTheme("user-bookmarks"), "Can't bookmark file lists")
                action.setEnabled(False)
            elif self.controller.location in entries:
                self.bookmarks_menu.addAction(
                    QIcon.fromTheme("edit-delete"), "Remove This Location's Bookmark",
                    lambda loc=self.controller.location:
                    bookmarks.remove(loc))
            else:
                self.bookmarks_menu.addAction(
                    QIcon.fromTheme("bookmark-new"), "Bookmark This Location",
                    lambda loc=self.controller.location:
                    bookmarks.append(loc))
            self.bookmarks_menu.addSeparator()

            self.bookmarks_menu.addDoubleAction(
                QIcon.fromTheme("folder"), "View Bookmarks",
                lambda: self.controller.set_location(Location("bookmarks", "/", [])),
                lambda: self.controller.new_controller().set_location(Location("bookmarks", "/", [])))

            self.bookmarks_menu.addSeparator()

            icon = QIcon.fromTheme("folder")
            for entry in entries:
                action = self.bookmarks_menu.addDoubleAction(
                    icon, entry.as_url(),
                    lambda entry=entry: self.controller.set_location(entry),
                    lambda entry=entry: self.controller.app.show_location(entry))

                if not entry.exists():
                    action.setEnabled(False)
        self.bookmarks_menu.aboutToShow.connect(create_bookmarks_menu)

        self.history_menu = Menu('&History')
        self.menubar.addMenu(self.history_menu)

        def create_history_menu():
            history = self.controller.app.location_history

            self.history_menu.clear()
            self.history_menu.addAction(self.actions.back)
            self.history_menu.addAction(self.actions.forward)
            self.history_menu.addSeparator()

            self.history_menu.addDoubleAction(
                QIcon.fromTheme("folder"), "View File History",
                self.controller.show_file_history,
                lambda: self.controller.new_controller().show_file_history())

            self.history_menu.addSection("Location History")

            entries = history.get_unique_entries(35)
            make_history_menu_entries(self.controller, self.history_menu, entries)

        self.history_menu.aboutToShow.connect(create_history_menu)

        help_menu = self.menubar.addMenu('&Help')
        help_menu.addAction(self.actions.about)

    def make_toolbar(self):
        self.toolbar = self.addToolBar("FileView")

        button = ToolButton()
        button.setDefaultAction(self.actions.parent_directory)
        button.sig_middle_click.connect(lambda: self.controller.parent_directory(new_window=True))
        button.setIcon(self.actions.parent_directory.icon())
        self.toolbar.addWidget(button)

        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions.home)
        self.toolbar.addSeparator()

        history_back_btn = ToolButton()
        history_back_btn.setDefaultAction(self.actions.back)
        history_back_btn.setContextMenuPolicy(Qt.CustomContextMenu)
        history_back_btn.customContextMenuRequested.connect(
            lambda pos: self.controller.show_history_context_menu(history_back_btn, False))
        self.toolbar.addWidget(history_back_btn)

        history_forward_btn = ToolButton()
        history_forward_btn.setDefaultAction(self.actions.forward)
        history_forward_btn.setContextMenuPolicy(Qt.CustomContextMenu)
        history_forward_btn.customContextMenuRequested.connect(
            lambda pos: self.controller.show_history_context_menu(history_forward_btn, False))
        self.toolbar.addWidget(history_forward_btn)

        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions.reload)
        self.toolbar.addAction(self.actions.prepare)
        # self.toolbar.addSeparator()
        # self.toolbar.addAction(self.actions.undo)
        # self.toolbar.addAction(self.actions.redo)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions.show_hidden)

        button = QToolButton()
        button.setIcon(QIcon.fromTheme("view-restore"))
        button.setMenu(self.make_view_menu())
        button.setPopupMode(QToolButton.InstantPopup)
        self.toolbar.addWidget(button)

        button = QToolButton()
        button.setIcon(QIcon.fromTheme("view-sort-ascending"))
        button.setMenu(self.make_sort_menu())
        button.setPopupMode(QToolButton.InstantPopup)
        self.toolbar.addWidget(button)

        button = QToolButton()
        button.setIcon(QIcon.fromTheme("view-sort-ascending"))
        button.setMenu(self.make_group_menu())
        button.setPopupMode(QToolButton.InstantPopup)
        self.toolbar.addWidget(button)

        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions.view_icon_view)
        self.toolbar.addAction(self.actions.view_small_icon_view)
        self.toolbar.addAction(self.actions.view_detail_view)

        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions.zoom_in)
        self.toolbar.addAction(self.actions.zoom_out)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions.lod_in)
        self.toolbar.addAction(self.actions.lod_out)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.actions.crop_thumbnails)

        # Spacer to force right alignment for all following widget
        spacer = QWidget()
        spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.toolbar.addWidget(spacer)

        self.toolbar.addAction(self.actions.debug)
        self.toolbar.addAction(self.controller.app.actions.enable_filesystem)

        # Loading icon
        self.loading_movie = QMovie(resource_filename("dirtools", "fileview/icons/gears.gif"))
        self.loading_label = QLabel()
        self.toolbar.addWidget(self.loading_label)

    def show_loading(self):
        self.show_info("Loading...")
        self.loading_label.setMovie(self.loading_movie)
        self.loading_movie.start()
        self.loading_label.show()

    def hide_loading(self):
        self.show_info("")
        self.loading_movie.stop()
        self.loading_label.setMovie(None)
        self.loading_label.setVisible(False)

    def zoom_in(self):
        self.file_view.zoom_in()

    def zoom_out(self):
        self.file_view.zoom_out()

    def set_location(self, location: Location):
        self.location_lineedit.set_location(location)
        self.location_buttonbar.set_location(location)
        self.setWindowTitle("{} - dt-fileview".format(location.as_human()))

    def set_file_list(self):
        self.location_lineedit.set_unused_text()

    def show_info(self, text):
        self.info.setText("  " + text)

    def show_current_filename(self, filename):
        # FIXME: this causes quite substantial keyboard lag when
        # scrolling with PageUp/Down
        self.status_bar.showMessage(filename)
Exemple #40
0
    def __init__(self, state, device):
        super().__init__()

        self.state = state
        self.invalidated = False

        self.cnt = 0
        self.acc_values = (0, 0, 0, 0, 0, 0, 0)

        self.network = QNetworkAccessManager()

        view = QGraphicsView()
        view.setRenderHint(QPainter.Antialiasing)
        scene = QGraphicsScene()
        scene.addPixmap(QPixmap("chair.png").scaledToWidth(150))
        pen = QPen(QColor.fromRgb(0x28, 0x30, 0x39), 3)
        self.sonic = scene.addRect(QRectF(65, 20, 20, 10), pen,
                                   QBrush(Qt.white))
        self.lback = scene.addEllipse(QRectF(30, 50, 20, 20), pen,
                                      QBrush(Qt.white))
        self.rback = scene.addEllipse(QRectF(100, 50, 20, 20), pen,
                                      QBrush(Qt.white))
        self.lhip = scene.addPolygon(
            QPolygonF([
                QPointF(30, 170),
                QPointF(50, 170),
                QPointF(50, 160),
                QPointF(30, 160)
            ]), pen, QBrush(Qt.white))
        self.rhip = scene.addPolygon(
            QPolygonF([
                QPointF(100, 170),
                QPointF(120, 170),
                QPointF(120, 160),
                QPointF(100, 160)
            ]), pen, QBrush(Qt.white))
        self.lthigh = scene.addEllipse(QRectF(30, 200, 20, 10), pen,
                                       QBrush(Qt.white))
        self.rthigh = scene.addEllipse(QRectF(100, 200, 20, 10), pen,
                                       QBrush(Qt.white))
        self.displays = [
            self.lhip, self.lthigh, self.lback, self.rhip, self.rthigh,
            self.rback, self.sonic
        ]

        view.setScene(scene)
        view.setFixedWidth(150)
        view.setMinimumHeight(400)
        view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        self.setWindowTitle("센서 조정")
        self.setWindowIcon(QIcon('icon.png'))
        self.setGeometry(300, 300, 560, 600)

        self.label = QLabel()
        self.label.setProperty("class", "big")
        self.label.setAlignment(Qt.AlignHCenter)

        movie = QMovie("loader.gif")
        movie.start()
        busy_label = QLabel()
        busy_label.setMovie(movie)
        busy_label.setAlignment(Qt.AlignHCenter)

        layout = QVBoxLayout()
        layout.addStretch(1)
        layout.addWidget(self.label)
        layout.addWidget(view)
        layout.setAlignment(view, Qt.AlignHCenter)
        layout.addWidget(busy_label)
        layout.addStretch(1)
        layout.setContentsMargins(50, 50, 50, 50)
        layout.setSpacing(20)

        frame = QWidget()
        frame.setLayout(layout)
        frame.setProperty("class", "frame")

        main_layout = QVBoxLayout()
        main_layout.addWidget(frame)
        main_layout.setContentsMargins(0, 0, 0, 0)

        self.setLayout(main_layout)
        self.setProperty("class", "root")
        self.setContentsMargins(0, 0, 0, 0)
        self.setAttribute(Qt.WA_TranslucentBackground)

        self.device_changed(device.is_connected())
        device.connectedChanged.connect(self.device_changed)
        device.updateNumber.connect(self.sensor_update)
class ImageViewerCenter(QScrollArea):
	topZoneEntered = Signal()
	topZoneLeft = Signal()
	leftZoneEntered = Signal()
	leftZoneLeft = Signal()

	def __init__(self, *args, **kwargs):
		super(ImageViewerCenter, self).__init__(*args, **kwargs)
		self.zoomMode = ZOOM_FACTOR
		self.zoomFactor = 1
		self.moving = None

		imgWidget = QLabel()
		imgWidget.setMouseTracking(True)
		imgWidget.setAlignment(Qt.AlignCenter)
		self.setWidget(imgWidget)

		self.setAlignment(Qt.AlignCenter)
		self.setMouseTracking(True)
		self.setFrameShape(self.NoFrame)
		self.setWidgetResizable(True)

		pal = QPalette()
		pal.setColor(QPalette.Window, Qt.black)
		self.setPalette(pal)

		self.leftZone = False
		self.topZone = False

		self.file = None
		self.movie = None

	### events
	def mousePressEvent(self, ev):
		self.moving = (ev.pos().x(), ev.pos().y())
		self.movingScrolls = (self.horizontalScrollBar().value(), self.verticalScrollBar().value())

	def mouseReleaseEvent(self, ev):
		self.moving = False

	def mouseMoveEvent(self, ev):
		if self.moving:
			p = ev.pos()
			self.horizontalScrollBar().setValue(self.movingScrolls[0] - (p.x() - self.moving[0]))
			self.verticalScrollBar().setValue(self.movingScrolls[1] - (p.y() - self.moving[1]))
		else:
			newLeft = (ev.x() < 30)
			if newLeft and not self.leftZone:
				self.leftZoneEntered.emit()
			elif self.leftZone and not newLeft:
				self.leftZoneLeft.emit()
			self.leftZone = newLeft

			newTop = (ev.y() < 30)
			if newTop and not self.topZone:
				self.topZoneEntered.emit()
			elif self.topZone and not newTop:
				self.topZoneLeft.emit()
			self.topZone = newTop

	def resizeEvent(self, ev):
		super(ImageViewerCenter, self).resizeEvent(ev)
		if self.zoomMode != ZOOM_FACTOR:
			self._rebuildZoom()

	def keyPressEvent_(self, ev):
		if ev.key() not in (Qt.Key_PageUp, Qt.Key_PageDown):
			QScrollArea.keyPressEvent(self, ev)

	def keyReleaseEvent_(self, ev):
		if ev.key() == Qt.Key_PageUp:
			self.imageviewer.prevImage_s()
		elif ev.key() == Qt.Key_PageDown:
			self.imageviewer.nextImage_s()
		else:
			QScrollArea.keyReleaseEvent(self, ev)

	### public
	def setZoomMode(self, mode):
		self.zoomMode = mode
		self._rebuildZoom()

	def setZoomFactor(self, factor):
		self.zoomFactor = factor
		self.setZoomMode(ZOOM_FACTOR)

	def multiplyZoomFactor(self, factor):
		self.setZoomFactor(self.zoomFactor * factor)

	def setFile(self, file):
		self.file = file
		if file.lower().endswith('.gif'):
			self.movie = QMovie(file)
			self.widget().setMovie(self.movie)
			self.movie.finished.connect(self.movie.start)
			self.movie.start()
		else:
			self.movie = None
			self.originalPixmap = QPixmap(file)
			self._rebuildZoom()

	###
	def _rebuildZoom(self):
		if self.movie:
			return

		if self.zoomMode == ZOOM_FACTOR:
			if self.zoomFactor == 1:
				self._setPixmap(self.originalPixmap)
			else:
				self._setPixmap(self._getScaledPixmap(self.originalPixmap.size() * self.zoomFactor))
		elif self.zoomMode == ZOOM_FITALL:
			newpix = self._getScaledPixmap(self.viewport().size())
			self._setPixmap(newpix)
			self.zoomFactor = newpix.size().width() / float(self.originalPixmap.size().width())
		elif self.zoomMode == ZOOM_FITCUT:
			newpix = self._getScaledPixmap(self.viewport().size(), Qt.KeepAspectRatioByExpanding)
			self._setPixmap(newpix)
			self.zoomFactor = newpix.size().width() / float(self.originalPixmap.size().width())

	def _getScaledPixmap(self, size, mode=Qt.KeepAspectRatio):
		return self.originalPixmap.scaled(size, mode, Qt.SmoothTransformation)

	def _setPixmap(self, pixmap):
		self.widget().setPixmap(pixmap)
Exemple #42
0
'''
Created on 2016年4月26日
@author: Irony."[讽刺]
@site: irony.iask.in
@email: [email protected]
@file: test.test_gif.py
@description: 
'''
from PyQt5.QtWidgets import QApplication, QLabel
from PyQt5.QtGui import QMovie


__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: [email protected]"
__Copyright__ = "Copyright (c) 2015 Irony.\"[讽刺]"
__Version__ = "Version 1.0"


app = QApplication([])

label = QLabel()

move = QMovie("../data/lolita/kiana-3.gif")
label.setMovie(move)
move.start()


label.show()

app.exec_()
Exemple #43
0
class CardHolder(QWidget):

    resized = QtCore.pyqtSignal(int, int)
    moved_to_front = QtCore.pyqtSignal(int)

    DEFAULT_SPINNER_NAME = 'spinner.gif'

    DEFAULT_MAX_OVERLAPPED_CARDS = 4
    DEFAULT_BORDER_WIDTH = 5
    DEFAULT_BACKGROUND_COLOR = QColor(Qt.red)
    DEFAULT_BORDER_RADIUS = 10

    DEFAULT_RATE_OF_CARD_WIDTH_DECLINE = 10
    DEFAULT_RATE_OF_CARD_Y_MULTIPLICATOR = 6

    CARD_TRESHOLD = 6
    MAX_CARD_ROLLING_RATE = 10

    FAST_FORWARD_NUMBER = 5

    def __init__(self,
                 parent,
                 get_new_card_method,
                 get_collected_cards_method,
                 refresh_list_listener=None,
                 select_card_method=None,
                 goes_higher_method=None):
        """
        Represents a CardHolder widget
        Input:
            parent:                        The widget which contains this CardHolder
            get_new_card_method:           Method to create the appearing Card
            get_collected_cards_method:    Method to collect the contents of the Cards
            
            refresh_list_listener
            select_card_method
            goes_higher_method:            Method to go to the previous level           
        """
        #super(CardHolder, self).__init__(parent)
        QWidget.__init__(self, parent)

        self.parent = parent
        self.get_new_card_method = get_new_card_method
        self.get_collected_cards_method = get_collected_cards_method

        self.refresh_list_listener = refresh_list_listener
        self.select_card_method = select_card_method
        self.goes_higher_method = goes_higher_method

        self.shown_card_list = []
        self.card_data_list = []

        self.set_max_overlapped_cards(CardHolder.DEFAULT_MAX_OVERLAPPED_CARDS,
                                      False)
        self.setBorderWidth(CardHolder.DEFAULT_BORDER_WIDTH, False)
        self.setBorderRadius(CardHolder.DEFAULT_BORDER_RADIUS, False)
        self.setBackgroundColor(CardHolder.DEFAULT_BACKGROUND_COLOR, False)

        self.self_layout = QVBoxLayout(self)
        self.setLayout(self.self_layout)

        self.rate_of_movement = 0
        self.delta_rate = 0

        self.countDown = CountDown()
        self.countDown.timeOver.connect(
            self.animated_move_to_closest_descreet_position)

        self.collecting_spinner = None
        spinner_file_name = resource_filename(
            __name__, os.path.join("img", CardHolder.DEFAULT_SPINNER_NAME))
        self.set_spinner(spinner_file_name)

        self.set_y_coordinate_by_reverse_index_method(
            self.get_y_coordinate_by_reverse_index)
        self.set_x_offset_by_index_method(self.get_x_offset_by_index)

        # it hides the CardHolder until it is filled up with cards
        self.focus_index(0)

        self.setAttribute(Qt.WA_StyledBackground, True)

        # The CardHolder will accept Focus by Tabbing and Clicking
        self.setFocusPolicy(Qt.StrongFocus)
        self.setFocus()

#    def setSelectedRootCardIndex(self, selected_root_card_index):
#        self.selected_root_card_index = selected_root_card_index
#
#    def getSelectedRootCardIndex(self):
#        return self.selected_root_card_index

    def set_y_coordinate_by_reverse_index_method(self, method):
        self.get_y_coordinate_by_reverse_index_method = method

    def get_y_coordinate_by_reverse_index(self, reverse_index):
        return reverse_index * reverse_index * CardHolder.DEFAULT_RATE_OF_CARD_Y_MULTIPLICATOR

    def set_x_offset_by_index_method(self, method):
        self.get_x_offset_by_index_method = method

    def get_x_offset_by_index(self, index):
        return index * CardHolder.DEFAULT_RATE_OF_CARD_WIDTH_DECLINE

    # ----------------
    #
    # set spinner
    #
    # ----------------
    def set_spinner(self, file_name):

        # remove the old spinner
        if self.collecting_spinner != None:
            self.spinner_movie.stop()
            self.collecting_spinner.setParent(None)
            self.collecting_spinner = None

        self.spinner_movie = QMovie(file_name, QByteArray(), self)
        self.collecting_spinner = QLabel(self.parent)
        self.collecting_spinner.setMovie(self.spinner_movie)
        self.collecting_spinner.setSizePolicy(QSizePolicy.Expanding,
                                              QSizePolicy.Expanding)

        self.spinner_movie.setCacheMode(QMovie.CacheAll)
        self.spinner_movie.setSpeed(100)
        self.spinner_movie.start()  # if I do not start it, it stays hidden
        self.spinner_movie.stop()
        self.collecting_spinner.move(0, 0)
        self.collecting_spinner.show()
        self.collecting_spinner.setHidden(True)

        img_size = self.spinner_movie.currentPixmap().size()
        self.collecting_spinner.resize(img_size.width(), img_size.height())

    # --------------------------------------
    # Shows the spinner + removes all Cards
    # --------------------------------------
    def start_spinner(self):

        # remove all cards
        self.refresh()
        self.alignSpinner(self.parent.geometry().width(),
                          self.parent.geometry().height())
        self.spinner_movie.start()
        self.collecting_spinner.setHidden(False)

    def alignSpinner(self, windowWidth, windowHeight):
        self.collecting_spinner.move(
            (windowWidth - self.collecting_spinner.width()) / 2,
            (windowHeight - self.collecting_spinner.width()) / 2)

    # ------------------------------
    # Hides the spinner
    # ------------------------------
    def stop_spinner(self):
        self.collecting_spinner.setHidden(True)
        self.spinner_movie.stop()

    # ---------------------------------------------------------------------
    #
    # start card collection
    #
    # this method should be called when you want a new collection of cards
    #
    # ---------------------------------------------------------------------
    def startCardCollection(self):

        self.start_spinner()

        #        self.cc = CollectCardsThread.getInstance( self, self.get_collected_cards_method, parameters )
        self.cc = CollectCardsThread.getInstance(
            self, self.get_collected_cards_method)
        if self.cc:
            self.cc.cards_collected.connect(self.refresh)
            self.cc.start()

    # ------------------------------------------------------
    # fill up card descriptor - used by the refresh() method
    # ------------------------------------------------------
    def fill_up_card_descriptor_list(self, filtered_card_list=[]):
        self.card_data_list = []
        for card_data in filtered_card_list:
            self.card_data_list.append(card_data)

    def setBorderWidth(self, width, update=True):
        self.border_width = width
        if update:
            self.update()

    def get_border_width(self):
        return self.border_width

    def setBackgroundColor(self, color, update=True):
        self.background_color = color
        ## without this line it wont paint the background, but the children get the background color info
        ## with this line, the rounded corners will be ruined
        #self.setAttribute(QtCore.Qt.WA_StyledBackground, True)
        #self.setStyleSheet('background-color: ' + self.background_color.name())
        if update:
            self.update()

    def set_max_overlapped_cards(self, number, update=True):
        self.max_overlapped_cards = number
        if update:
            #self.focus_index(self.actual_card_index)
            self.focus_index(0)

    def setBorderRadius(self, radius, update=True):
        self.border_radius = radius
        if update:
            self.update()

    def get_max_overlapped_cards(self):
        return self.max_overlapped_cards

    def resizeEvent(self, event):
        self.resized.emit(event.size().width(), event.size().height())
        return super(CardHolder, self).resizeEvent(event)

    def remove_all_cards(self):
        for card in self.shown_card_list:
            card.setParent(None)
            card = None

    def remove_card(self, card):
        card.setParent(None)
        card = None

    def get_rate_of_movement(self):
        return self.rate_of_movement

    def get_delta_rate(self):
        return self.delta_rate

    # --------------------------------------------------------------------------
    #
    # Focus Index
    #
    # It builds up from scratch the shown_card_list from the card_data_list
    # In the 0. position (on front) will be the Card identified by the "index" parameter
    # The card in the 0. position will be indicated as the "focused"
    #
    # --------------------------------------------------------------------------
    def focus_index(self, index):
        index_corr = self.get_corrected_card_data_index(index)
        self.remove_all_cards()
        position = None
        self.shown_card_list = [
            None for i in range(
                index_corr + min(self.max_overlapped_cards,
                                 len(self.card_data_list) - 1), index_corr -
                1, -1)
        ]

        for i in range(
                index_corr + min(self.max_overlapped_cards,
                                 len(self.card_data_list) - 1), index_corr - 1,
                -1):

            i_corr = self.get_corrected_card_data_index(i)

            if (i_corr < len(self.card_data_list)):

                local_index = i - index_corr
                card = self.get_new_card_method(self.card_data_list[i_corr],
                                                local_index, i_corr)
                position = card.place(local_index)

                self.shown_card_list[local_index] = card

        # if there is at least one Card
        if self.shown_card_list:

            # Control the Height of the CardHolder
            self.setMinimumHeight(position[0].y() + position[1].y() +
                                  self.border_width)
            self.setMaximumHeight(position[0].y() + position[1].y() +
                                  self.border_width)

            # for indicating the focused (0) Card
            self.rolling(0)

        # if there is NO Card at all
        else:
            # hides the CardHolder
            self.setMinimumHeight(0)
            self.setMaximumHeight(0)

    # for some reason the 2nd parameter is False from connect
    # that is why I cant connect it to directly
    def button_animated_move_to_next(self):
        self.animated_move_to_next()

    def button_animated_move_to_previous(self):
        self.animated_move_to_previous()

    # ---------------------------------
    #
    # Animated shows the next card
    #
    # ---------------------------------
    def animated_move_to_next(self, sleep=0.01):
        rate = self.get_rate_of_movement()

        if rate > 0:
            loop = self.MAX_CARD_ROLLING_RATE - rate
        elif rate < 0:
            loop = -rate
        else:
            loop = self.MAX_CARD_ROLLING_RATE

        self.animate = AnimateRolling.getInstance(int(loop), 1, sleep)
        if self.animate:
            self.animate.positionChanged.connect(self.rolling)
            self.animate.start()

    # ---------------------------------
    #
    # Animated shows the previous card
    #
    # ---------------------------------
    def animated_move_to_previous(self, sleep=0.01):
        rate = self.get_rate_of_movement()

        if rate > 0:
            loop = rate
        elif rate < 0:
            loop = self.MAX_CARD_ROLLING_RATE + rate
        else:
            loop = self.MAX_CARD_ROLLING_RATE

        self.animate = AnimateRolling.getInstance(int(loop), -1, sleep)
        if self.animate:
            self.animate.positionChanged.connect(self.rolling)
            self.animate.start()

    # ------------------------------------------------
    #
    # Animated moves to the closest descreet position
    #
    # ------------------------------------------------
    def animated_move_to_closest_descreet_position(self):
        rate = self.get_rate_of_movement()
        delta_rate = self.get_delta_rate()

        if rate != 0:

            if rate > 0:

                if delta_rate < 0:
                    value = -1
                    loop = rate
                else:
                    value = 1
                    loop = self.MAX_CARD_ROLLING_RATE - rate

                #if rate >= self.CARD_TRESHOLD:
                #    value = 1
                #    loop = self.MAX_CARD_ROLLING_RATE - rate
                #else:
                #    value = -1
                #    loop = rate

            elif rate < 0:

                if delta_rate < 0:
                    value = -1
                    loop = self.MAX_CARD_ROLLING_RATE + rate
                else:
                    value = 1
                    loop = -rate

                #if rate <= -self.CARD_TRESHOLD:
                #    value = -1
                #    loop = self.MAX_CARD_ROLLING_RATE + rate
                #else:
                #    value = 1
                #    loop = -rate

            self.animate = AnimateRolling.getInstance(int(loop), value, 0.02)
            if self.animate:
                self.animate.positionChanged.connect(self.rolling)
                self.animate.start()

    # ------------------------------------------------
    #
    # Animated moves to the set relative position Card
    #
    # ------------------------------------------------
    def animated_move_to(self, relative_position, sleep=0.01):
        self.animate = AnimateRolling.getInstance(
            relative_position * self.MAX_CARD_ROLLING_RATE, 1, sleep)
        if self.animate:
            self.animate.positionChanged.connect(self.rolling)
            self.animate.start()

    # ---------------------------------------------------------------------
    #
    # Rolling Wheel
    #
    # Rolls the cards according to the self.rate_of_movement + delta_rate
    # Plus it starts a Timer. If the timer expires, the cards will be
    # moved to the first next discreet position
    #
    # --------------------------------------------------------------------
    def rolling_wheel(self, delta_rate):
        self.rolling(delta_rate)

        if self.rate_of_movement != 0:
            self.countDown.start()

    # --------------------------------------------------------------------
    #
    # ROLLING
    #
    # Rolls the cards according to the self.rate_of_movement + delta_rate
    #
    # delta_rate:   In normal case it is +1 or -1
    #               Adding this value to the self.rate_of_movement, it
    #               shows that how far the cards moved negativ (up) or
    #               positive (down) direction compared to the default
    #               (local_index) value
    #               -10 means (-100%) it moved to the next position,
    #               +10 means (+100%) it moved to the previous position
    #
    # -------------------------------------------------------------------
    def rolling(self, delta_rate):

        self.delta_rate = delta_rate

        if self.rate_of_movement >= self.MAX_CARD_ROLLING_RATE or self.rate_of_movement <= -self.MAX_CARD_ROLLING_RATE:
            self.rate_of_movement = 0

        self.rate_of_movement = self.rate_of_movement + delta_rate

        # Did not start to roll
        # if number of the shown cards are != min(max overlapped cards +1, len(self.card_data_list))
        #if len(self.shown_card_list) <= self.get_max_overlapped_cards() + 1:
        if len(self.shown_card_list) == min(self.max_overlapped_cards + 1,
                                            len(self.card_data_list)):

            # indicates that the first card is not the focused anymore
            card = self.shown_card_list[0]
            card.setNotFocused()

            # add new card to the beginning
            first_card = self.shown_card_list[0]
            first_card_index = self.get_corrected_card_data_index(
                first_card.getIndexInDataList() - 1)
            card = self.get_new_card_method(
                self.card_data_list[first_card_index], -1, first_card_index)
            self.shown_card_list.insert(0, card)

            # add a new card to the end
            last_card = self.shown_card_list[len(self.shown_card_list) - 1]
            last_card_index = self.get_corrected_card_data_index(
                last_card.getIndexInDataList() + 1)
            #card = self.get_new_card_method(self.card_data_list[last_card_index], self.get_max_overlapped_cards() + 1, last_card_index )
            card = self.get_new_card_method(
                self.card_data_list[last_card_index],
                min(self.max_overlapped_cards + 1, len(self.card_data_list)),
                last_card_index)

            self.shown_card_list.append(card)

            # Re-print to avoid the wrong-overlapping
            for card in self.shown_card_list[::-1]:
                card.setParent(None)
                card.setParent(self)
                card.show()

        # adjust
        rate = self.rate_of_movement / self.MAX_CARD_ROLLING_RATE
        if self.rate_of_movement >= 0:
            self.rolling_adjust_forward(rate)
        else:
            self.rolling_adjust_backward(rate)

        # indicates that the first card is the focus
        if self.rate_of_movement == 0:
            card = self.shown_card_list[0]

            card.setFocused()

        # show the cards in the right position
        rate = self.rate_of_movement / self.MAX_CARD_ROLLING_RATE
        for i, card in enumerate(self.shown_card_list):
            virtual_index = card.local_index - rate
            card.place(virtual_index, True)

    def rolling_adjust_forward(self, rate):

        if rate >= 1.0:
            self.rate_of_movement = 0

            # remove the first 2 cards from the list and from CardHolder
            for i in range(2):
                card_to_remove = self.shown_card_list.pop(0)
                card_to_remove.setParent(None)

            # re-index
            for i, card in enumerate(self.shown_card_list):
                card.local_index = i

        elif rate == 0:
            # remove the first card from the list and from CardHolder
            card_to_remove = self.shown_card_list.pop(0)
            card_to_remove.setParent(None)

            # remove the last card from the list and from CardHolder
            card_to_remove = self.shown_card_list.pop(
                len(self.shown_card_list) - 1)
            card_to_remove.setParent(None)

    def rolling_adjust_backward(self, rate):

        if rate <= -1.0:
            self.rate_of_movement = 0

            # remove the 2 last cards from the list and from CardHolder
            for i in range(2):
                card_to_remove = self.shown_card_list.pop(
                    len(self.shown_card_list) - 1)
                card_to_remove.setParent(None)

            # re-index
            for i, card in enumerate(self.shown_card_list):
                card.local_index = i

    # -----------------------------------------------------------
    #
    # INDEX CORRECTION
    #
    # if the index > numbers of the cards then it gives back 0
    #    as the next index
    # if the index < 0 then it gives back the index of the last
    #    card as the previous index
    #
    # that is how it actually accomplishes an endless loop
    #
    # -----------------------------------------------------------
    def get_corrected_card_data_index(self, index):
        if self.card_data_list:
            return (len(self.card_data_list) - abs(index)
                    if index < 0 else index) % len(self.card_data_list)
        else:
            return index

    def paintEvent(self, event):
        s = self.size()
        qp = QPainter()
        qp.begin(self)
        qp.setRenderHint(QPainter.Antialiasing, True)
        qp.setBrush(self.background_color)

        qp.drawRoundedRect(0, 0, s.width(), s.height(), self.border_radius,
                           self.border_radius)
        qp.end()

    def getFocusedCard(self):
        if self.shown_card_list:
            first_card = self.shown_card_list[0]
            return first_card
        else:
            return None

    def wheelEvent(self, event):
        modifiers = QApplication.keyboardModifiers()
        value = event.angleDelta().y(
        ) / 8 / 15  # in normal case it is +1 or -1

        if modifiers == Qt.ControlModifier:

            # Change SCALE_LEVEL
            config_ini_function = getConfigIni()
            scale_level = int(config_ini_function.getScaleLevel())
            scale_level = scale_level + (1 if value > 0 else -1)
            config_ini_function.setScaleLevel(str(scale_level))

            index_of_focused_card = self.getFocusedCard().getIndexInDataList()
            self.focus_index(index_of_focused_card)

        else:
            self.rolling_wheel(-value)

    def keyPressEvent(self, event):

        if event.key() == QtCore.Qt.Key_Up and event.modifiers(
        ) == Qt.ControlModifier:

            # Change SCALE_LEVEL
            config_ini_function = getConfigIni()
            scale_level = int(config_ini_function.getScaleLevel())
            scale_level = scale_level + 1
            config_ini_function.setScaleLevel(str(scale_level))

            parent_collector = self.getParentCollector()
            index_of_focused_card = self.getFocusedCard().getIndexInDataList()
            self.focus_index(index_of_focused_card)

        elif event.key() == QtCore.Qt.Key_Down and event.modifiers(
        ) == Qt.ControlModifier:

            # Change SCALE_LEVEL
            config_ini_function = getConfigIni()
            scale_level = int(config_ini_function.getScaleLevel())
            scale_level = scale_level - 1
            config_ini_function.setScaleLevel(str(scale_level))

            parent_collector = self.getParentCollector()
            index_of_focused_card = self.getFocusedCard().getIndexInDataList()
            self.focus_index(index_of_focused_card)

        elif event.key() == QtCore.Qt.Key_Up:
            self.animated_move_to_next(sleep=0.04)

        elif event.key() == QtCore.Qt.Key_Down:
            self.animated_move_to_previous(sleep=0.04)

        elif event.key() == QtCore.Qt.Key_PageUp:
            self.animated_move_to(self.FAST_FORWARD_NUMBER, 0.04)

        elif event.key() == QtCore.Qt.Key_PageDown:
            self.animated_move_to(-self.FAST_FORWARD_NUMBER, 0.04)

        #
        # Goes Up in the hierarchy
        #
        elif event.key() == QtCore.Qt.Key_Escape:

            if self.goesHigher():

                # I do not want to propagate the ESC event to the parent
                event.setAccepted(True)

        #
        # Select a Card
        #
        elif event.key() == QtCore.Qt.Key_Space or event.key(
        ) == QtCore.Qt.Key_Return:

            # Comes from the MouseClick -> It could be any Card on the screen
            if event.text().isdigit():
                card_index = int(event.text())

                # Move the Card to the front
                self.focus_index(card_index)

            # Comes from SPACE/ENTER -> Only
            else:
                pass

            # Fetch the Card in the focus (in front)
            selected_card = self.getFocusedCard()

            if self.select_card_method:
                self.select_card_method(selected_card)

            else:

                # Depending of the Media (Storage/Collector) needs to do different things
                panel = selected_card.getPanel()
                layout = panel.getLayout()

                # the 0th item in the layout is the Image
                widget = layout.itemAt(0).widget()
                widget.image_widget.toDoSelection()

            event.setAccepted(True)

        else:

            event.setAccepted(False)

    def collectMediaStorageWithoutHierarchy(self, sum_list, parent_collector):
        mcl = parent_collector.getMediaCollectorList()
        sum_list += parent_collector.getMediaStorageList()
        for media_collector in mcl:
            self.collectMediaStorageWithoutHierarchy(sum_list, media_collector)
        return sum_list

    def getParentCollector(self):
        return self.getFocusedCard().card_data.getParentCollector()

    # TODO build in the refresh()
    def getSortedMediaStorageList(self, parent_collector):

        # Without hierarchy
        if not self.parent.isSwitchKeepHierarchy():
            msl = self.collectMediaStorageWithoutHierarchy([],
                                                           parent_collector)
            msl.sort(key=lambda arg: MediaCollector.sort_key(arg))

        # With hierarchy
        else:
            msl = parent_collector.getMediaStorageList()

        return msl

    def refresh(self, parent_collector=None, index=0):
        """
        Fills up the CardHolder with Cards and pulls the <index>th Card to front
        
        
        """

        if parent_collector:

            # Without hierarchy
            if not self.parent.isSwitchKeepHierarchy():
                sum_list = self.collectMediaStorageWithoutHierarchy(
                    [], parent_collector)
                sum_list.sort(key=lambda arg: MediaCollector.sort_key(arg))

                # Listener of the refresh list
                # Here you refresh the self.mediaCollector object in the medlib_gui
                self.refresh_list_listener(parent_collector, sum_list)

            # With hierarchy
            else:
                mcl = parent_collector.getMediaCollectorList()
                msl = parent_collector.getMediaStorageList()
                sum_list = mcl + msl

                # Listener of the refresh list
                # 1. set self.mediaCollector
                # 2. fill up the "play continously" list if there is NO ongoing play
                # 3. save the "play continously" list if there IS ongoing play
                self.refresh_list_listener(parent_collector, msl)

            self.fill_up_card_descriptor_list(sum_list)
            self.focus_index(index)

        self.stop_spinner()

    def goesHigher(self):
        if self.goes_higher_method:
            #self.goes_higher_method(self.getFocusedCard())
            self.goes_higher_method()

            return True
        else:

            collector, index = self.parent.getHierarchyTitle(
            ).getOneLevelHigher()
            if collector and index >= 0:
                self.refresh(collector, index)
            return False

    def goesDeeper(self, mediaCollector):
        self.refresh(mediaCollector)

    # --------------
    # MOUSE handling
    # --------------
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drag_start_position = event.pos()
        event.ignore()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:

            # Rolling Cards
            delta_y = event.pos().y() - self.drag_start_position.y()
            self.drag_start_position = event.pos()

            if delta_y > 0:
                self.rolling_wheel(1)
            elif delta_y < 0:
                self.rolling_wheel(-1)
        event.ignore()
Exemple #44
0
class Window(object):
    def setupUI(self,MainWindow):
        #界面背景设为黑色,大小待更改
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(450, 600)
        MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        #显示动图,需要更改位置
        self.picture = QtWidgets.QLabel(self.centralwidget)
        self.picture.setGeometry(QtCore.QRect(25, 400, 400, 121))
        self.picture.setText("")
        self.gif = QMovie("timg2.gif")
        self.picture.setMovie(self.gif)
        self.gif.start()
        self.picture.setScaledContents(True)
        self.picture.setObjectName("picture")

        self.startButton = QtWidgets.QPushButton(self.centralwidget)
        self.startButton.setGeometry(QtCore.QRect(200, 500, 50, 50))
        self.startButton.setIconSize(QtCore.QSize(50, 50))
        self.startButton.setObjectName("startButton")
        self.startButton.clicked.connect(self.start_audio)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("start.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.startButton.setIcon(icon2)
        self.startButton.setIconSize(QtCore.QSize(50, 50))

        #label用来显示状态,是输入中,识别中、、、、,更改位置
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(70, 50, 400, 70))
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(14)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(0, 117, 210);")
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setWordWrap(True)
        self.label.setObjectName("label")
        self.label.setText("Hello, you can push the start button to begin")

        # label_2用来显示输入的内容,需要更改位置
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(70, 150, 400, 70))
        font = QtGui.QFont()
        font.setFamily("Calibri")
        font.setPointSize(14)
        font.setStyleStrategy(QtGui.QFont.PreferAntialias)
        self.label_2.setFont(font)
        self.label_2.setStyleSheet("color: rgb(0, 117, 210);")
        self.label_2.setTextFormat(QtCore.Qt.AutoText)
        self.label_2.setWordWrap(True)
        self.label_2.setObjectName("label_2")
        self.label_2.setText(" ")




        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Voice Assistant"))
Exemple #45
0
class MoviePlayer(QWidget):
    def __init__(self, parent=None):
        super(MoviePlayer, self).__init__(parent)

        self.movie = QMovie(self)
        self.movie.setCacheMode(QMovie.CacheAll)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignCenter)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.movieLabel.setBackgroundRole(QPalette.Dark)
        self.movieLabel.setAutoFillBackground(True)

        self.currentMovieDirectory = ''

        self.createControls()
        self.createButtons()

        self.movie.frameChanged.connect(self.updateFrameSlider)
        self.movie.stateChanged.connect(self.updateButtons)
        self.fitCheckBox.clicked.connect(self.fitToWindow)
        self.frameSlider.valueChanged.connect(self.goToFrame)
        self.speedSpinBox.valueChanged.connect(self.movie.setSpeed)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.movieLabel)
        mainLayout.addLayout(self.controlsLayout)
        mainLayout.addLayout(self.buttonsLayout)
        self.setLayout(mainLayout)

        self.updateFrameSlider()
        self.updateButtons()

        self.setWindowTitle("Movie Player")
        self.resize(400, 400)

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie",
                self.currentMovieDirectory)

        if fileName:
            self.openFile(fileName)

    def openFile(self, fileName):
        self.currentMovieDirectory = QFileInfo(fileName).path()

        self.movie.stop()
        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName(fileName)
        self.movie.start()

        self.updateFrameSlider();
        self.updateButtons();

    def goToFrame(self, frame):
        self.movie.jumpToFrame(frame)

    def fitToWindow(self):
        self.movieLabel.setScaledContents(self.fitCheckBox.isChecked())

    def updateFrameSlider(self):
        hasFrames = (self.movie.currentFrameNumber() >= 0)

        if hasFrames:
            if self.movie.frameCount() > 0:
                self.frameSlider.setMaximum(self.movie.frameCount() - 1)
            elif self.movie.currentFrameNumber() > self.frameSlider.maximum():
                self.frameSlider.setMaximum(self.movie.currentFrameNumber())

            self.frameSlider.setValue(self.movie.currentFrameNumber())
        else:
            self.frameSlider.setMaximum(0)

        self.frameLabel.setEnabled(hasFrames)
        self.frameSlider.setEnabled(hasFrames)

    def updateButtons(self):
        state = self.movie.state()

        self.playButton.setEnabled(self.movie.isValid() and
                self.movie.frameCount() != 1 and state == QMovie.NotRunning)
        self.pauseButton.setEnabled(state != QMovie.NotRunning)
        self.pauseButton.setChecked(state == QMovie.Paused)
        self.stopButton.setEnabled(state != QMovie.NotRunning)

    def createControls(self):
        self.fitCheckBox = QCheckBox("Fit to Window")

        self.frameLabel = QLabel("Current frame:")

        self.frameSlider = QSlider(Qt.Horizontal)
        self.frameSlider.setTickPosition(QSlider.TicksBelow)
        self.frameSlider.setTickInterval(10)

        speedLabel = QLabel("Speed:")

        self.speedSpinBox = QSpinBox()
        self.speedSpinBox.setRange(1, 9999)
        self.speedSpinBox.setValue(100)
        self.speedSpinBox.setSuffix("%")

        self.controlsLayout = QGridLayout()
        self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2)
        self.controlsLayout.addWidget(self.frameLabel, 1, 0)
        self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2)
        self.controlsLayout.addWidget(speedLabel, 2, 0)
        self.controlsLayout.addWidget(self.speedSpinBox, 2, 1)

    def createButtons(self):
        iconSize = QSize(36, 36)

        openButton = QToolButton()
        openButton.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton))
        openButton.setIconSize(iconSize)
        openButton.setToolTip("Open File")
        openButton.clicked.connect(self.open)

        self.playButton = QToolButton()
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.setIconSize(iconSize)
        self.playButton.setToolTip("Play")
        self.playButton.clicked.connect(self.movie.start)

        self.pauseButton = QToolButton()
        self.pauseButton.setCheckable(True)
        self.pauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
        self.pauseButton.setIconSize(iconSize)
        self.pauseButton.setToolTip("Pause")
        self.pauseButton.clicked.connect(self.movie.setPaused)

        self.stopButton = QToolButton()
        self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.stopButton.setIconSize(iconSize)
        self.stopButton.setToolTip("Stop")
        self.stopButton.clicked.connect(self.movie.stop)

        quitButton = QToolButton()
        quitButton.setIcon(self.style().standardIcon(QStyle.SP_DialogCloseButton))
        quitButton.setIconSize(iconSize)
        quitButton.setToolTip("Quit")
        quitButton.clicked.connect(self.close)

        self.buttonsLayout = QHBoxLayout()
        self.buttonsLayout.addStretch()
        self.buttonsLayout.addWidget(openButton)
        self.buttonsLayout.addWidget(self.playButton)
        self.buttonsLayout.addWidget(self.pauseButton)
        self.buttonsLayout.addWidget(self.stopButton)
        self.buttonsLayout.addWidget(quitButton)
        self.buttonsLayout.addStretch()
Exemple #46
0
class filesChosen(QWidget):
    def __init__(self, files):
        super().__init__()
        self.title = 'PDF Merger'
        self.setWindowIcon(QIcon("C:\\Users\\cold\\Downloads\\pdf_icon.png"))
        self.left = 100
        self.top = 100
        self.width = 600
        self.height = 600
        self.fileNames = files
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.movie = QMovie("C:\\Users\\cold\\Downloads\\cats.gif")
        self.movie.frameChanged.connect(self.repaint)
        self.movie.start()

        buttonGoBack = QPushButton('Back to File Selection', self)
        buttonGoBack.move(200, 550)
        buttonGoBack.resize(200, 32)
        buttonGoBack.clicked.connect(self.buttonGoBack_onClick)

        buttonMerge = QPushButton('Merge Files', self)
        buttonMerge.move(200, 500)
        buttonMerge.resize(200, 32)
        buttonMerge.clicked.connect(self.buttonMerge_onClick)

        explText = QLabel(self)
        explText.setText(
            "Merge will happen in order listed here. Keep filenames on separate lines."
        )
        explText.setGeometry(100, 40, 400, 32)

        expl2Text = QLabel(self)
        expl2Text.setText(
            "Rearrange merge order by moving filenames to correct position.")
        expl2Text.setGeometry(100, 70, 400, 32)

        expl3Text = QLabel(self)
        expl3Text.setText(
            "Use Ctrl + click to select multiple files. Use button to go back if one file selected."
        )
        expl3Text.setGeometry(100, 10, 400, 32)

        otherText = QLabel(self)
        otherText.setText("Files Chosen for Merging:")
        otherText.setGeometry(100, 100, 200, 32)

        self.filesText = QTextEdit(self)
        if self.fileNames:
            fileNameText = ''
            for filename in self.fileNames:
                fileNameText += filename + "<br>"
            self.filesText.setText(fileNameText)
        else:
            self.filesText.setText('No files chosen.')
        self.filesText.setGeometry(100, 130, 400, 300)

        self.show()

    def buttonGoBack_onClick(self):
        self.cams = App(False)
        self.cams.show()
        self.close()

    def buttonMerge_onClick(self):
        filesTextValue = self.filesText.toPlainText()
        files = filesTextValue.splitlines()
        output_file = self.saveFileDialog()
        if output_file and files and files[0] != "No files chosen." and files[
                0] != "":
            self.merge_pdfs(files, output_file)
            self.cams = App(True)
            self.cams.show()
            self.close()
        else:
            self.filesText.setText(
                "Error: Input or Output file missing. Please click back button and try again."
            )

    def saveFileDialog(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getSaveFileName(
            self,
            "Save File As",
            "",
            "PDF Files (*.pdf);;All Files (*)",
            options=options)
        if fileName:
            return fileName
        else:
            return ''

    def paintEvent(self, event):
        currentFrame = self.movie.currentPixmap()
        frameRect = currentFrame.rect()
        frameRect.moveCenter(self.rect().center())
        if frameRect.intersects(event.rect()):
            painter = QPainter(self)
            painter.drawPixmap(frameRect.left(), frameRect.top(), currentFrame)

    def merge_pdfs(self, paths, output):
        pdf_writer = PdfFileWriter()

        for path in paths:
            if path:
                pdf_reader = PdfFileReader(path)
                for page in range(pdf_reader.getNumPages()):
                    # Add each page to the writer object
                    pdf_writer.addPage(pdf_reader.getPage(page))

        # Write out the merged PDF
        with open(output, 'wb') as out:
            pdf_writer.write(out)
Exemple #47
0
class ProgressWindow(QWidget):
    def __init__(self, message):
        QWidget.__init__(self, ctx.mainScreen)
        self.setObjectName("ProgressWindow")
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.setFixedHeight(50)
        self.setMaximumWidth(800)
        self.setStyleSheet("""
            QFrame#frame { border: 1px solid rgba(255,255,255,30);
                           /*border-radius: 4px;*/
                           background-color: rgba(255,0,0,100);}

            QLabel { border:none;
                     color:#FFFFFF;}

            QProgressBar { border: 1px solid white;}

            QProgressBar::chunk { background-color: #F1610D;
                                  width: 0.5px;}
        """)

        self.gridlayout = QGridLayout(self)
        self.frame = QFrame(self)
        self.frame.setObjectName("frame")
        self.horizontalLayout = QHBoxLayout(self.frame)
        self.horizontalLayout.setContentsMargins(6, 0, 0, 0)

        # Spinner
        self.spinner = QLabel(self.frame)
        self.spinner.setMinimumSize(QSize(16, 16))
        self.spinner.setMaximumSize(QSize(16, 16))
        self.spinner.setIndent(6)
        self.movie = QMovie(':/images/working.mng')
        self.spinner.setMovie(self.movie)
        self.movie.start()
        self.horizontalLayout.addWidget(self.spinner)

        # Message
        self.label = QLabel(self.frame)
        self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.horizontalLayout.addWidget(self.label)
        self.gridlayout.addWidget(self.frame,0,0,1,1)

        self.update(message)

    def update(self, message):
        self.spinner.setVisible(True)
        fontMetric = self.label.fontMetrics()
        textWidth = fontMetric.width(message)
        self.setFixedWidth(textWidth + 100)
        self.label.setText(message)
        self.move(ctx.mainScreen.width()/2 - self.width()/2,
                  ctx.mainScreen.height() - self.height()/2 - 50)
        self.show()

    def refresh(self):
        ctx.mainScreen.processEvents()

    def show(self):
        QWidget.show(self)
        self.refresh()

    def pop(self):
        QWidget.hide(self)
        self.refresh()
Exemple #48
0
class Ui_MainWindow(QtCore.QObject):
    sig = QtCore.pyqtSignal()

    def setupresUi(self):
        print(threading.enumerate())
        output = self.res
        self.t.exit()
        MainWindow = self.MainWindow
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(861, 690)
        MainWindow.setStyleSheet("background-color: rgb(255,255,255);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.backButton = QtWidgets.QCommandLinkButton(self.centralwidget)
        self.backButton.setMinimumSize(QtCore.QSize(40, 40))
        self.backButton.setMaximumSize(QtCore.QSize(40, 40))
        self.backButton.setBaseSize(QtCore.QSize(40, 40))
        self.backButton.setText("")
        self.backButton.setIconSize(QtCore.QSize(40, 40))
        self.backButton.setCheckable(False)
        self.backButton.setObjectName("backButton")
        self.MainWindow = MainWindow
        self.backButton.clicked.connect(self.setupUi)
        self.horizontalLayout.addWidget(self.backButton)
        spacerItem = QtWidgets.QSpacerItem(40, 20,
                                           QtWidgets.QSizePolicy.Expanding,
                                           QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setStyleSheet("color: rgb(0, 0, 0);\n"
                                "background-color: rgb(255, 255, 255);")
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout.addWidget(self.line)
        self.resultWidget = QtWidgets.QListWidget(self.centralwidget)
        self.resultWidget.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.resultWidget.setObjectName("resultWidget")
        for item in output:
            form = QtWidgets.QWidget()
            a = QtWidgets.QListWidgetItem()
            ui = entry.Ui_Entry()
            ui.setupUi(form, item)
            a.setSizeHint(form.sizeHint())
            self.resultWidget.insertItem(0, a)
            self.resultWidget.setItemWidget(a, form)
        self.verticalLayout.addWidget(self.resultWidget)
        self.pieBox = QtWidgets.QFrame(self.centralwidget)
        self.pieBox.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.pieBox.setFrameShadow(QtWidgets.QFrame.Raised)
        self.pieBox.setObjectName("pieBox")
        self.verticalLayout.addWidget(self.pieBox)
        '''plot area'''
        plt.rcParams.update({'font.size': 14})
        # a figure instance to plot on
        self.figure = plt.figure(figsize=(2, 2), facecolor='#696969')
        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setParent(self.pieBox)
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.pieBox.setLayout(layout)
        dict = {}
        for url in output:
            url = url.split('://')[-1].split("?")[0].split('/')[0].split(
                ':')[0].lower()
            if url in dict.keys():
                dict[url] += 1
            else:
                dict[url] = 1
        print(dict)
        labels = dict.keys()
        sizes = dict.values()
        colors = ['#006FF6']
        explode = [0.05] * len(sizes)  # explode slices
        self.figure.clear()
        ax = self.figure.add_subplot(111)

        # plot data
        ax.pie(sizes,
               explode=explode,
               labels=labels,
               colors=colors,
               autopct='%1.1f%%',
               shadow=True,
               startangle=90)
        ax.set_title('precentage by website')

        # refresh canvas
        self.canvas.draw()

        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler"))
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def setMain(self, Main):
        self.MainWindow = Main

    def setupUi(self):
        try:
            os.remove('cache.ch')
        except:
            pass
        MainWindow = self.MainWindow
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowModality(QtCore.Qt.WindowModal)
        MainWindow.resize(871, 697)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("SEO_sign-512.png"), QtGui.QIcon.Normal,
                       QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setStyleSheet(
            "background-color: rgb(255, 255, 255);")
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setSpacing(0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setMinimumSize(QtCore.QSize(25, 0))
        self.frame.setStyleSheet("background-color: rgb(255, 255, 255);\n"
                                 "border-color: rgb(0, 0, 0);")
        self.frame.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.frame.setFrameShadow(QtWidgets.QFrame.Plain)
        self.frame.setLineWidth(0)
        self.frame.setObjectName("frame")
        self.horizontalLayout_2.addWidget(self.frame)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        spacerItem = QtWidgets.QSpacerItem(20, 40,
                                           QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.titleLbl = QtWidgets.QLabel(self.centralwidget)
        self.titleLbl.setStyleSheet("font: 26pt \"Tahoma\";\n"
                                    "color: rgb(0, 0, 0);")
        self.titleLbl.setObjectName("titleLbl")
        self.verticalLayout.addWidget(self.titleLbl)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.searchBarEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.searchBarEdit.setMinimumSize(QtCore.QSize(0, 40))
        self.searchBarEdit.setStyleSheet("font: 16pt \"Tahoma\";\n"
                                         "color: rgb(0, 0, 0);")
        self.searchBarEdit.setObjectName("searchBarEdit")
        self.horizontalLayout.addWidget(self.searchBarEdit)
        self.searchButton = QtWidgets.QPushButton(self.centralwidget)
        self.searchButton.setStyleSheet(
            "font: 16pt \"Tahoma\";\n"
            "background-color: rgb(255, 255, 255);\n"
            "color: rgb(0, 0, 0);")
        self.searchButton.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("images.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.searchButton.setIcon(icon1)
        self.searchButton.setIconSize(QtCore.QSize(40, 40))
        self.searchButton.setObjectName("searchButton")
        self.MainWindow = MainWindow
        self.searchButton.clicked.connect(self.search)
        self.horizontalLayout.addWidget(self.searchButton)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        spacerItem1 = QtWidgets.QSpacerItem(40, 20,
                                            QtWidgets.QSizePolicy.Expanding,
                                            QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem1)
        self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_2.setStyleSheet("font: 14pt \"Tahoma\";\n"
                                         "color: rgb(0, 0, 0);")
        self.radioButton_2.setObjectName("radioButton_2")
        self.horizontalLayout_3.addWidget(self.radioButton_2)
        self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton.setStyleSheet("font: 14pt \"Tahoma\";\n"
                                       "color: rgb(0, 0, 0);")
        self.radioButton.setObjectName("radioButton")
        self.horizontalLayout_3.addWidget(self.radioButton)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20,
                                            QtWidgets.QSizePolicy.Expanding,
                                            QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem2)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        spacerItem3 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem3)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)

        spacerItem1 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem1)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.loading = QtWidgets.QLabel(self.centralwidget)
        self.loading.setText("")
        self.loading.setObjectName("loading")
        self.verticalLayout.addWidget(
            self.loading, 0, QtCore.Qt.AlignCenter | QtCore.Qt.AlignBottom)
        self.movie = QMovie("loading.gif", QByteArray(), self.loading)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.loading.setMovie(self.movie)
        self.retranslateUi(MainWindow)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def search(self):
        self.movie.start()
        print(self.movie.state())
        self.sig.connect(self.setupresUi)
        self.t = Thread(self)
        self.t.start()
        self.MainWindow.show()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler"))
        self.titleLbl.setText(_translate("MainWindow", "Web Crawler"))
        self.radioButton_2.setText(_translate("MainWindow", "Web search"))
        self.radioButton.setText(_translate("MainWindow", "Site search"))

    def setresult(self, res):
        self.res = res
Exemple #49
0
class XNCStatusBar(QStatusBar):

    def __init__(self, parent=None):
        super(XNCStatusBar, self).__init__(parent)
        # state vars
        self.world = XNovaWorld_instance()
        # initialization
        self.setSizeGripEnabled(True)
        # sub-widgets
        # progressbar
        self._progressbar = QProgressBar(self)
        self._progressbar.hide()
        self._progressbar.setValue(0)
        self._progressbar.setRange(0, 99)
        # online players counter
        self._lbl_online = QLabel(self.tr('Online') + ': 0', self)
        # label with loading.gif
        self._loading_gif = QMovie(':/i/loading.gif')
        self._lbl_loading = QLabel(self)
        self._lbl_loading.setMovie(self._loading_gif)
        self._lbl_loading.hide()
        # testing only
        self._btn_runscript = QPushButton('Run script', self)
        self._btn_runscript.clicked.connect(self.on_run_script)
        self.addPermanentWidget(self._btn_runscript)
        #
        self.addPermanentWidget(self._lbl_loading)
        self.addPermanentWidget(self._lbl_online)  # should be las right widget
        self.show()

    def set_status(self, msg: str, timeout: int=0):
        self.showMessage(msg, timeout)

    def set_loading_status(self, loading: bool):
        if loading:
            self._lbl_loading.show()
            self._loading_gif.start()
        else:
            self._loading_gif.stop()
            self._lbl_loading.hide()

    def set_world_load_progress(self, comment: str, progress: int):
        """
        Display world load progress in status bar
        :param comment: string comment of what is currently loading
        :param progress: percent progress, or -1 to disable
        """
        if progress != -1:
            if not self._progressbar.isVisible():
                self.insertPermanentWidget(0, self._progressbar)
                self._progressbar.show()
            msg = self.tr('Loading world') + ' ({0}%) {1}...'.format(progress, comment)
            logger.debug(msg)
            self._progressbar.setValue(progress)
            self.set_status(msg)
        else:
            self.removeWidget(self._progressbar)
            self._progressbar.hide()
            self._progressbar.reset()
            self.clearMessage()

    def update_online_players_count(self):
        op = self.world.get_online_players()
        self._lbl_online.setText(self.tr('Online') + ': {0}'.format(op))

# some functions may be useful, documentation:
# void QStatusBar::clearMessage()
# void QStatusBar::addPermanentWidget(QWidget * widget, int stretch = 0)
# void QStatusBar::addWidget(QWidget * widget, int stretch = 0)
# void QStatusBar::removeWidget(QWidget * widget)

    @pyqtSlot()
    def on_run_script(self):
        files = os.listdir('scripts')
        files.sort()
        script_files = [fn for fn in files if fn[0] != '.' and fn.endswith('.py')]
        # print(script_files)
        menu = QMenu(self)
        for script_filename in script_files:
            act = QAction(menu)
            act.setText('Run "scripts/' + script_filename + '"...')
            act.setData('scripts/' + script_filename)
            menu.addAction(act)
        act_ret = menu.exec(QCursor.pos())
        if act_ret is None:
            return
        script_filename = str(act_ret.data())
        s = ''
        try:
            with open(script_filename, 'rt', encoding='utf-8') as f:
                s = f.read()
        except IOError:
            pass
        if s != '':
            exec(s)
Exemple #50
0
class Window(QWidget):
    bgWork: BgThread
    clk_stop_signal = pyqtSignal()
    bg_stop_signal = pyqtSignal()
    fan_signal = pyqtSignal()
    rec_signal = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.full_screen = False
        self.val_list = [0]
        self.dial = [DialWidget(100)] * 8
        self.sensor_name_list = ['General Combustible Gas', 'Alcohol',
                                 'Natural Gas, Methane', 'LPG, Natural Gas, Coal Gas', 'LPG, Propane',\
                                 'Carbon Monoxide', 'Hydrogen', 'Air Quality Control']
        self.sensor_pixmap = [
            'mq2.png', 'mq3.png', 'mq4.png', 'mq5.png', 'mq6.png', 'mq7.png',
            'mq8.png', 'mq135.png'
        ]
        self.sensor_max_list = [255, 255, 255, 255, 255, 255, 255, 255]
        self.sensor_rec_list = [0, 0, 0, 0, 0, 0, 0, 0]
        self.fan_powered = True
        self.connected = False
        self.recording = False
        self.title = 'Telemetrie'
        self.current_page = 0
        self.left = 100
        self.top = 100
        self.width = 1024
        self.height = 600
        self.black_color = '#000000'
        self.gray_color = '#373435'
        self.dark_gray_color = '#1b1a1a'
        self.green_color = '#92d500'
        self.blue_color = '#1bb2bb'
        self.dark_blue_color = '#2e679d'
        self.green_color = '#92d400'
        self.red_color = '#cd3301'
        self.white_color = '#FFFFFF'
        self.font_gray_color = '#828486'
        self.fan_anim = QMovie('res/pack/gas_icon_fan_on.gif')
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        id = QFontDatabase.addApplicationFont(
            'res/font/BreuerText-Regular.ttf')
        # font = QFont(QFontDatabase.applicationFontFamilies(id)[0])
        self.setStyleSheet('background-color:black; font-family: BreuerText')

        # stack pages: 0 - main menu, 1 - meter, 2 - data, 3 - config, 4 - help
        self.page_nr = 5
        self.pages = list()
        for p in range(self.page_nr):
            self.pages.append(QWidget())
        # ######### PAGE 0 MAIN
        self.layout_0 = QVBoxLayout()
        self.layout_0.setContentsMargins(0, 0, 0, 0)

        self.title_box1_0 = QHBoxLayout()
        self.title_box1_0.setContentsMargins(0, 0, 0, 0)

        self.defend_txt_0 = QLabel()
        self.defend_txt_0.setText('DEFEND Gas Sensor Data Fusion')
        self.defend_txt_0.setStyleSheet(
            'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' %
            self.font_gray_color)
        self.title_box1_0.addWidget(self.defend_txt_0)

        self.title_box1_0.addSpacing(15)

        self.menu_grid_txt_0 = QGridLayout()
        self.menu_grid_txt_0.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_txt_0.setSpacing(0)

        self.menu_label_txt_0 = QLabel()
        self.menu_label_txt_0.setText('METER')
        self.menu_label_txt_0.setStyleSheet(
            'font-size: 18px;padding: 0px 33px 0px 28px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_0.addWidget(self.menu_label_txt_0, 0, 0)

        self.uart_label_txt_0 = QLabel()
        self.uart_label_txt_0.setText('DATA')
        self.uart_label_txt_0.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_0.addWidget(self.uart_label_txt_0, 0, 1)

        self.data_label_txt_0 = QLabel()
        self.data_label_txt_0.setText('UART')
        self.data_label_txt_0.setStyleSheet(
            'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_0.addWidget(self.data_label_txt_0, 0, 2)

        self.fan_label_txt_0 = QLabel()
        self.fan_label_txt_0.setText('FAN')
        self.fan_label_txt_0.setStyleSheet(
            'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_0.addWidget(self.fan_label_txt_0, 0, 3)

        self.title_box1_0.addLayout(self.menu_grid_txt_0)

        self.title_box1_0.addSpacing(15)

        self.gmt_label_0 = QLabel()
        self.gmt_label_0.setText('GMT +2')
        self.gmt_label_0.setStyleSheet(
            'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' %
            self.font_gray_color)

        self.title_box1_0.addWidget(self.gmt_label_0)

        self.layout_0.addLayout(self.title_box1_0)

        self.title_box2_0 = QHBoxLayout()  # second title box with pixmaps
        self.title_box2_0.setContentsMargins(0, 0, 0, 0)
        self.title_box2_0.setSpacing(0)

        self.frame1_0 = QFrame()
        self.frame1_0.setFixedWidth(240)
        self.frame1_0.setFixedHeight(80)
        self.frame1_0.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.defend_pix_0 = QLabel(self.frame1_0)
        self.defend_pix_0.setPixmap(QPixmap('res/pack/defend.png'))
        self.defend_pix_0.setFixedWidth(240)
        self.defend_pix_0.setAlignment(Qt.AlignCenter)
        self.title_box2_0.addWidget(self.frame1_0)

        self.title_box2_0.addSpacing(15)

        self.frame2_0 = QFrame()
        self.frame2_0.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame2_0.setFixedWidth(495)
        self.frame2_0.setFixedHeight(80)

        self.menu_grid_pix_0 = QGridLayout(self.frame2_0)
        self.menu_grid_pix_0.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_pix_0.setSpacing(0)

        self.menu_label_pix_0 = QLabel()
        self.menu_label_pix_0.setPixmap(QPixmap('res/pack/gas_icon_meter.png'))
        self.menu_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.menu_label_pix_0.mousePressEvent = self.select_menu_meter
        self.menu_grid_pix_0.addWidget(self.menu_label_pix_0, 0, 0)

        self.uart_label_pix_0 = QLabel()
        self.uart_label_pix_0.setPixmap(QPixmap('res/pack/gas_icon_data.png'))
        self.uart_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.uart_label_pix_0.mousePressEvent = self.select_menu_data
        self.menu_grid_pix_0.addWidget(self.uart_label_pix_0, 0, 1)

        self.data_label_pix_0 = QLabel()
        self.data_label_pix_0.setPixmap(QPixmap('res/pack/gas_icon_UART.png'))
        self.data_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.data_label_pix_0.mousePressEvent = self.select_menu_config
        self.menu_grid_pix_0.addWidget(self.data_label_pix_0, 0, 2)

        self.fan_label_pix_0 = QLabel()
        self.fan_label_pix_0.setMovie(self.fan_anim)
        self.fan_label_pix_0.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.fan_label_pix_0.mousePressEvent = self.toggle_fan
        self.menu_grid_pix_0.addWidget(self.fan_label_pix_0, 0, 3)

        self.title_box2_0.addWidget(self.frame2_0)

        self.title_box2_0.addSpacing(15)

        self.frame3_0 = QFrame()
        self.frame3_0.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame3_0.setFixedWidth(240)
        self.frame3_0.setFixedHeight(80)

        self.clock_box_0 = QHBoxLayout(self.frame3_0)
        self.time_label_pix_0 = QLabel()
        self.time_label_pix_0.setPixmap(QPixmap('res/pack/clock.png'))
        self.time_label_txt_0 = QLabel()
        self.time_label_txt_0.setText('00:00:00')
        self.time_label_txt_0.setStyleSheet('font-size: 40px; color: %s' %
                                            self.white_color)
        self.clock_box_0.addWidget(self.time_label_pix_0)
        self.clock_box_0.addWidget(self.time_label_txt_0)
        self.title_box2_0.addWidget(self.frame3_0)

        self.layout_0.addLayout(self.title_box2_0)

        self.defend_large_label = QLabel()
        self.defend_large_label.setPixmap(QPixmap('res/pack/defend_large.png'))
        self.defend_large_label.setStyleSheet('padding: 0px 0px 0px 0px;')
        self.defend_large_label.setAlignment(Qt.AlignCenter)

        self.layout_0.addSpacing(100)

        self.layout_0.addWidget(self.defend_large_label)

        self.layout_0.addStretch()

        self.pages[0].setLayout(self.layout_0)
        # #################### END PAGE 0

        # ######### PAGE 1 METER
        self.layout_1 = QVBoxLayout()
        self.layout_1.setContentsMargins(0, 0, 0, 0)

        self.title_box1_1 = QHBoxLayout()
        self.title_box1_1.setContentsMargins(0, 0, 0, 0)

        self.defend_txt_1 = QLabel()
        self.defend_txt_1.setText('DEFEND Gas Sensor Data Fusion')
        self.defend_txt_1.setStyleSheet(
            'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' %
            self.font_gray_color)
        self.title_box1_1.addWidget(self.defend_txt_1)

        self.title_box1_1.addSpacing(15)

        self.menu_grid_txt_1 = QGridLayout()
        self.menu_grid_txt_1.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_txt_1.setSpacing(0)

        self.menu_label_txt_1 = QLabel()
        self.menu_label_txt_1.setText('MENU')
        self.menu_label_txt_1.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_1.addWidget(self.menu_label_txt_1, 0, 0)

        self.uart_label_txt_1 = QLabel()
        self.uart_label_txt_1.setText('UART')
        self.uart_label_txt_1.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_1.addWidget(self.uart_label_txt_1, 0, 1)

        self.data_label_txt_1 = QLabel()
        self.data_label_txt_1.setText('DATA')
        self.data_label_txt_1.setStyleSheet(
            'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_1.addWidget(self.data_label_txt_1, 0, 2)

        self.fan_label_txt_1 = QLabel()
        self.fan_label_txt_1.setText('FAN')
        self.fan_label_txt_1.setStyleSheet(
            'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_1.addWidget(self.fan_label_txt_1, 0, 3)

        self.title_box1_1.addLayout(self.menu_grid_txt_1)

        self.title_box1_1.addSpacing(15)

        self.gmt_label_1 = QLabel()
        self.gmt_label_1.setText('GMT +2')
        self.gmt_label_1.setStyleSheet(
            'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' %
            self.font_gray_color)

        self.title_box1_1.addWidget(self.gmt_label_1)

        self.layout_1.addLayout(self.title_box1_1)

        self.title_box2_1 = QHBoxLayout()  # second title box with pixmaps
        self.title_box2_1.setContentsMargins(0, 0, 0, 0)
        self.title_box2_1.setSpacing(0)

        self.frame1_1 = QFrame()
        self.frame1_1.setFixedWidth(240)
        self.frame1_1.setFixedHeight(80)
        self.frame1_1.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.defend_pix_1 = QLabel(self.frame1_1)
        self.defend_pix_1.setPixmap(QPixmap('res/pack/defend.png'))
        self.defend_pix_1.setFixedWidth(240)
        self.defend_pix_1.setAlignment(Qt.AlignCenter)
        self.title_box2_1.addWidget(self.frame1_1)

        self.title_box2_1.addSpacing(15)

        self.frame2_1 = QFrame()
        self.frame2_1.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame2_1.setFixedWidth(495)
        self.frame2_1.setFixedHeight(80)

        self.menu_grid_pix_1 = QGridLayout(self.frame2_1)
        self.menu_grid_pix_1.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_pix_1.setSpacing(0)

        self.menu_label_pix_1 = QLabel()
        self.menu_label_pix_1.setPixmap(
            QPixmap('res/pack/gas_icon_main_menu.png'))
        self.menu_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.menu_label_pix_1.mousePressEvent = self.select_menu_main
        self.menu_grid_pix_1.addWidget(self.menu_label_pix_1, 0, 0)

        self.uart_label_pix_1 = QLabel()
        self.uart_label_pix_1.setPixmap(QPixmap('res/pack/gas_icon_UART.png'))
        self.uart_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.uart_label_pix_1.mousePressEvent = self.select_menu_config
        self.menu_grid_pix_1.addWidget(self.uart_label_pix_1, 0, 1)

        self.data_label_pix_1 = QLabel()
        self.data_label_pix_1.setPixmap(QPixmap('res/pack/gas_icon_data.png'))
        self.data_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.data_label_pix_1.mousePressEvent = self.select_menu_data
        self.menu_grid_pix_1.addWidget(self.data_label_pix_1, 0, 2)

        self.fan_label_pix_1 = QLabel()
        self.fan_label_pix_1.setMovie(self.fan_anim)
        self.fan_label_pix_1.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.fan_label_pix_1.mousePressEvent = self.toggle_fan
        self.menu_grid_pix_1.addWidget(self.fan_label_pix_1, 0, 3)

        self.title_box2_1.addWidget(self.frame2_1)

        self.title_box2_1.addSpacing(15)

        self.frame3_1 = QFrame()
        self.frame3_1.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame3_1.setFixedWidth(240)
        self.frame3_1.setFixedHeight(80)

        self.clock_box_1 = QHBoxLayout(self.frame3_1)
        self.time_label_pix_1 = QLabel()
        self.time_label_pix_1.setPixmap(QPixmap('res/pack/clock.png'))
        self.time_label_txt_1 = QLabel()
        self.time_label_txt_1.setText('00:00:00')
        self.time_label_txt_1.setStyleSheet('font-size: 40px; color: %s' %
                                            self.white_color)
        self.clock_box_1.addWidget(self.time_label_pix_1)
        self.clock_box_1.addWidget(self.time_label_txt_1)
        self.title_box2_1.addWidget(self.frame3_1)

        self.layout_1.addLayout(self.title_box2_1)

        self.sensorsGrid = QGridLayout()
        self.sensorsGrid.setContentsMargins(0, 10, 0, 0)
        self.sensorsGrid.setSpacing(15)
        for j in range(0, 2):
            for k in range(0, 4):
                self.frame = QFrame(self)
                self.frame.setStyleSheet('background-color:%s;' %
                                         self.gray_color)
                self.cell = QVBoxLayout(self.frame)
                self.cell.setContentsMargins(0, 0, 0, 0)

                self.sensorLabel = QLabel()
                self.sensorLabel.setText(self.sensor_name_list[k + 4 * j])
                self.sensorLabel.setStyleSheet(
                    'font-size: 18px;padding: 10px 0px 0px 0px; color: %s;' %
                    self.white_color)
                self.sensorLabel.setAlignment(Qt.AlignHCenter)

                self.dial[k + 4 * j] = DialWidget(self.sensor_max_list[k +
                                                                       4 * j])
                self.dial[k + 4 * j].setFixedHeight(100)
                self.dial[k + 4 * j].setMinimumWidth(170)

                self.modelTxtLabel = QLabel()
                self.modelTxtLabel.setPixmap(
                    QPixmap('res/pack/gas_icon_{}'.format(
                        self.sensor_pixmap[k + 4 * j])))
                self.modelTxtLabel.setAlignment(Qt.AlignLeft | Qt.AlignBottom)
                self.modelTxtLabel.mousePressEvent = lambda ev, nr=k + 4 * j: self.select_menu_help(
                    nr)

                self.cell.addWidget(self.sensorLabel)
                self.cell.addWidget(self.dial[k + 4 * j])
                self.cell.addWidget(self.modelTxtLabel)
                self.sensorsGrid.addWidget(self.frame, j, k)

        # self.layout1.addLayout(self.titleGridtext1)

        self.layout_1.addLayout(self.sensorsGrid)

        self.pages[1].setLayout(self.layout_1)
        # ################### END PAGE 1

        # ######### PAGE 2 DATA
        self.layout_2 = QVBoxLayout()
        self.layout_2.setContentsMargins(0, 0, 0, 0)

        self.title_box1_2 = QHBoxLayout()
        self.title_box1_2.setContentsMargins(0, 0, 0, 0)

        self.defend_txt_2 = QLabel()
        self.defend_txt_2.setText('DEFEND Gas Sensor Data Fusion')
        self.defend_txt_2.setStyleSheet(
            'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' %
            self.font_gray_color)
        self.title_box1_2.addWidget(self.defend_txt_2)

        self.title_box1_2.addSpacing(15)

        self.menu_grid_txt_2 = QGridLayout()
        self.menu_grid_txt_2.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_txt_2.setSpacing(0)

        self.menu_label_txt_2 = QLabel()
        self.menu_label_txt_2.setText('MENU')
        self.menu_label_txt_2.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_2.addWidget(self.menu_label_txt_2, 0, 0)

        self.uart_label_txt_2 = QLabel()
        self.uart_label_txt_2.setText('UART')
        self.uart_label_txt_2.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_2.addWidget(self.uart_label_txt_2, 0, 1)

        self.data_label_txt_2 = QLabel()
        self.data_label_txt_2.setText('METER')
        self.data_label_txt_2.setStyleSheet(
            'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_2.addWidget(self.data_label_txt_2, 0, 2)

        self.fan_label_txt_2 = QLabel()
        self.fan_label_txt_2.setText('FAN')
        self.fan_label_txt_2.setStyleSheet(
            'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_2.addWidget(self.fan_label_txt_2, 0, 3)

        self.title_box1_2.addLayout(self.menu_grid_txt_2)

        self.title_box1_2.addSpacing(15)

        self.gmt_label_2 = QLabel()
        self.gmt_label_2.setText('GMT +2')
        self.gmt_label_2.setStyleSheet(
            'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' %
            self.font_gray_color)

        self.title_box1_2.addWidget(self.gmt_label_2)

        self.layout_2.addLayout(self.title_box1_2)

        self.title_box2_2 = QHBoxLayout()  # second title box with pixmaps
        self.title_box2_2.setContentsMargins(0, 0, 0, 0)
        self.title_box2_2.setSpacing(0)

        self.frame1_2 = QFrame()
        self.frame1_2.setFixedWidth(240)
        self.frame1_2.setFixedHeight(80)
        self.frame1_2.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.defend_pix_2 = QLabel(self.frame1_2)
        self.defend_pix_2.setPixmap(QPixmap('res/pack/defend.png'))
        self.defend_pix_2.setFixedWidth(240)
        self.defend_pix_2.setAlignment(Qt.AlignCenter)
        self.title_box2_2.addWidget(self.frame1_2)

        self.title_box2_2.addSpacing(15)

        self.frame2_2 = QFrame()
        self.frame2_2.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame2_2.setFixedWidth(495)
        self.frame2_2.setFixedHeight(80)

        self.menu_grid_pix_2 = QGridLayout(self.frame2_2)
        self.menu_grid_pix_2.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_pix_2.setSpacing(0)

        self.menu_label_pix_2 = QLabel()
        self.menu_label_pix_2.setPixmap(
            QPixmap('res/pack/gas_icon_main_menu.png'))
        self.menu_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.menu_label_pix_2.mousePressEvent = self.select_menu_main
        self.menu_grid_pix_2.addWidget(self.menu_label_pix_2, 0, 0)

        self.uart_label_pix_2 = QLabel()
        self.uart_label_pix_2.setPixmap(QPixmap('res/pack/gas_icon_UART.png'))
        self.uart_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.uart_label_pix_2.mousePressEvent = self.select_menu_config
        self.menu_grid_pix_2.addWidget(self.uart_label_pix_2, 0, 1)

        self.data_label_pix_2 = QLabel()
        self.data_label_pix_2.setPixmap(QPixmap('res/pack/gas_icon_meter.png'))
        self.data_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.data_label_pix_2.mousePressEvent = self.select_menu_meter
        self.menu_grid_pix_2.addWidget(self.data_label_pix_2, 0, 2)

        self.fan_label_pix_2 = QLabel()
        self.fan_label_pix_2.setMovie(self.fan_anim)
        self.fan_label_pix_2.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.fan_label_pix_2.mousePressEvent = self.toggle_fan
        self.menu_grid_pix_2.addWidget(self.fan_label_pix_2, 0, 3)

        self.title_box2_2.addWidget(self.frame2_2)

        self.title_box2_2.addSpacing(15)

        self.frame3_2 = QFrame()
        self.frame3_2.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame3_2.setFixedWidth(240)
        self.frame3_2.setFixedHeight(80)

        self.clock_box_2 = QHBoxLayout(self.frame3_2)
        self.time_label_pix_2 = QLabel()
        self.time_label_pix_2.setPixmap(QPixmap('res/pack/clock.png'))
        self.time_label_txt_2 = QLabel()
        self.time_label_txt_2.setText('00:00:00')
        self.time_label_txt_2.setStyleSheet('font-size: 40px; color: %s' %
                                            self.white_color)
        self.clock_box_2.addWidget(self.time_label_pix_2)
        self.clock_box_2.addWidget(self.time_label_txt_2)
        self.title_box2_2.addWidget(self.frame3_2)

        self.layout_2.addLayout(self.title_box2_2)

        self.data_label = QLabel()
        self.data_label.setPixmap(QPixmap('res/pack/data_background.png'))

        start_y = 47
        start_x = 700
        dif_y = 35
        dif_x = 90

        # probabilities
        self.acetone_probab_label = QLabel(self.data_label)
        self.acetone_probab_label.setText('0%')
        self.acetone_probab_label.setStyleSheet(
            'background: transparent; border: 0px; width:100px;'
            'border-radius: 10px;font-size: 18px; color: %s' %
            self.white_color)
        self.acetone_probab_label.setAlignment(Qt.AlignCenter)
        self.acetone_probab_label.move(start_x, start_y)

        self.ammonium_probab_label = QLabel(self.data_label)
        self.ammonium_probab_label.setText('0%')
        self.ammonium_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.ammonium_probab_label.setAlignment(Qt.AlignHCenter)
        self.ammonium_probab_label.move(start_x, start_y + dif_y)

        self.benzene_probab_label = QLabel(self.data_label)
        self.benzene_probab_label.setText('0%')
        self.benzene_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.benzene_probab_label.setAlignment(Qt.AlignHCenter)
        self.benzene_probab_label.move(start_x, start_y + 2 * dif_y)

        self.carbon_probab_label = QLabel(self.data_label)
        self.carbon_probab_label.setText('0%')
        self.carbon_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.carbon_probab_label.setAlignment(Qt.AlignHCenter)
        self.carbon_probab_label.move(start_x, start_y + 3 * dif_y)

        self.chlorine_probab_label = QLabel(self.data_label)
        self.chlorine_probab_label.setText('0%')
        self.chlorine_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.chlorine_probab_label.setAlignment(Qt.AlignHCenter)
        self.chlorine_probab_label.move(start_x, start_y + 4 * dif_y)

        self.ethanol_probab_label = QLabel(self.data_label)
        self.ethanol_probab_label.setText('0%')
        self.ethanol_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.ethanol_probab_label.setAlignment(Qt.AlignHCenter)
        self.ethanol_probab_label.move(start_x, start_y + 5 * dif_y)

        self.hydrogen_probab_label = QLabel(self.data_label)
        self.hydrogen_probab_label.setText('0%')
        self.hydrogen_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.hydrogen_probab_label.setAlignment(Qt.AlignHCenter)
        self.hydrogen_probab_label.move(start_x, start_y + 6 * dif_y)

        self.lpg_probab_label = QLabel(self.data_label)
        self.lpg_probab_label.setText('0%')
        self.lpg_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.lpg_probab_label.setAlignment(Qt.AlignHCenter)
        self.lpg_probab_label.move(start_x, start_y + 7 * dif_y)

        self.methane_probab_label = QLabel(self.data_label)
        self.methane_probab_label.setText('0%')
        self.methane_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.methane_probab_label.setAlignment(Qt.AlignHCenter)
        self.methane_probab_label.move(start_x, start_y + 8 * dif_y)

        self.nitrogen_probab_label = QLabel(self.data_label)
        self.nitrogen_probab_label.setText('0%')
        self.nitrogen_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.nitrogen_probab_label.setAlignment(Qt.AlignHCenter)
        self.nitrogen_probab_label.move(start_x, start_y + 9 * dif_y)

        self.propane_probab_label = QLabel(self.data_label)
        self.propane_probab_label.setText('0%')
        self.propane_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.propane_probab_label.setAlignment(Qt.AlignHCenter)
        self.propane_probab_label.move(start_x, start_y + 10 * dif_y)

        self.toluene_probab_label = QLabel(self.data_label)
        self.toluene_probab_label.setText('0%')
        self.toluene_probab_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.toluene_probab_label.setAlignment(Qt.AlignHCenter)
        self.toluene_probab_label.move(start_x, start_y + 11 * dif_y)

        # sensors
        self.acetone_sensors_label = QLabel(self.data_label)
        self.acetone_sensors_label.setText('MQ2 MQ3 MQ4 MQ5 MQ135')
        self.acetone_sensors_label.setStyleSheet(
            'background: transparent; border: 0px; width:100px;'
            'border-radius: 10px;font-size: 18px; color: %s' %
            self.white_color)
        self.acetone_sensors_label.setAlignment(Qt.AlignCenter)
        self.acetone_sensors_label.move(start_x + dif_x, start_y)

        self.ammonium_sensors_label = QLabel(self.data_label)
        self.ammonium_sensors_label.setText('MQ135')
        self.ammonium_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.ammonium_sensors_label.setAlignment(Qt.AlignHCenter)
        self.ammonium_sensors_label.move(start_x + dif_x, start_y + dif_y)

        self.benzene_sensors_label = QLabel(self.data_label)
        self.benzene_sensors_label.setText('MQ3')
        self.benzene_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.benzene_sensors_label.setAlignment(Qt.AlignHCenter)
        self.benzene_sensors_label.move(start_x + dif_x, start_y + 2 * dif_y)

        self.carbon_sensors_label = QLabel(self.data_label)
        self.carbon_sensors_label.setText('MQ2 MQ3 MQ4 MQ6 MQ7')
        self.carbon_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.carbon_sensors_label.setAlignment(Qt.AlignHCenter)
        self.carbon_sensors_label.move(start_x + dif_x, start_y + 3 * dif_y)

        self.chlorine_sensors_label = QLabel(self.data_label)
        self.chlorine_sensors_label.setText('MQ135')
        self.chlorine_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.chlorine_sensors_label.setAlignment(Qt.AlignHCenter)
        self.chlorine_sensors_label.move(start_x + dif_x, start_y + 4 * dif_y)

        self.ethanol_sensors_label = QLabel(self.data_label)
        self.ethanol_sensors_label.setText('MQ2 MQ4 MQ5 MQ135')
        self.ethanol_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.ethanol_sensors_label.setAlignment(Qt.AlignHCenter)
        self.ethanol_sensors_label.move(start_x + dif_x, start_y + 5 * dif_y)

        self.hydrogen_sensors_label = QLabel(self.data_label)
        self.hydrogen_sensors_label.setText('MQ2 MQ4 MQ7 MQ8')
        self.hydrogen_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.hydrogen_sensors_label.setAlignment(Qt.AlignHCenter)
        self.hydrogen_sensors_label.move(start_x + dif_x, start_y + 6 * dif_y)

        self.lpg_sensors_label = QLabel(self.data_label)
        self.lpg_sensors_label.setText('MQ2 MQ3 MQ4 MQ5 MQ6')
        self.lpg_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.lpg_sensors_label.setAlignment(Qt.AlignHCenter)
        self.lpg_sensors_label.move(start_x + dif_x, start_y + 7 * dif_y)

        self.methane_sensors_label = QLabel(self.data_label)
        self.methane_sensors_label.setText('MQ2 MQ3 MQ4 MQ5 MQ6')
        self.methane_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.methane_sensors_label.setAlignment(Qt.AlignHCenter)
        self.methane_sensors_label.move(start_x + dif_x, start_y + 8 * dif_y)

        self.nitrogen_sensors_label = QLabel(self.data_label)
        self.nitrogen_sensors_label.setText('MQ2 MQ4')
        self.nitrogen_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.nitrogen_sensors_label.setAlignment(Qt.AlignHCenter)
        self.nitrogen_sensors_label.move(start_x + dif_x, start_y + 9 * dif_y)

        self.propane_sensors_label = QLabel(self.data_label)
        self.propane_sensors_label.setText('MQ2')
        self.propane_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.propane_sensors_label.setAlignment(Qt.AlignHCenter)
        self.propane_sensors_label.move(start_x + dif_x, start_y + 10 * dif_y)

        self.toluene_sensors_label = QLabel(self.data_label)
        self.toluene_sensors_label.setText('MQ135')
        self.toluene_sensors_label.setStyleSheet(
            'background: transparent; font-size: 18px; color: %s' %
            self.white_color)
        self.toluene_sensors_label.setAlignment(Qt.AlignHCenter)
        self.toluene_sensors_label.move(start_x + dif_x, start_y + 11 * dif_y)

        self.layout_2.addSpacing(10)

        self.layout_2.addWidget(self.data_label)

        self.pages[2].setLayout(self.layout_2)
        # ################### END PAGE 2

        # ######### PAGE 3 CONFIG
        self.layout3 = QVBoxLayout()
        self.layout3.setContentsMargins(0, 0, 0, 0)

        self.title_box1_3 = QHBoxLayout()
        self.title_box1_3.setContentsMargins(0, 0, 0, 0)

        self.defend_txt_3 = QLabel()
        self.defend_txt_3.setText('DEFEND Gas Sensor Data Fusion')
        self.defend_txt_3.setStyleSheet(
            'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' %
            self.font_gray_color)
        self.title_box1_3.addWidget(self.defend_txt_3)

        self.title_box1_3.addSpacing(15)

        self.menu_grid_txt_3 = QGridLayout()
        self.menu_grid_txt_3.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_txt_3.setSpacing(0)

        self.menu_label_txt_3 = QLabel()
        self.menu_label_txt_3.setText('MENU')
        self.menu_label_txt_3.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_3.addWidget(self.menu_label_txt_3, 0, 0)

        self.uart_label_txt_3 = QLabel()
        self.uart_label_txt_3.setText('METER')
        self.uart_label_txt_3.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_3.addWidget(self.uart_label_txt_3, 0, 1)

        self.data_label_txt_3 = QLabel()
        self.data_label_txt_3.setText('DATA')
        self.data_label_txt_3.setStyleSheet(
            'font-size: 18px;padding: 0px 38px 0px 28px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_3.addWidget(self.data_label_txt_3, 0, 2)

        self.fan_label_txt_3 = QLabel()
        self.fan_label_txt_3.setText('FAN')
        self.fan_label_txt_3.setStyleSheet(
            'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_3.addWidget(self.fan_label_txt_3, 0, 3)

        self.title_box1_3.addLayout(self.menu_grid_txt_3)

        self.title_box1_3.addSpacing(15)

        self.gmt_label_3 = QLabel()
        self.gmt_label_3.setText('GMT +2')
        self.gmt_label_3.setStyleSheet(
            'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' %
            self.font_gray_color)

        self.title_box1_3.addWidget(self.gmt_label_3)

        self.title_box2_3 = QHBoxLayout()  # second title box with pixmaps
        self.title_box2_3.setContentsMargins(0, 0, 0, 0)
        self.title_box2_3.setSpacing(0)

        self.frame1_3 = QFrame()
        self.frame1_3.setFixedWidth(240)
        self.frame1_3.setFixedHeight(80)
        self.frame1_3.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.defend_pix_3 = QLabel(self.frame1_3)
        self.defend_pix_3.setPixmap(QPixmap('res/pack/defend.png'))
        self.defend_pix_3.setFixedWidth(240)
        self.defend_pix_3.setAlignment(Qt.AlignCenter)
        self.title_box2_3.addWidget(self.frame1_3)

        self.title_box2_3.addSpacing(15)

        self.frame2_3 = QFrame()
        self.frame2_3.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame2_3.setFixedWidth(495)
        self.frame2_3.setFixedHeight(80)

        self.menu_grid_pix_3 = QGridLayout(self.frame2_3)
        self.menu_grid_pix_3.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_pix_3.setSpacing(0)

        self.menu_label_pix_3 = QLabel()
        self.menu_label_pix_3.setPixmap(
            QPixmap('res/pack/gas_icon_main_menu.png'))
        self.menu_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.menu_label_pix_3.mousePressEvent = self.select_menu_main
        self.menu_grid_pix_3.addWidget(self.menu_label_pix_3, 0, 0)

        self.uart_label_pix_3 = QLabel()
        self.uart_label_pix_3.setPixmap(QPixmap('res/pack/gas_icon_meter.png'))
        self.uart_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.uart_label_pix_3.mousePressEvent = self.select_menu_meter
        self.menu_grid_pix_3.addWidget(self.uart_label_pix_3, 0, 1)

        self.data_label_pix_3 = QLabel()
        self.data_label_pix_3.setPixmap(QPixmap('res/pack/gas_icon_data.png'))
        self.data_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.data_label_pix_3.mousePressEvent = self.select_menu_data
        self.menu_grid_pix_3.addWidget(self.data_label_pix_3, 0, 2)

        self.fan_label_pix_3 = QLabel()
        self.fan_label_pix_3.setMovie(self.fan_anim)
        self.fan_label_pix_3.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.fan_label_pix_3.mousePressEvent = self.toggle_fan
        self.menu_grid_pix_3.addWidget(self.fan_label_pix_3, 0, 3)

        self.title_box2_3.addWidget(self.frame2_3)

        self.title_box2_3.addSpacing(15)

        self.frame3_3 = QFrame()
        self.frame3_3.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame3_3.setFixedWidth(240)
        self.frame3_3.setFixedHeight(80)

        self.clock_box_3 = QHBoxLayout(self.frame3_3)
        self.time_label_pix_3 = QLabel()
        self.time_label_pix_3.setPixmap(QPixmap('res/pack/clock.png'))
        self.time_label_txt_3 = QLabel()
        self.time_label_txt_3.setText('00:00:00')
        self.time_label_txt_3.setStyleSheet('font-size: 40px; color: %s' %
                                            self.white_color)
        self.clock_box_3.addWidget(self.time_label_pix_3)
        self.clock_box_3.addWidget(self.time_label_txt_3)
        self.title_box2_3.addWidget(self.frame3_3)

        self.label33 = QLabel()
        self.label33.setText('CONNECT SERIAL')
        self.label33.setStyleSheet(
            'font-size: 40px; padding:50px 10px 0px 5px; color: %s;height:20px'
            % self.green_color)
        self.label33.mousePressEvent = self.toggle_serial

        self.label3 = QLabel()
        self.label3.setText('START REC')
        self.label3.setStyleSheet(
            'font-size: 40px; padding:50px 10px 0px 5px; color: %s;height:20px'
            % self.green_color)
        self.label3.mousePressEvent = self.toggle_recording

        self.layout3.addLayout(self.title_box1_3)
        self.layout3.addLayout(self.title_box2_3)
        self.layout3.addWidget(self.label33)
        self.layout3.addWidget(self.label3)
        self.layout3.addStretch()
        self.pages[3].setLayout(self.layout3)
        # ################### END PAGE 3

        # ######### PAGE 4 MQ HELP
        self.layout_4 = QVBoxLayout()
        self.layout_4.setContentsMargins(0, 0, 0, 0)

        self.title_box1_4 = QHBoxLayout()
        self.title_box1_4.setContentsMargins(0, 0, 0, 0)

        self.defend_txt_4 = QLabel()
        self.defend_txt_4.setText('DEFEND Gas Sensor Data Fusion')
        self.defend_txt_4.setStyleSheet(
            'font-size: 18px; padding:0px 0px 0px 0px; color: %s;height:20px' %
            self.font_gray_color)
        self.title_box1_4.addWidget(self.defend_txt_4)

        self.title_box1_4.addSpacing(15)

        self.menu_grid_txt_4 = QGridLayout()
        self.menu_grid_txt_4.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_txt_4.setSpacing(0)

        self.menu_label_txt_4 = QLabel()
        self.menu_label_txt_4.setText('MENU')
        self.menu_label_txt_4.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 30px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_4.addWidget(self.menu_label_txt_4, 0, 0)

        self.uart_label_txt_4 = QLabel()
        self.uart_label_txt_4.setText('UART')
        self.uart_label_txt_4.setStyleSheet(
            'font-size: 18px;padding: 0px 35px 0px 35px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_4.addWidget(self.uart_label_txt_4, 0, 1)

        self.data_label_txt_4 = QLabel()
        self.data_label_txt_4.setText('METER')
        self.data_label_txt_4.setStyleSheet(
            'font-size: 18px;padding: 0px 40px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_4.addWidget(self.data_label_txt_4, 0, 2)

        self.fan_label_txt_4 = QLabel()
        self.fan_label_txt_4.setText('FAN')
        self.fan_label_txt_4.setStyleSheet(
            'font-size: 18px;padding: 0px 45px 0px 40px; color: %s;' %
            self.font_gray_color)
        self.menu_grid_txt_4.addWidget(self.fan_label_txt_4, 0, 3)

        self.title_box1_4.addLayout(self.menu_grid_txt_4)

        self.title_box1_4.addSpacing(15)

        self.gmt_label_4 = QLabel()
        self.gmt_label_4.setText('GMT +2')
        self.gmt_label_4.setStyleSheet(
            'font-size: 18px;padding: 0px 0px 0px 90px; color: %s;' %
            self.font_gray_color)

        self.title_box1_4.addWidget(self.gmt_label_4)

        self.layout_4.addLayout(self.title_box1_4)

        self.title_box2_4 = QHBoxLayout()  # second title box with pixmaps
        self.title_box2_4.setContentsMargins(0, 0, 0, 0)
        self.title_box2_4.setSpacing(0)

        self.frame1_4 = QFrame()
        self.frame1_4.setFixedWidth(240)
        self.frame1_4.setFixedHeight(80)
        self.frame1_4.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.defend_pix_4 = QLabel(self.frame1_4)
        self.defend_pix_4.setPixmap(QPixmap('res/pack/defend.png'))
        self.defend_pix_4.setFixedWidth(240)
        self.defend_pix_4.setAlignment(Qt.AlignCenter)
        self.title_box2_4.addWidget(self.frame1_4)

        self.title_box2_4.addSpacing(15)

        self.frame2_4 = QFrame()
        self.frame2_4.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame2_4.setFixedWidth(495)
        self.frame2_4.setFixedHeight(80)

        self.menu_grid_pix_4 = QGridLayout(self.frame2_4)
        self.menu_grid_pix_4.setContentsMargins(0, 0, 0, 0)
        self.menu_grid_pix_4.setSpacing(0)

        self.menu_label_pix_4 = QLabel()
        self.menu_label_pix_4.setPixmap(
            QPixmap('res/pack/gas_icon_main_menu.png'))
        self.menu_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.menu_label_pix_4.mousePressEvent = self.select_menu_main
        self.menu_grid_pix_4.addWidget(self.menu_label_pix_4, 0, 0)

        self.uart_label_pix_4 = QLabel()
        self.uart_label_pix_4.setPixmap(QPixmap('res/pack/gas_icon_UART.png'))
        self.uart_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.uart_label_pix_4.mousePressEvent = self.select_menu_config
        self.menu_grid_pix_4.addWidget(self.uart_label_pix_4, 0, 1)

        self.data_label_pix_4 = QLabel()
        self.data_label_pix_4.setPixmap(QPixmap('res/pack/gas_icon_meter.png'))
        self.data_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.data_label_pix_4.mousePressEvent = self.select_menu_meter
        self.menu_grid_pix_4.addWidget(self.data_label_pix_4, 0, 2)

        self.fan_label_pix_4 = QLabel()
        self.fan_label_pix_4.setMovie(self.fan_anim)
        self.fan_label_pix_4.setStyleSheet('padding: 5px 30px 0px 30px;')
        self.fan_label_pix_4.mousePressEvent = self.toggle_fan
        self.menu_grid_pix_4.addWidget(self.fan_label_pix_4, 0, 3)

        self.title_box2_4.addWidget(self.frame2_4)

        self.title_box2_4.addSpacing(15)

        self.frame3_4 = QFrame()
        self.frame3_4.setStyleSheet(
            'background-color:%s; border: 0px; border-radius: 10px;' %
            self.dark_gray_color)
        self.frame3_4.setFixedWidth(240)
        self.frame3_4.setFixedHeight(80)

        self.clock_box_4 = QHBoxLayout(self.frame3_4)
        self.time_label_pix_4 = QLabel()
        self.time_label_pix_4.setPixmap(QPixmap('res/pack/clock.png'))
        self.time_label_txt_4 = QLabel()
        self.time_label_txt_4.setText('00:00:00')
        self.time_label_txt_4.setStyleSheet('font-size: 40px; color: %s' %
                                            self.white_color)
        self.clock_box_4.addWidget(self.time_label_pix_4)
        self.clock_box_4.addWidget(self.time_label_txt_4)
        self.title_box2_4.addWidget(self.frame3_4)

        self.layout_4.addLayout(self.title_box2_4)

        self.layout_4.addSpacing(10)

        self.sensor_details_label = QLabel()
        self.layout_4.addWidget(self.sensor_details_label)

        self.sensor_details_graph = GraphWidget(self.sensor_details_label)
        self.sensor_details_graph.move(20, 330)
        self.sensor_details_graph.resize(945, 120)

        self.pages[4].setLayout(self.layout_4)
        # ################### END PAGE 4

        self.fan_anim.start()

        # ######### STACK
        self.stack = QStackedWidget()
        for page in self.pages:
            self.stack.addWidget(page)
        self.stack.setCurrentIndex(0)

        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.stack)
        self.setLayout(self.mainLayout)
        if self.full_screen is True:
            self.showFullScreen()
        else:
            self.show()
        # ###################

    def keyPressEvent(self, event):
        # ESC
        if event.key() == Qt.Key_Escape:
            self.clk_stop_signal.emit()
            self.close()
        elif event.key() == Qt.Key_0:
            self.stack.setCurrentIndex(0)
        elif event.key() == Qt.Key_1:
            self.stack.setCurrentIndex(1)
        elif event.key() == Qt.Key_2:
            self.stack.setCurrentIndex(2)
        elif event.key() == Qt.Key_3:
            self.stack.setCurrentIndex(3)
        elif event.key() == Qt.Key_4:
            self.stack.setCurrentIndex(4)

    def select_menu_main(self, ev):
        self.stack.setCurrentIndex(0)
        self.current_page = 0

    def select_menu_meter(self, ev):
        self.stack.setCurrentIndex(1)
        self.current_page = 1

    def select_menu_data(self, ev):
        self.stack.setCurrentIndex(2)
        self.current_page = 2

    def select_menu_config(self, ev):
        self.stack.setCurrentIndex(3)
        self.current_page = 3

    def select_menu_help(self, sensor_nr):
        self.sensor_details_label.setPixmap(
            QPixmap('res/pack/data_%s' % self.sensor_pixmap[sensor_nr]))
        self.stack.setCurrentIndex(4)
        self.current_page = 4
        print(sensor_nr)

    def toggle_fan(self, ev):
        self.fan_powered = not self.fan_powered
        if self.fan_powered:
            self.fan_anim.start()
        else:
            self.fan_anim.stop()
        self.fan_signal.emit()

    def toggle_recording(self, ev):
        self.recording = not self.recording
        if self.recording:
            self.label3.setText('STOP REC')
            self.label3.setStyleSheet(
                'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px'
                % self.red_color)
        else:
            self.label3.setText('START REC')
            self.label3.setStyleSheet(
                'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px'
                % self.green_color)
        self.rec_signal.emit()

    def toggle_serial(self, ev):
        self.connected = not self.connected

        if self.connected:
            self.bgWork = BgThread()
            self.bgWork.signal_data.connect(self.data_slot)
            self.fan_signal.connect(self.bgWork.fanCmd)
            self.bg_stop_signal.connect(self.bgWork.endJob)
            self.rec_signal.connect(self.bgWork.recCmd)
            self.bgWork.start()

            self.label33.setText('DISCONNECT SERIAL')
            self.label33.setStyleSheet(
                'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px'
                % self.red_color)
        else:
            self.bg_stop_signal.emit()
            self.label33.setText('CONNECT SERIAL')
            self.label33.setStyleSheet(
                'font-size: 40px; padding: 50px 0px 0px 5px; color: %s;height:20px'
                % self.green_color)

    @pyqtSlot(list)
    def data_slot(self, vals):
        for k in range(len(vals)):
            self.dial[k].update_fig(vals[k])
            if self.sensor_rec_list[k] < vals[k]:
                self.sensor_rec_list[k] = vals[k]

    @pyqtSlot(str)
    def telemetry_select_slot(self, robo_name):
        self.robotLabel.setText(robo_name)

    @pyqtSlot(str)
    def clock_slot(self, t):
        self.time_label_txt_0.setText(t)
        self.time_label_txt_1.setText(t)
        self.time_label_txt_2.setText(t)
        self.time_label_txt_3.setText(t)
        self.time_label_txt_4.setText(t)
Exemple #51
0
def init_pages():
    # Page 1
    set_shadow_effect(window.page_1_dialog)
    window.continue_button_active.hide()
    window.state_checkbox.stateChanged.connect(_state_checkbox_changed)
    window.continue_button_active.clicked.connect(next_page)

    # Page 2
    set_shadow_effect(window.page_2_dialog)
    window.gender_error_label.hide()
    window.edu_error_label.hide()
    window.ethnic_error_label.hide()
    window.age_input.setAttribute(Qt.WA_MacShowFocusRect, 0)
    window.ethnic_input.setAttribute(Qt.WA_MacShowFocusRect, 0)
    window.age_input.textChanged.connect(check_age)
    window.male_radio.toggled.connect(check_gender)
    window.female_radio.toggled.connect(check_gender)
    window.edu_combo.currentIndexChanged.connect(check_edu)
    window.ethnic_combo.currentIndexChanged.connect(check_ethnic)
    window.ethnic_input.textChanged.connect(check_ethnic)
    window.continue_button.clicked.connect(_continue_button_clicked)

    # Page 3
    set_shadow_effect(window.page_3_dialog)
    window.intro_text.setPlainText(window.intro_text.toPlainText().format(
        cfg['num_rounds'], cfg['multiplier']))
    window.start_button.clicked.connect(next_page)

    # Page 4
    set_shadow_effect(window.page_4_dialog)
    window.avatar_panel.hide()
    window.agent_avatar_1.hide()
    window.agent_name_label.hide()
    window.agent_age_label.hide()
    window.agent_gender_label.hide()
    window.agent_edu_label.hide()
    window.agent_ethnic_label.hide()
    window.loading_icon.hide()
    window.okay_button.hide()
    window.user_avatar_error_label.hide()
    window.user_name_error_label.hide()
    window.user_name_input.setAttribute(Qt.WA_MacShowFocusRect, 0)
    window.user_name_input.textChanged.connect(check_name)
    window.match_button.clicked.connect(_match_button_clicked)
    window.okay_button.clicked.connect(next_page)
    window.user_avatar_1 = QAvatar('default-avatar', _user_avatar_clicked,
                                   window.user_avatar_1)
    for i, avatar in enumerate(AVATARS):
        QAvatar(avatar, _avatar_clicked, getattr(window, f'avatar_{i}'))
    loading = QMovie('assets/loading.gif')
    loading.start()
    window.loading_icon.setMovie(loading)

    # Page 5
    set_shadow_effect(window.page_5_dialog)
    window.user_name.hide()
    window.agent_name.hide()
    window.user_avatar_2.hide()
    window.agent_avatar_2.hide()
    window.dealing_icon.hide()
    window.result_button.hide()
    window.invest_error_label.hide()
    window.invest_input.setAttribute(Qt.WA_MacShowFocusRect, 0)
    window.total_coins_label.setText(str(sess['coins']))
    window.invest_input.textChanged.connect(check_invest)
    window.confirm_button.clicked.connect(_confirm_button_clicked)
    window.result_button.clicked.connect(_result_button_clicked)
    dealing = QMovie('assets/dealing.gif')
    dealing.start()
    window.dealing_icon.setMovie(dealing)

    # Page 6
    set_shadow_effect(window.page_6_dialog)
    window.finish_button.clicked.connect(_finish_button_clicked)
Exemple #52
0
class Radar(QtGui.QLabel):
    def __init__(self, parent, radar, rect, myname):
        global xscale, yscale
        self.myname = myname
        self.rect = rect
        self.satellite = Config.satellite
        try:
            if radar["satellite"]:
                self.satellite = 1
        except KeyError:
            pass
        self.baseurl = self.mapurl(radar, rect, False)
        print("google map base url: " + self.baseurl)
        self.mkurl = self.mapurl(radar, rect, True)
        self.wxurl = self.radarurl(radar, rect)
        print("radar url: " + self.wxurl)
        QtGui.QLabel.__init__(self, parent)
        self.interval = Config.radar_refresh * 60
        self.lastwx = 0
        self.retries = 0

        self.setObjectName("radar")
        self.setGeometry(rect)
        self.setStyleSheet("#radar { background-color: grey; }")
        self.setAlignment(Qt.AlignCenter)

        self.wwx = QtGui.QLabel(self)
        self.wwx.setObjectName("wx")
        self.wwx.setStyleSheet("#wx { background-color: transparent; }")
        self.wwx.setGeometry(0, 0, rect.width(), rect.height())

        self.wmk = QtGui.QLabel(self)
        self.wmk.setObjectName("mk")
        self.wmk.setStyleSheet("#mk { background-color: transparent; }")
        self.wmk.setGeometry(0, 0, rect.width(), rect.height())

        self.wxmovie = QMovie()

    def mapurl(self, radar, rect, markersonly):
        # 'https://maps.googleapis.com/maps/api/staticmap?maptype=hybrid&center='+rcenter.lat+','+rcenter.lng+'&zoom='+rzoom+'&size=300x275'+markersr;
        urlp = []

        if len(ApiKeys.googleapi) > 0:
            urlp.append('key=' + ApiKeys.googleapi)
        urlp.append('center=' + str(radar['center'].lat) + ',' +
                    str(radar['center'].lng))
        zoom = radar['zoom']
        rsize = rect.size()
        if rsize.width() > 640 or rsize.height() > 640:
            rsize = QtCore.QSize(rsize.width() / 2, rsize.height() / 2)
            zoom -= 1
        urlp.append('zoom=' + str(zoom))
        urlp.append('size=' + str(rsize.width()) + 'x' + str(rsize.height()))
        if markersonly:
            urlp.append('style=visibility:off')
        else:
            urlp.append('maptype=hybrid')
        for marker in radar['markers']:
            marks = []
            for opts in marker:
                if opts != 'location':
                    marks.append(opts + ':' + marker[opts])
            marks.append(
                str(marker['location'].lat) + ',' +
                str(marker['location'].lng))
            urlp.append('markers=' + '|'.join(marks))

        return 'http://maps.googleapis.com/maps/api/staticmap?' + \
            '&'.join(urlp)

    def radarurl(self, radar, rect):
        # wuprefix = 'http://api.wunderground.com/api/';
        # wuprefix+wuapi+'/animatedradar/image.gif?maxlat='+rNE.lat+'&maxlon='+
        #       rNE.lng+'&minlat='+rSW.lat+'&minlon='+rSW.lng+wuoptionsr;
        # wuoptionsr = '&width=300&height=275&newmaps=0&reproj.automerc=1&num=5
        #       &delay=25&timelabel=1&timelabel.y=10&rainsnow=1&smooth=1';
        rr = getCorners(radar['center'], radar['zoom'], rect.width(),
                        rect.height())
        if self.satellite:
            return (Config.wuprefix + ApiKeys.wuapi +
                    '/animatedsatellite/lang:' + Config.wuLanguage +
                    '/image.gif' + '?maxlat=' + str(rr['N']) + '&maxlon=' +
                    str(rr['E']) + '&minlat=' + str(rr['S']) + '&minlon=' +
                    str(rr['W']) + '&width=' + str(rect.width()) + '&height=' +
                    str(rect.height()) +
                    '&newmaps=0&reproj.automerc=1&num=5&delay=25' +
                    '&timelabel=1&timelabel.y=10&smooth=1&key=sat_ir4_bottom')
        else:
            return (Config.wuprefix + ApiKeys.wuapi + '/animatedradar/lang:' +
                    Config.wuLanguage + '/image.gif' + '?maxlat=' +
                    str(rr['N']) + '&maxlon=' + str(rr['E']) + '&minlat=' +
                    str(rr['S']) + '&minlon=' + str(rr['W']) + '&width=' +
                    str(rect.width()) + '&height=' + str(rect.height()) +
                    '&newmaps=0&reproj.automerc=1&num=5&delay=25' +
                    '&timelabel=1&timelabel.y=10&rainsnow=1&smooth=1' +
                    '&radar_bitmap=1&xnoclutter=1&xnoclutter_mask=1&cors=1')

    def basefinished(self):
        if self.basereply.error() != QNetworkReply.NoError:
            return
        self.basepixmap = QPixmap()
        self.basepixmap.loadFromData(self.basereply.readAll())
        if self.basepixmap.size() != self.rect.size():
            self.basepixmap = self.basepixmap.scaled(self.rect.size(),
                                                     Qt.KeepAspectRatio,
                                                     Qt.SmoothTransformation)
        if self.satellite:
            p = QPixmap(self.basepixmap.size())
            p.fill(Qt.transparent)
            painter = QPainter()
            painter.begin(p)
            painter.setOpacity(0.6)
            painter.drawPixmap(0, 0, self.basepixmap)
            painter.end()
            self.basepixmap = p
            self.wwx.setPixmap(self.basepixmap)
        else:
            self.setPixmap(self.basepixmap)

    def mkfinished(self):
        if self.mkreply.error() != QNetworkReply.NoError:
            return
        self.mkpixmap = QPixmap()
        self.mkpixmap.loadFromData(self.mkreply.readAll())
        if self.mkpixmap.size() != self.rect.size():
            self.mkpixmap = self.mkpixmap.scaled(self.rect.size(),
                                                 Qt.KeepAspectRatio,
                                                 Qt.SmoothTransformation)
        br = QBrush(QColor(Config.dimcolor))
        painter = QPainter()
        painter.begin(self.mkpixmap)
        painter.fillRect(0, 0, self.mkpixmap.width(), self.mkpixmap.height(),
                         br)
        painter.end()
        self.wmk.setPixmap(self.mkpixmap)

    def wxfinished(self):
        if self.wxreply.error() != QNetworkReply.NoError:
            print ("get radar error " + self.myname + ":" + \
                str(self.wxreply.error()))
            self.lastwx = 0
            return
        print("radar map received:" + self.myname + ":" + time.ctime())
        self.wxmovie.stop()
        self.wxdata = QtCore.QByteArray(self.wxreply.readAll())
        self.wxbuff = QtCore.QBuffer(self.wxdata)
        self.wxbuff.open(QtCore.QIODevice.ReadOnly)
        mov = QMovie(self.wxbuff, 'GIF')
        print ("radar map frame count:" + self.myname + ":" + \
            str(mov.frameCount()) + ":r" + str(self.retries))
        if mov.frameCount() > 2:
            self.lastwx = time.time()
            self.retries = 0
        else:
            # radar image retreval failed
            if self.retries > 3:
                # give up, last successful animation stays.
                # the next normal radar_refresh time (default 10min) will apply
                self.lastwx = time.time()
                return

            self.lastwx = 0
            # count retries
            self.retries = self.retries + 1
            # retry in 5 seconds
            QtCore.QTimer.singleShot(5 * 1000, self.getwx)
            return
        self.wxmovie = mov
        if self.satellite:
            self.setMovie(self.wxmovie)
        else:
            self.wwx.setMovie(self.wxmovie)
        if self.parent().isVisible():
            self.wxmovie.start()

    def getwx(self):
        global lastapiget
        i = 0.1
        # making sure there is at least 2 seconds between radar api calls
        lastapiget += 2
        if time.time() > lastapiget:
            lastapiget = time.time()
        else:
            i = lastapiget - time.time()
        print("get radar api call spacing oneshot get i=" + str(i))
        QtCore.QTimer.singleShot(i * 1000, self.getwx2)

    def getwx2(self):
        global manager
        try:
            if self.wxreply.isRunning():
                return
        except Exception:
            pass
        print("getting radar map " + self.myname + ":" + time.ctime())
        self.wxreq = QNetworkRequest(
            QUrl(self.wxurl + '&rrrand=' + str(time.time())))
        self.wxreply = manager.get(self.wxreq)
        QtCore.QObject.connect(self.wxreply, QtCore.SIGNAL("finished()"),
                               self.wxfinished)

    def getbase(self):
        global manager
        self.basereq = QNetworkRequest(QUrl(self.baseurl))
        self.basereply = manager.get(self.basereq)
        QtCore.QObject.connect(self.basereply, QtCore.SIGNAL("finished()"),
                               self.basefinished)

    def getmk(self):
        global manager
        self.mkreq = QNetworkRequest(QUrl(self.mkurl))
        self.mkreply = manager.get(self.mkreq)
        QtCore.QObject.connect(self.mkreply, QtCore.SIGNAL("finished()"),
                               self.mkfinished)

    def start(self, interval=0):
        if interval > 0:
            self.interval = interval
        self.getbase()
        self.getmk()
        self.timer = QtCore.QTimer()
        QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"),
                               self.getwx)

    def wxstart(self):
        print("wxstart for " + self.myname)
        if (self.lastwx == 0 or (self.lastwx + self.interval) < time.time()):
            self.getwx()
        # random 1 to 10 seconds added to refresh interval to spread the
        # queries over time
        i = (self.interval + random.uniform(1, 10)) * 1000
        self.timer.start(i)
        self.wxmovie.start()
        QtCore.QTimer.singleShot(1000, self.wxmovie.start)

    def wxstop(self):
        print("wxstop for " + self.myname)
        self.timer.stop()
        self.wxmovie.stop()

    def stop(self):
        try:
            self.timer.stop()
            self.timer = None
            if self.wxmovie:
                self.wxmovie.stop()
        except Exception:
            pass
Exemple #53
0
 def __evt_loadstarted(self):
     if  not self.__loadlabel.movie():
         movie = QMovie(getPath('iconDir','loading.gif'), QByteArray(), self.__loadlabel)
         movie.setSpeed(50)
         self.__loadlabel.setMovie(movie)
         movie.start()
Exemple #54
0
class InstallableTitlecard(QGroupBox):
    """An titlecard for the install page in the settings view"""
    def __init__(self, pluginEntry, parent):
        """PluginEntry QWidget -> Void
        Consumes a PluginEntry and the parent widget of the titlecard
        sets up the titlecard to the pluginEntry"""
        super().__init__()
        self.__parent = parent
        self._pluginEntry = pluginEntry
        # Should be set to 150, when there a some kind of info link / button.
        self.setMaximumHeight(300)

        bottom = QWidget()
        hbox = QHBoxLayout()
        bottom_label = QLabel(pluginEntry["author"])
        bottom_label.setMargin(0)
        bottom_label.setIndent(0)
        hbox.addWidget(bottom_label)

        moreInfoLabel = QLabel("<a href='%s'>Details</a>"
                               % pluginEntry["details"])
        moreInfoLabel.setOpenExternalLinks(True)
        hbox.addWidget(moreInfoLabel)

        button_box = QDialogButtonBox(self)
        self.installButton = button_box.addButton(
            'Install', QDialogButtonBox.DestructiveRole
        )
        self.installButton.setCheckable(True)
        self.installButton.clicked.connect(self._onInstallButtonClicked)
        self.installButton.setIcon(QIcon.fromTheme("run-install",
                                                   QIcon(DOWNLOAD_ICON_PATH)))

        hbox.addWidget(button_box)
        bottom.setLayout(hbox)
        bottom.setContentsMargins(0, 0, 0, 0)

        pluginInfoLabel = QLabel(
            """
            <h2>%s <small>%s</small></h2>
            <p>%s</p>
            <p></p>"""
            % (pluginEntry["name"],
               pluginEntry["version"],
               pluginEntry["description"]))
        pluginInfoLabel.setWordWrap(True)
        vbox = QVBoxLayout()
        vbox.addWidget(pluginInfoLabel)
        vbox.addWidget(bottom)

        self.setLayout(vbox)

    def _standardIconFromStyle(self, iconName):
        """String -> QIcon
        Consumes the iconName for a given standard icon
        returns the corresponding icon on the current platform."""
        return self.style().standardIcon(getattr(QStyle, iconName))

    def _setInstallButtonIcon(self, frame):
        """QFrame -> Void
        Handles everey new frame in the spinner animation"""
        self.installButton.setIcon(QIcon(self._spinner.currentPixmap()))

    def _enablePluginInConfig(self, name):
        """String -> Bool
        Consumes the name of a plugin and enables it in the config"""
        return self._togglePluginInConfig(name, True)

    def _disablePluginInConfig(self, name):
        """String -> Bool
        Consumes the name of a plugin and disables it in the config"""
        return self._togglePluginInConfig(name, False)

    def _togglePluginInConfig(self, name, state):
        """String Bool -> Bool
        Consumes a name of a plugin and a state, sets the setting to state.
        If no setting is available for the plugin, it gets created.
        Returns the setting (Bool)
        """
        if name not in core.config()["PluginManager"]["Plugins"]:
            core.config()["PluginManager"]["Plugins"][name] = {}
        core.config()["PluginManager"]["Plugins"][name]["Enabled"] = state
        return core.config()["PluginManager"]["Plugins"][name]["Enabled"]

    def _onInstallButtonClicked(self):
        """Handler for install button"""
        url = self._pluginEntry["download"]
        tmpName = str(uuid.uuid4()) + ".zip"
        self._downloadPath = os.path.join(TMP, tmpName)

        downloadThread = DownloadPluginThread(url, self._downloadPath)
        downloadThread.success.connect(self._onDownloadSuccess)
        downloadThread.failed.connect(self._onDownloadFailed)
        downloadThread.start()

        self._spinner = QMovie(SPINNER_ICON_PATH)
        self._spinner.frameChanged.connect(self._setInstallButtonIcon)
        self._spinner.start()
        self.installButton.setText("Installing...")
        self.installButton.setDisabled(True)

    def _onDownloadSuccess(self):
        """Install plugin if download succeeded"""
        helper.extractPlugin(self._downloadPath)
        # DONE rename folder to name Without version number
        newFolderName = self.modulename()
        oldFolderName = newFolderName + "-" + self._pluginEntry["version"]
        helper.renamePluginFolder(oldFolderName, newFolderName)
        # DONE load plugin
        self.__parent.addPluginToUserPlugins(self)
        self.setParent(None)

    def _onDownloadFailed(self):
        """Cleans up, if the download failed"""
        self.installButton.setIcon(QIcon.fromTheme("run-install",
                                                   QIcon(DOWNLOAD_ICON_PATH)))
        QMessageBox(
            QMessageBox.Warning,
            "Could not install %s plugin."
            % self._pluginEntry["pluginname"],
            """The %s plugin could not be downloaded. Please
            check your internet connection."""
            % self._pluginEntry["pluginname"])

    def modulename(self):
        """Extracts the modulename detail url"""
        return self._pluginEntry["details"].split("/")[-1]
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.searchEdit.textChanged.connect(self.search_text_changed)
        self.ui.show_button.clicked.connect(self.show_episodes)
        self.ui.searchEdit.returnPressed.connect(self.show_episodes)
        self.episodes = None
        self.episode_list = None
        self.number = 0
        self.anime_list = None
        self.ui.download_button.clicked.connect(self.download)
        self.ui.res_list_widget.currentItemChanged.connect(self.episode_change)
        self.com = Comunicate()
        self.com.sig.connect(self.message)
        self.com.img.connect(self.set_image)
        self.ui.anime_list_widget.itemDoubleClicked.connect(self.show_episodes)
        self.setWindowIcon(QIcon(get_file('animes.png')))
        self.ui.anime_list_widget.itemPressed.connect(self.anime_entered)
        Thread(target=self.load_url_items).start()
        #self.load_url_items()
        self.movie = QMovie(get_file('ajax-loader.gif'))
        self.ui.loading_label.setMovie(self.movie)
        self.link = None
        self.main_download_page = None
        self.tray = SystemTrayIcon(
            QIcon(get_file('animes.png')), self.com, self)
        self.com.op.connect(self.show_semard)
        self.ui.action_About_Semard.triggered.connect(self.about_semard)
        self.ui.action_Contato.triggered.connect(self.show_feedback)
        self.setWindowTitle('Semard - Animes')
        self.browser = None
        self.player = None
        #self.player_window = player_w

    @Slot(str, bool)
    def openVideo(self, filepath, duplicate_mode):
        movie = os.path.expanduser(filepath)
        if 'http://' not in filepath:
            if not os.access(movie, os.R_OK):
                print(('Error: %s file is not readable' % movie))
            sys.exit(1)

        split = urllib.parse.urlsplit(filepath)
        #name = QInputDialog.getText(self, 'Escolha nome do arquivo', 'Nome do arquivo:')
        name = split.path.split("/")[-1]
        #pa = os.path.join(res, name)
        if duplicate_mode:
            try:
                #media = instance.media_new(movie, 'sout=#duplicate{dst=file{dst=%s},dst=display}' % pa)
                pass
            except NameError:
                print(('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
                                                           vlc.__version__, vlc.libvlc_get_version())))
        else:
            try:
                #media = instance.media_new(movie)
                if sys.platform in 'win32':
                    subprocess.Popen([os.path.join('vlc','vlc'), movie])
                else:
                    subprocess.Popen(['vlc', movie])
            except NameError:
                print(('NameError: % (%s vs Libvlc %s)' % (sys.exc_info()[1],
                                                           vlc.__version__, vlc.libvlc_get_version())))
                QMessageBox.critical(self, 'Erro','problema ao iniciar o vlc')
                # "--sout=#duplicate{dst=file{dst=example.mpg},dst=display}"

        #player = instance.media_player_new()
        #pplayer.set_media(media)
        #self.player_window.setMedia(media)
        #self.player_window.createUI()
        #self.player_window = Player()
        #media.parse()
        #self.player_window.setWindowTitle(media.get_meta(0))
        #self.player_window.show()
        #self.player_window.resize(640, 480)
        #if sys.platform == "linux2":  # for Linux using the X Server
        #    pplayer.set_xwindow(self.player_window.videoframe.winId())
        #elif sys.platform == "win32":  # for Windows
        #    pplayer.set_hwnd(self.player_window.videoframe.winId())
        #elif sys.platform == "darwin":  # for MacOS
        #    pplayer.set_agl(self.player_window.videoframe.windId())
        #pplayer.play()
        #self.player_window.updateUI()

    @Slot(str, str)
    def start_download(self, filepath, path):
        #thread = QThread(self)
        pbar = QProgressBar(self.ui.tab_downloads)
        pbar.setMinimum(0)
        pbar.setMaximum(100)
        pbar.setValue(0)
        self.ui.formLayout.addRow(os.path.basename(path), pbar)
        pbar.show()
        dw = Downloader(str(filepath), str(path), pbar)
        dw.finished.connect(self.finished_download)
        dw.progresschanged.connect(self.show_download_progress)
        dw.started.connect(self.started_download)
        Thread(target=dw.download).start()
        #thread.started.connect(dw.download)
        #thread.finished.connect(self.finished_download)
        #dw.moveToThread(thread)
        #thread.start()

    def finished_download(self, pbar, filename):
        self.tray.showMessage(filename, 'Download concluído.')
        pbar.setValue(100)
        pbar.setEnabled(False)

    def started_download(self, filename):
        filename = os.path.basename(filename)
        self.tray.showMessage(filename, 'Download iniciado.')

    @Slot(float, QProgressBar)
    def show_download_progress(self, progress, pbar):
        pbar.setValue(progress)

    def show_feedback(self):
        feed = Feedback(self.com)
        feed.exec_()

    def about_semard(self):
        about = QMessageBox.about(self, "Sobre Semard",
                                  """<b>Semard</b> v%s
        <p><b>Copyright (C) 2013</b> Ronnie Andrew.</p>
        <p>Todos os direitos reservados de acordo com a licença GNU GPL v3 ou posterior.</p>
        <p><b>Website Oficial:</b> <a href='https://github.com/ROAND/Series-Manager'>GitHub</a></p>
        <p><b>Plataforma: </b>%s</p>
          """ % (__version__, platform.system()))

    def show_semard(self, message):
        self.show()

    def closeEvent(self, event):
        self.hide()
        self.tray.showMessage('Semard', 'Semard ainda está em execução.')
        event.ignore()

    @Slot(str)
    def set_image(self, img_str):
        self.ui.image_label.setPixmap(QPixmap(img_str))

    @Slot(str)
    def message(self, message):
        if str(message) in 'ended':
            self.ui.loading_label.hide()
            # self.repaint()
            self.ui.anime_list_widget.setEnabled(True)
            self.ui.show_button.setEnabled(True)
            self.movie.stop()
        if str(message) in 'started':
            self.ui.loading_label.show()
            # self.repaint()
            self.ui.anime_list_widget.setEnabled(False)
            self.ui.show_button.setEnabled(False)
            self.movie.start()

    def anime_entered(self, item):
        pass

    def load_url_items(self):
        self.com.sig.emit('started')
        self.main_download_page = AnimeList('http://www.anbient.net/lista')
        self.number, self.anime_list = self.main_download_page.get_attrs()
        self.ui.avaLabel.setText('%s disponiveis.' % self.number)
        self.add_full_items_animelist()
        self.com.sig.emit('ended')

    def episode_change(self):
        self.com.sig.emit('started')
        self.ui.options_list_widget.clear()

        if self.ui.res_list_widget.currentItem():
            name = self.ui.res_list_widget.currentItem().text()
            episode = self.episode_list[name]
            self.ui.options_list_widget.addItems(episode.links)
            self.com.sig.emit('ended')

    def download(self):
        #name = self.ui.options_list_widget.currentItem().text()
        link = self.ui.options_list_widget.currentItem().text()
        self.com.sig.emit('started')
        msgBox = QMessageBox()
        msgBox.setWindowTitle('Informação')
        msgBox.setText('Browser padrão')
        msgBox.setInformativeText(
            'Você deseja abrir este link com o seu browser padrão?')
        msgBox.setStandardButtons(QMessageBox.No | QMessageBox.Yes)
        msgBox.setDefaultButton(QMessageBox.Yes)
        ret = msgBox.exec_()
        if ret == QMessageBox.Yes:
            if sys.platform in 'win32':
                webbrowser.open(link)
            else:
                webbrowser.open(link)
        else:
            browser.ui.webView.setUrl(QUrl(link))
            browser.show()
        self.com.sig.emit('ended')

    def keyPressEvent(self, event):
        if isinstance(event, PyQt5.QtGui.QKeyEvent):
            if event.key() == Qt.Key_Down:
                self.ui.anime_list_widget.setCurrentRow(
                    self.ui.anime_list_widget.currentRow() + 1)
            elif event.key() == Qt.Key_Up:
                self.ui.anime_list_widget.setCurrentRow(
                    self.ui.anime_list_widget.currentRow() - 1)

    @staticmethod
    def get_img_link(url):
        page = urllib.request.urlopen(url)
        page_string = page.read().decode('utf-8')
        soup = BeautifulSoup(page_string)
        spans = soup.find_all('span', {'id': 'posterspan'})
        link = None
        for chil in spans:
            if isinstance(chil, bs4.element.Tag):
                for img in chil.children:
                    if isinstance(img, bs4.element.Tag):
                        link = img['src']
        return link

    def show_ep_thread(self):
        self.ui.res_list_widget.clear()
        anime_name = self.ui.anime_list_widget.currentItem().text()
        link = self.anime_list[anime_name]
        self.episodes = EpisodeList(link)
        # self.episodes.join()
        self.link = self.get_img_link(link)
        self.episode_list = self.episodes.get_episodes()

        anime_name = self.ui.anime_list_widget.currentItem().text()
        link = self.anime_list[anime_name]
        img_link = self.get_img_link(link)
        file_name = img_link
        if os.path.exists(get_file(file_name)):
            self.com.img.emit(get_file(file_name))
            # self.ui.image_label.setPixmap(QPixmap(get_file(file_name)))
        else:
            if img_link is not None:
                file_name = img_link.replace(
                    'http://www.anbient.net/sites/default/files/imagecache/242x0/imagens/poster/', '')
                urllib.request.urlretrieve(
                    'http://www.anbient.net/sites/default/files/imagecache/242x0/imagens/poster/%s' % file_name,
                    get_file(file_name))
                self.com.img.emit(get_file(file_name))
                # self.ui.image_label.setPixmap(QPixmap(get_file(file_name)))

        self.ui.label_sinopse.setText(self.episodes.get_sinopse().strip())
        try:
            for name in reversed(sorted(list(self.episode_list.keys()), key=int)):
                episode = self.episode_list[name]
                name, links = episode.get_attrs()
                self.ui.res_list_widget.addItem(name)
        except:
            for name, episode in reversed(sorted(self.episode_list.items())):
                name, links = episode.get_attrs()
                self.ui.res_list_widget.addItem(name)
        self.com.sig.emit('ended')

    def show_episodes(self):
        Thread(target=self.show_ep_thread).start()
        self.com.sig.emit('started')

    def add_full_items_animelist(self):
        self.ui.anime_list_widget.clear()
        for name, link in sorted(self.anime_list.items()):
            self.ui.anime_list_widget.addItem(name)

    def search_text_changed(self, new_text):
        items = self.ui.anime_list_widget.findItems(new_text, Qt.MatchContains)
        if items:
            self.ui.anime_list_widget.setCurrentItem(items[0])
            self.ui.labelSearch.setText('')
        else:
            self.ui.labelSearch.setText('Not Found!')

    def setBrowser(self, browser_param):
        self.browser = browser_param
        self.browser.start_download.connect(self.start_download)
        self.browser.open_video.connect(self.openVideo)
    def __init__(self):

        # to prevent GUI lockup in long run.
        #----------------------------------------------------------------------
        QApplication.processEvents()

        super().__init__()
        #super(ChildWindow, self).__init__(parent)
        self.setFixedSize(1000, 500)
        self.setWindowTitle(' Sound Classification v3.0 ')
        self.setWindowIcon(QIcon('assets/icon.png'))

        # This part retrive the last saved position of the MainWindow before this windows appear.
        # displaying the this window in exact same postion.
        #----------------------------------------------------------------------------------------
        try:
            self.settings = QSettings(" ", " ")
            self.restoreGeometry(self.settings.value("geometry", ""))
            self.restoreState(self.settings.value("windowState", ""))
        except:
            pass

        # Disabling the the close button here.
        #----------------------------------------------------------------------
        # self.setWindowFlag(Qt.WindowCloseButtonHint, False)

        # Background Color.
        #----------------------------------------------------------------------
        color = QColor("#3484A9")
        self.setAutoFillBackground(True)
        p = self.palette()
        p.setColor(self.backgroundRole(), color)
        self.setPalette(p)

        # Setting background Image.
        #----------------------------------------------------------------------
        oImage = QImage("assets/main_background.jpg")
        sImage = oImage.scaled(QSize(1000, 500))
        palette = QPalette()
        palette.setBrush(10, QBrush(sImage))
        self.setPalette(palette)

        # defining all labels here.
        #----------------------------------------------------------------------
        self.Label_sbg_bg1 = QLabel(self)
        self.Label_sbg_bg2 = QLabel(self)
        self.Label_sbg_title1 = QLabel(self)
        self.Label_sbg_title2 = QLabel(self)
        self.Label_predict111 = QLabel(self)
        self.Label_predict121 = QLabel(self)
        self.Label_predict131 = QLabel(self)
        self.Label_predict141 = QLabel(self)
        self.Label_setfreq = QLabel(self)
        self.Label_predict_totalClass = QLabel(self)

        self.Label_predict_className = QLabel(self)
        self.Label_predict_time = QLabel(self)
        self.Label_predict_recordText = QLabel(self)
        self.Label_predict_recordTextHeader = QLabel(self)

        self.Label_thres = QLabel(self)
        self.Label_predict11 = QLabel(self)
        self.Label_predict12 = QLabel(self)
        self.Label_predict13 = QLabel(self)
        self.Label_predict14 = QLabel(self)
        self.Label_predict_timeD = QLabel(self)
        self.Label_record = QLabel(self)

        # setting title text image here 'MODEL STATUS'.
        #----------------------------------------------------------------------
        self.Label_title_ani1 = QLabel(self)
        self.Label_title_ani1.resize(277, 45)
        self.Label_title_ani1.move(115, 50)
        movie = QMovie("assets/model_status.png")
        self.Label_title_ani1.setMovie(movie)
        movie.start()

        # setting title text image here 'TRAINING'.
        #----------------------------------------------------------------------
        self.Label_title_ani2 = QLabel(self)
        self.Label_title_ani2.resize(205, 67)
        self.Label_title_ani2.move(640, 40)
        movie = QMovie("assets/training.png")
        self.Label_title_ani2.setMovie(movie)
        movie.start()

        self.initUI()

        # calling stylesheet here.
        #----------------------------------------------------------------------
        from Gunshot_Recognition_CSS import styleSheetTrain
        self.setStyleSheet(styleSheetTrain)
Exemple #57
0
class LoginWidget(QWidget):
    # signals
    loginOk = pyqtSignal(str, dict)  # (login(email), cookies{})
    loginError = pyqtSignal(str)

    def __init__(self, parent=None):
        super(LoginWidget, self).__init__(parent)
        self.uifile = 'ui/login_widget.ui'
        self.pickle_filename = 'cache/login.dat'
        self.xnova_url = 'uni4.xnova.su'
        self.ui = None
        self.loading_gif = None
        # thread for network operations
        self.th = None

    def load_ui(self):
        self.ui = uic.loadUi(self.uifile, self)
        self.ui.lbl_loading.hide()
        self.ui.btn_login.clicked.connect(self.on_btn_login)
        self.ui.btn_register.clicked.connect(self.on_btn_register)
        self.loading_gif = QMovie(':/i/loading.gif')
        self.restore_login()
        # load xnova url from config/net.ini
        cfg = configparser.ConfigParser()
        cfg.read('config/net.ini', encoding='utf-8')
        if 'net' in cfg:
            self.xnova_url = cfg['net']['xnova_url']

    def save_login(self):
        email = self.ui.le_email.text()
        password = self.ui.le_pass.text()
        remember = self.ui.chk_remember.isChecked()
        auth_data = (email, password, remember)
        try:
            cache_dir = pathlib.Path('./cache')
            if not cache_dir.exists():
                cache_dir.mkdir()
            with open(self.pickle_filename, 'wb') as f:
                pickle.dump(auth_data, f)
        except pickle.PickleError as pe:
            pass
        except IOError as ioe:
            pass
        # except OSError as ose:  # same as IOError in python3 ?
        #    pass

    def restore_login(self):
        try:
            with open(self.pickle_filename, 'rb') as f:
                auth_data = pickle.load(f)
                self.ui.le_email.setText(auth_data[0])
                self.ui.le_pass.setText(auth_data[1])
                if auth_data[2]:
                    self.ui.chk_remember.setChecked(True)
                else:
                    self.ui.chk_remember.setChecked(False)
        except pickle.PickleError as pe:
            pass
        except IOError as ioe:
            pass

    @pyqtSlot()
    def on_btn_register(self):
        logger.debug('register clicked, opening [http://{0}/]'.format(self.xnova_url))
        QDesktopServices.openUrl(QUrl('http://{0}/'.format(self.xnova_url)))

    @pyqtSlot()
    def on_btn_login(self):
        # logger.debug('login clicked')
        self.ui.btn_login.hide()
        self.ui.btn_register.hide()
        self.ui.le_email.setEnabled(False)
        self.ui.le_pass.setEnabled(False)
        self.ui.chk_remember.setEnabled(False)
        self.ui.lbl_loading.show()
        self.ui.lbl_loading.setMovie(self.loading_gif)
        self.loading_gif.start()
        if self.ui.chk_remember.isChecked():
            self.save_login()
        # create thread object
        self.th = LoginThread(self)
        self.th.finished.connect(self.on_thread_finished)
        # get form data and start thread
        self.th.email = self.ui.le_email.text()
        self.th.password = self.ui.le_pass.text()
        self.th.remember = self.ui.chk_remember.isChecked()
        self.th.start()

    @pyqtSlot()
    def on_thread_finished(self):
        # logger.debug('thread finished')
        self.loading_gif.stop()
        self.ui.le_email.setEnabled(True)
        self.ui.le_pass.setEnabled(True)
        self.ui.chk_remember.setEnabled(True)
        self.ui.btn_login.show()
        self.ui.btn_register.show()
        self.ui.lbl_loading.hide()
        if self.th.login_ok:
            logger.info('Login ({0}) ok'.format(self.th.email))
            cookies_dict = self.th.requests_cookiejar.get_dict()
            # logger.debug(cookies_dict)
            # emit signal
            self.loginOk.emit(self.th.email, cookies_dict)
        else:
            logger.error('Login error: {0}'.format(self.th.error_msg))
            self.loginError.emit(self.th.error_msg)
        self.th = None
class alarmChecker(QWidget):
    def __init__(self, parent):
        super(alarmChecker, self).__init__()
        self.parent = parent
        self.networkError = False
        self.loadAlarm()
        self.getAlarm()
        self.getTimeout()
        self.getTimer()
        self.setLayout(self.alarm_layout)

    def loadAlarm(self):
        self.list_alarm = []
        config = ConfigParser.ConfigParser()
        config.readfp(open(self.parent.config_path + 'alarm.cfg'))
        for a in config.sections():
            dict = {"tableName": a}
            for b in config.options(a):
                dict[b] = config.get(a, b)
            self.list_alarm.append(dict)

    def getAlarm(self):

        self.alarm_layout = QGridLayout()
        self.movie = QMovie(self.parent.os_path + "/img/giphy2.gif", QByteArray(), self)

        self.movie_screen = QLabel()
        # Make label fit the gif
        self.movie_screen.setFixedSize(80, 50)

        # Add the QMovie object to the label
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.movie_screen.setMovie(self.movie)
        self.movie.start()
        self.timeout_ack = []
        self.dialog = self.dialogTimeout()
        self.dialog.hide()

        self.label_acq = QPushButton("ACQUISITION")
        self.label_acq.clicked.connect(self.dialog.show)
        self.label_acq.setFixedHeight(50)
        self.setColor("QPushButton", self.label_acq, "green")

        self.alarm_layout.addWidget(self.movie_screen, 0, 0, 1, 1)
        self.alarm_layout.addWidget(self.label_acq, 0, 1, 1, 2)


        for i, device in enumerate(self.list_alarm):
            name = device["tableName"] + device["key"]
            button = QPushButton(device["label"].upper())
            button.setFixedHeight(50)
            self.setColor("QPushButton", button, "green")
            button.clicked.connect(partial(self.showWarning, "msg_%s" % name))
            self.alarm_layout.addWidget(button, 0, i + 3, 1, 1)
            setattr(self, "alarm_%s" % name, button)

        self.watcher_alarm = QTimer(self)
        self.watcher_alarm.setInterval(5000)
        self.watcher_alarm.timeout.connect(self.checkCriticalValue)
        self.watcher_alarm.start()

    def getTimeout(self):
        self.device_dict = copy.deepcopy(self.parent.device_dict)
        self.timeout_limit = 90
        self.list_timeout = [key for key, value in self.parent.device_dict.iteritems()]
        self.last_date = {}
        self.last_time = {}
        for key, value in self.device_dict.iteritems():
            self.last_date[key] = 0
            self.last_time[key] = datetime.datetime.now()

    def getTimer(self):

        watcher_timeout = QTimer(self)
        watcher_timeout.singleShot(2000, partial(self.showTimeout, 0))
        self.checker_timeout = QTimer(self)
        self.checker_timeout.setInterval(15000)
        self.checker_timeout.timeout.connect(self.checkTimeout)
        self.checker_timeout.start()

    def showTimeout(self, i):
        for timeout in self.timeout_ack:
            try:
                self.list_timeout.remove(timeout)
            except ValueError:
                pass
        if not self.networkError:
            if self.list_timeout:
                if i < len(self.list_timeout):
                    self.label_acq.setText("TIME OUT ON %s" % self.list_timeout[i])
                    self.setColor("QPushButton", self.label_acq, "red")
                    i += 1
                else:
                    i = 0
            else:
                self.label_acq.setText("ACQUISITION")
                self.setColor("QPushButton", self.label_acq, "green")
        else:
            self.label_acq.setText("SERVER LOST")
            self.setColor("QPushButton", self.label_acq, "orange")
        watcher_timeout = QTimer(self)
        watcher_timeout.singleShot(2000, partial(self.showTimeout, i))

    def checkTimeout(self):
        for key, value in self.device_dict.iteritems():
            return_values = self.parent.db.getLastData(key, "id")
            if return_values == -5:
                self.networkError = True
            elif type(return_values) is int:
                self.parent.showError(return_values)
            else:
                date, id = return_values
                self.networkError = False
                if date != self.last_date[key]:
                    if self.last_date[key] != 0:
                        if key in self.list_timeout:
                            self.list_timeout.remove(key)
                    self.last_time[key] = datetime.datetime.now()
                    self.last_date[key] = date
                else:
                    if (datetime.datetime.now() - self.last_time[key]).total_seconds() > self.timeout_limit:
                        if key not in self.list_timeout:
                            self.list_timeout.append(key)

    def checkCriticalValue(self):

        for device in self.list_alarm:
            name = device["tableName"] + device["key"]
            return_values = self.parent.db.getLastData(device["tableName"], device["key"])

            if type(return_values) is not int:
                date, [val] = return_values
                fmt = "{:.5e}" if len(str(val)) > 8 else "{:.2f}"
                if float(device["lower_bound"]) <= val < float(device["higher_bound"]):
                    msg = "%s OK \r %s <= %s < %s" % (
                        device["label"], device["lower_bound"], fmt.format(val), device["higher_bound"])
                    self.setColor("QPushButton", getattr(self, "alarm_%s" % name), "green")
                else:
                    msg = "WARNING ! %s OUT OF RANGE \r %s <= %s < %s" % (
                        device["label"], device["lower_bound"], fmt.format(val), device["higher_bound"])
                    self.setColor("QPushButton", getattr(self, "alarm_%s" % name), "red")
                setattr(self, "msg_%s" % name, msg)

            else:
                print "code error : %i" % val

    def setColor(self, type, widget, color):
        if type == "QLabel":
            widget.setStyleSheet(
                "%s { background-color : %s; color : white; qproperty-alignment: AlignCenter; font: 15pt;}" % (
                    type, color))
        else:
            widget.setStyleSheet("%s { background-color : %s; color : white; font: 15pt;}" % (type, color))

    def ackTimeout(self, checkbox):
        if checkbox.isChecked():
            if str(checkbox.text()) in self.timeout_ack:
                self.timeout_ack.remove(str(checkbox.text()))
        else:
            self.timeout_ack.append(str(checkbox.text()))


    def showWarning(self, attr):
        reply = QMessageBox.warning(self, 'Message', str(getattr(self, attr)), QMessageBox.Ok)


    def dialogTimeout(self):
        d = QDialog(self)
        d.setFixedWidth(450)
        d.setWindowTitle("Setting Devices Timeout")
        d.setVisible(True)
        vbox = QVBoxLayout()
        grid = QGridLayout()
        grid.setSpacing(20)

        for i, (key, value) in enumerate(self.parent.device_dict.iteritems()):
            checkbox = QCheckBox(key)
            checkbox.stateChanged.connect(partial(self.ackTimeout, checkbox))
            checkbox.setCheckState(2)
            grid.addWidget(checkbox, 1 + i, 0, 1, 3)
        buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
        buttonBox.button(QDialogButtonBox.Ok).clicked.connect(d.hide)
        buttonBox.button(QDialogButtonBox.Cancel).clicked.connect(d.hide)
        vbox.addLayout(grid)
        vbox.addWidget(buttonBox)
        d.setLayout(vbox)
        return d