예제 #1
0
	def __init__(self, parent=None):
		super().__init__(parent)
		self.mainWidget = App(self)
		self.mainWidget.llenaDiccionario()
		self.setCentralWidget(self.mainWidget)
		self.setFixedSize(1190, 670)
		menubar = QMenuBar()
		fileMenu = menubar.addMenu('Opciones')
		impMenu = QAction('Cargar Archivo', self)
		fileMenu.addAction(impMenu)
		impMenu.triggered.connect(self.abrirVentana)
		self.setMenuBar(menubar)
		qtRectangle = self.frameGeometry()
		centerPoint = QDesktopWidget().availableGeometry().center()
		qtRectangle.moveCenter(centerPoint)
		self.move(qtRectangle.topLeft())
		menubar.setStyleSheet("font-size: 13px;font-weight: bold;selection-background-color:  #c2185b")
		fileMenu.setStyleSheet("font-size: 13px;font-weight: bold;")
예제 #2
0
파일: noise.py 프로젝트: Anosema/Landforms
class Main(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Landforms")
        self.setFixedSize(1000, 600)

        self.graph = graphWidget(self)
        self.setCentralWidget(self.graph)

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(0, 0, 100, 21)
        self.menubar.setStyleSheet("border: 1px solid white;")
        self.menuFile = QMenu("File", self.menubar)

        self.setMenuBar(self.menubar)

        self.actionNew = QAction("New", self)
        self.actionNew.triggered.connect(self.graph.drawGraph)
        self.menuFile.addAction(self.actionNew)
예제 #3
0
class mainDialog(QWidget):
    def __init__(self, parent=None):
        super(mainDialog, self).__init__(parent)
        
        #编辑菜单栏
        self.menubar =  QMenuBar()
        self.menubar.setStyleSheet("""QMenuBar{
                                                              background-color:rgb(000,178,180);
                                                              border:1px solid#188;
                                                              }
                                                """)
        #账户菜单
        self.usrMenu = self.menubar.addMenu('账户')
        self.actionLog = self.usrMenu.addAction( '登陆&L')
        self.actionChangeUser = self.usrMenu.addAction('更换账号&A')
        self.actionOut = self.usrMenu.addAction ('退出登陆&O')
        #编辑菜单
        self.revMenu = self.menubar.addMenu('编辑')
        self.helpMenu = self.menubar.addMenu('帮助')
        self.actionHelp = self.helpMenu.addAction('显示使用文档')
        self.actionAbout = self.helpMenu.addAction('?')
        self.menuLayout = QHBoxLayout()
        self.menuLayout.addWidget(self.menubar)
        self.menuLayout.addStretch(1)
        
        #状态栏 
        self.statusBar = QStatusBar()
        self.statusBar.showMessage(u'未登录') 
         
        #导航栏 
        self.contentsWidget = QListWidget()
        self.setStyleSheet("""QListWidget{
                                                     background-color:rgb(000,178,180);
                                                     border:0px;
                                                     }
                                    QListWidget::item:hover{
                                                     background:skyblue;padding-top:0px;padding-bottom:0px;
                                                     }
                                    QListWidget::item:selected{
                                                    background:lightgray;color:bule;
                                                    }
                                                     background-color:rgb(000,178,180);
                                                     }
                                                     """)
        self.contentsWidget.setViewMode(QListView.IconMode)
        self.contentsWidget.setIconSize(QSize(50, 50))
        self.contentsWidget.setMovement(QListView.Static)
        self.contentsWidget.setMaximumSize(60, 140)
        #self.contentsWidget.setMaxmumHeight(120)
        self.contentsWidget.setSpacing(0)
          
        #设置三个页面为StackedWidget
        self.page1 = CallPage1()
        self.page3 = CallPage3()
        self.pagesWidget = QStackedWidget()
        self.pagesWidget.addWidget(self.page1)
        self.pagesWidget.addWidget(self.page3)
        
        #设置导航栏默认选择邮件发送页面
        self.createNav()
        self.contentsWidget.setCurrentRow(0)
        
        #水平布局(包含导航栏和一个页面)
        horizontalLayout = QHBoxLayout()
        vlayout = QVBoxLayout()
        vlayout.addWidget(self.contentsWidget)
        vlayout.addStretch(12)
        horizontalLayout.addLayout(vlayout)
        horizontalLayout.addWidget(self.pagesWidget)
        
        #最底层状态栏和关闭按钮
        self.closeButton = QPushButton("关闭程序")
        self.closeButton.clicked.connect(self.close)
        bottomLayout = QHBoxLayout()
        #bottomLayout.addStretch(1)
        bottomLayout.addWidget(self.statusBar)
        #bottomLayout.addStretch(10)
        bottomLayout.addWidget(self.closeButton)
        #bottomLayout.addStretch(1)
        
        #设置页面总体布局
        mainLayout = QVBoxLayout()
        mainLayout.addLayout(self.menuLayout)
        mainLayout.addLayout(horizontalLayout)
        mainLayout.addStretch(1)
        mainLayout.addSpacing(12)
        mainLayout.addLayout(bottomLayout)
        self.setLayout(mainLayout)
 
        ## 窗口风格设置
        palette1 = QPalette()
        palette1.setColor(self.backgroundRole(), QColor(1, 178, 170))
        #palette1.setBrush(self.backgroundRole(), QBrush(QPixmap('./img/CLlogo.png')))
        self.setPalette(palette1)
        self.setAutoFillBackground(False)
        self.setGeometry(300, 300, 300, 500)
        self.setWindowIcon(QIcon('img/title.png')) 
        self.setWindowTitle("Python实现图像界面-PyQt5")
    
    def changePage(self, current, previous) :
        if not current:
            current = previous
        self.pagesWidget.setCurrentIndex(self.contentsWidget.row(current))
 
    def createNav(self):
        page1Button = QListWidgetItem(self.contentsWidget)
        page1Button.setIcon(QIcon('img/send.png'))
        page1Button.setText("发送邮件")
        page1Button.setTextAlignment(Qt.AlignHCenter)
        page1Button.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
 
        page2Button = QListWidgetItem(self.contentsWidget)
        page2Button.setIcon(QIcon('img/find.png'))
        page2Button.setText("查看历史")
        page2Button.setTextAlignment(Qt.AlignHCenter)
        page2Button.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
 
        self.contentsWidget.currentItemChanged.connect(self.changePage)
예제 #4
0
class View(QWidget):
    '''
        Paramètres : 
            - QWidget est la classe de base de tous les objets d'interface utilisateur.  
            
        But : Fonction qui met en place la vue d'accueil.
    '''
    def __init__(self, ctrl, parent=None):

        # MVC
        self.myCtrl = ctrl

        # Héritage - Appel de la classe mère
        super(View, self).__init__(parent)

        # Initialisation variable globale
        global nomFichier

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Création layout
        self.layout = QFormLayout()

        # Menu bar
        self.menu = QMenuBar()
        self.menu.setStyleSheet(self.stylesheet)
        self.menuFichier = self.menu.addMenu("Fichier")
        self.layout.addRow(self.menu)

        # Création sous menu Ouvrir
        ouvrirMenu = QAction(QIcon('Logo\open.png'), '   Ouvrir', self)
        ouvrirMenu.setShortcut('Ctrl+O')
        ouvrirMenu.triggered.connect(lambda: self.openDb(self.myCtrl))
        self.menuFichier.addAction(ouvrirMenu)

        # Création sous menu Enregistrer
        enregistrerMenu = QAction(QIcon('Logo\save.png'),
                                  '   Enregistrer sous', self)
        enregistrerMenu.setShortcut('Ctrl+S')
        enregistrerMenu.triggered.connect(self.saveDb)
        self.menuFichier.addAction(enregistrerMenu)

        # Action sous menu Quitter
        quitterMenu = QAction(QIcon('Logo\exit.png'), '   Quitter', self)
        quitterMenu.setShortcut('Ctrl+Q')
        quitterMenu.triggered.connect(app.quit)
        quitterMenu.triggered.connect(self.close)
        self.menuFichier.addAction(quitterMenu)

        # Texte liste routeur
        self.textList = QLabel("\nListes des routeurs :\n")
        self.layout.addRow(self.textList)

        # Ajout des checkbox
        with open(nomFichier, 'r') as csvfile:
            reader = csv.reader(csvfile, delimiter=',')

            for row in reader:
                try:
                    global compteur
                    if (len(row[0]) != 0):
                        locals()['self.checkboxRouteur%d' %
                                 compteur] = QRadioButton(row[0])
                        locals()['self.checkboxRouteur%d' %
                                 compteur].setStyleSheet(self.stylesheet)
                        self.layout.addWidget(
                            locals()['self.checkboxRouteur%d' % compteur])

                    compteur += 1
                except IndexError:
                    pass

        # Création des boutons
        self.buttonAdd = QPushButton("Ajouter un routeur")
        self.buttonAdd.setIcon(QIcon('Logo\plus.png'))
        self.buttonAdd.setStyleSheet(self.stylesheet)

        self.buttonSelect = QPushButton("Voir le routeur")
        self.buttonSelect.setIcon(QIcon('Logo\select.png'))
        self.buttonSelect.setStyleSheet(self.stylesheet)

        self.buttonDelete = QPushButton("Supprimer le routeur")
        self.buttonDelete.setIcon(QIcon('Logo\delete.png'))
        self.buttonDelete.setStyleSheet(self.stylesheet)

        self.buttonEdit = QPushButton("Modifier le routeur")
        self.buttonEdit.setIcon(QIcon('Logo\edit.png'))
        self.buttonEdit.setStyleSheet(self.stylesheet)

        # Ajout des widgets au layout et mise en place du layout
        self.layout.addRow(self.buttonSelect, self.buttonEdit)
        self.layout.addRow(self.buttonAdd, self.buttonDelete)
        self.setLayout(self.layout)

        # Filtre afin de désactiver les boutons si aucun routeur crée
        if not self.findChildren(QRadioButton):
            self.buttonSelect.setEnabled(False)
            self.buttonDelete.setEnabled(False)
            self.buttonEdit.setEnabled(False)

        # Gestion des events
        self.buttonSelect.clicked.connect(
            lambda: self.btn_clickSelectRouteur(self.myCtrl))
        self.buttonAdd.clicked.connect(
            lambda: self.btn_clickAddRouteur(self.myCtrl))
        self.buttonDelete.clicked.connect(
            lambda: self.btn_clickDeleteRouteur(self.myCtrl))
        self.buttonEdit.clicked.connect(
            lambda: self.btn_clickEditRouteur(self.myCtrl))

        self.setWindowTitle("Accueil")
        self.show()
        self.setGeometry(500, 200, 500, 200)

#=========== ROUTEUR ===========#

    def vueAjouterRouteur(self, myCtrl, parent=None):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller    
            
        But : Fonction qui met en place la vue d'ajout d'un routeur.
        '''

        # Héritage - Appel de la classe mère
        super(View, self).__init__(parent)

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Création du layout
        self.layout = QFormLayout()

        # Mise en place des widgets
        self.text1 = QLabel()
        self.text1.setText("Nom : ")
        self.text1.setStyleSheet(self.stylesheet)

        self.le1 = QLineEdit()
        self.le1.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text1, self.le1)

        self.text2 = QLabel()
        self.text2.setText("Adresse IP : ")
        self.text2.setStyleSheet(self.stylesheet)

        self.le2 = QLineEdit()
        self.le2.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text2, self.le2)

        self.text3 = QLabel()
        self.text3.setText(u"Masque de sous réseaux : ")
        self.text3.setStyleSheet(self.stylesheet)

        self.le3 = QLineEdit()
        self.le3.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text3, self.le3)

        self.buttonSave = QPushButton("Ajouter le routeur")
        self.buttonSave.setIcon(QIcon('Logo\plus.png'))
        self.buttonSave.setStyleSheet(self.stylesheet)

        self.buttonCancel = QPushButton("Annuler")
        self.buttonCancel.setIcon(QIcon('Logo\exit.png'))
        self.buttonCancel.setStyleSheet(self.stylesheet)

        # Gestion des events
        self.buttonSave.clicked.connect(
            lambda: self.btn_clickAddSaveRouteur(myCtrl))
        self.buttonCancel.clicked.connect(
            lambda: self.btn_clickCancelRouteur(myCtrl))
        self.layout.addRow(self.buttonSave, self.buttonCancel)

        self.setLayout(self.layout)
        self.setWindowTitle("Ajouter un routeur")
        self.show()

    def vueConfigRouteur(self,
                         myCtrl,
                         nomRouteur,
                         adresseIP,
                         masque,
                         parent=None):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller    
            - nomRouteur (String) : nom du routeur possédant l'interface
            - adresseIP (String) : adresse IP du routeur
            - masque (String) : masque du routeur
            
        But : Fonction qui met en place la vue de configuration d'un routeur.
        '''

        # Héritage - appel de la classe mère
        super(View, self).__init__(parent)

        # Création du layout
        self.layout = QFormLayout()

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Mise en place des widgets
        self.text1 = QLabel()
        self.text1.setText("Nom : ")
        self.text1.setStyleSheet(self.stylesheet)

        self.le1 = QLineEdit()
        self.le1.setText(nomRouteur)
        self.le1.setEnabled(False)
        self.le1.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text1, self.le1)

        self.text2 = QLabel()
        self.text2.setText("Adresse IP : ")
        self.text2.setStyleSheet(self.stylesheet)

        self.le2 = QLineEdit()
        self.le2.setText(adresseIP)
        self.le2.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text2, self.le2)

        self.text3 = QLabel()
        self.text3.setText("Masque de sous réseaux : ")
        self.text3.setStyleSheet(self.stylesheet)

        self.le3 = QLineEdit()
        self.le3.setText(masque)
        self.le3.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text3, self.le3)

        self.buttonSaveRouteur = QPushButton("Enregistrer")
        self.buttonSaveRouteur.setIcon(QIcon('Logo\save.png'))
        self.buttonSaveRouteur.setStyleSheet(self.stylesheet)

        self.buttonCancelRouteur = QPushButton("Annuler")
        self.buttonCancelRouteur.setIcon(QIcon('Logo\exit.png'))
        self.buttonCancelRouteur.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.buttonSaveRouteur, self.buttonCancelRouteur)

        # Gestion des events
        self.buttonSaveRouteur.clicked.connect(
            lambda: self.btn_clickEditSaveRouteur(myCtrl, self.le1.text(
            ), self.le2.text(), self.le3.text()))
        self.buttonCancelRouteur.clicked.connect(
            lambda: self.btn_clickCancelRouteur(myCtrl))

        self.setLayout(self.layout)
        self.setWindowTitle("Configuration du routeur : " + nomRouteur)
        self.show()

    def btn_clickEditRouteur(self, myCtrl):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            
        But : Fonction appelant la fonction deleteRouteur permettant de supprimer un routeur.
        
        Fonctionnement : Fermer la fenêtre courante. Trouver quel routeur est choisi. Appeller la fonction
                         editRouteur puis appeller la vue gerant la configuration des routeurs avec les 
                         informations du routeur choisi.
        '''
        global nomFichier
        self.close()
        for items in self.findChildren(QRadioButton):
            if items.isChecked():
                reponse = self.myCtrl.editRouteur(nomFichier, items)

        if (reponse[0] == True):
            self.vueConfigRouteur(myCtrl, reponse[1], reponse[2], reponse[3])

    def btn_clickDeleteRouteur(self, myCtrl):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            
        But : Fonction appelant la fonction deleteRouteur permettant de supprimer un routeur.
        
        Fonctionnement : Trouver quel routeur est choisi. Fermer la fenêtre courante puis lancer la vue de l'accueil 
                         des interfaces du routeur.
        '''
        global nomFichier

        for items in self.findChildren(QRadioButton):
            myCtrl.deleteRouteur(nomFichier, items)
        self.close()
        self.__init__(myCtrl)

    def btn_clickSelectRouteur(self, myCtrl):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            
        But : Fonction appelant la vue de l'accueil des interfaces.
        
        Fonctionnement : Fermer la fenêtre courante. Trouver quel routeur est choisi puis lancer la vue de l'accueil 
                         des interfaces du routeur.
        '''
        self.close()
        for items in self.findChildren(QRadioButton):
            if items.isChecked():
                nomRouteur = items.text()
        self.accueilInterface(myCtrl, nomRouteur)

    def btn_clickAddRouteur(self, myCtrl):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            
        But : Fonction appelant la vue chargée d'ajouter un routeur.
        
        Fonctionnement : Fermer la fenêtre courante puis lancer la vue chargée d'ajouter un routeur.
        '''
        self.close()
        self.vueAjouterRouteur(myCtrl)

    def btn_clickCancelRouteur(self, myCtrl):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            
        But : Fonction permettant d'annuler l'enregistrement, la modification et l'ajout d'une interface.
        
        Fonctionnement : Fermer la fenêtre courante puis lancer la vue de l'accueil des interfaces.
        '''
        self.close()
        self.__init__(myCtrl)

    def btn_clickAddSaveRouteur(self, myCtrl):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            
        But : Effectuer la sauvegarde du nouveau routeur en question via l'appel de la fonction
              addSaveRouteur.
        
        Fonctionnement : Appeler la fonction addSaveRouteur. Puis fermer la 
              fenêtre courante et lancer la vue de l'accueil.
        '''
        global nomFichier

        textLe1 = self.le1.text()
        textLe2 = self.le2.text()
        textLe3 = self.le3.text()

        myCtrl.addSaveRouteur(nomFichier, textLe1, textLe2, textLe3)

        self.close()
        self.__init__(myCtrl)

    def btn_clickEditSaveRouteur(self, myCtrl, nomRouteur, adresseIP, masque):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            - adresseIP (String) : adresse IP du routeur
            - masque (String) : masque du routeur

            
        But : Effectuer la sauvegarde des modifications du routeur en question via l'appel de la fonction
              editSaveRouteur.
        
        Fonctionnement : Appeler la fonction editSaveRouteur. Puis fermer la 
              fenêtre courante et lancer la vue de l'accueil.
        '''
        global nomFichier

        myCtrl.editSaveRouteur(nomFichier, nomRouteur, adresseIP, masque)

        self.close()
        self.__init__(myCtrl)

#=========== INTERFACE ===========#

    def accueilInterface(self, myCtrl, nomRouteur, parent=None):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller    
            - nomRouteur (String) : nom du routeur possédant l'interface
            
        But : Fonction qui met en place la vue d'accueil.
        '''

        # Initialisation variable globale
        global nomFichier

        # Héritage - appel à la classe mère
        super(View, self).__init__(parent)

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Mise en place du layout
        self.layout = QFormLayout()

        # Menu Bar
        self.menu = QMenuBar()
        self.menu.setStyleSheet(self.stylesheet)
        self.menuFichier = self.menu.addMenu("Fichier")
        self.layout.addRow(self.menu)

        # Création sous menu Ouvrir
        ouvrirMenu = QAction(QIcon('Logo\open.png'), '   Ouvrir', self)
        ouvrirMenu.setShortcut('Ctrl+O')
        ouvrirMenu.triggered.connect(lambda: self.openDb(myCtrl))
        self.menuFichier.addAction(ouvrirMenu)

        # Création sous menu Enregistrer
        enregistrerMenu = QAction(QIcon('Logo\save.png'),
                                  '   Enregistrer sous', self)
        enregistrerMenu.setShortcut('Ctrl+S')
        enregistrerMenu.triggered.connect(self.saveDb)
        self.menuFichier.addAction(enregistrerMenu)

        # Action sous menu Quitter
        quitterMenu = QAction(QIcon('Logo\exit.png'), '   Quitter', self)
        quitterMenu.setShortcut('Ctrl+Q')
        quitterMenu.triggered.connect(app.quit)
        quitterMenu.triggered.connect(self.close)
        self.menuFichier.addAction(quitterMenu)

        # Texte liste interface
        self.textList = QLabel("Listes des interfaces :")
        self.textList.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.textList)

        # Ajout des checkbox
        with open(nomFichier, 'r') as f:
            lignes = f.readlines()

            for ligneCourante in lignes:
                if (ligneCourante.split(',')[0] == nomRouteur):
                    try:
                        global compteur
                        for i in range(3, len(ligneCourante), 4):
                            if (len(ligneCourante.split(",")[i].strip()) != 0):
                                locals()['self.checkboxInterface%d' %
                                         compteur] = QRadioButton(
                                             ligneCourante.split(",")[i])
                                locals()['self.checkboxInterface%d' %
                                         compteur].setStyleSheet(
                                             self.stylesheet)
                                self.layout.addWidget(
                                    locals()['self.checkboxInterface%d' %
                                             compteur])
                        compteur += 1
                    except IndexError:
                        pass

        # Mise en place de la table de routage
        self.tableRoutage = QTextEdit()
        route = myCtrl.sshShowRoute(nomFichier, nomRouteur)
        self.tableRoutage.setStyleSheet(self.stylesheet)
        self.tableRoutage.setText("Table de routage :\n" + route)
        self.tableRoutage.setEnabled(False)
        self.tableRoutage.setStyleSheet(self.stylesheet)

        # Création des boutons
        self.buttonDeleteRoute = QPushButton("Supprimer une route")
        self.buttonDeleteRoute.setIcon(QIcon('Logo\delete.png'))
        self.buttonDeleteRoute.setStyleSheet(self.stylesheet)

        self.buttonAddRoute = QPushButton("Ajouter une route")
        self.buttonAddRoute.setIcon(QIcon('Logo\plus.png'))
        self.buttonAddRoute.setStyleSheet(self.stylesheet)

        self.buttonAdd = QPushButton("Ajouter une interface")
        self.buttonAdd.setIcon(QIcon('Logo\plus.png'))
        self.buttonAdd.setStyleSheet(self.stylesheet)

        self.buttonSelect = QPushButton("Voir l'interface")
        self.buttonSelect.setIcon(QIcon('Logo\select.png'))
        self.buttonSelect.setStyleSheet(self.stylesheet)

        self.buttonDelete = QPushButton("Supprimer l'interface")
        self.buttonDelete.setIcon(QIcon('Logo\delete.png'))
        self.buttonDelete.setStyleSheet(self.stylesheet)

        self.buttonBackHome = QPushButton("Revenir à l'accueil")
        self.buttonBackHome.setIcon(QIcon('Logo\home.png'))
        self.buttonBackHome.setStyleSheet(self.stylesheet)

        self.buttonOnRoutage = QPushButton("Activer le routage")
        self.buttonOnRoutage.setIcon(QIcon('Logo\ON.png'))
        self.buttonOnRoutage.setStyleSheet(self.stylesheet)

        self.buttonOffRoutage = QPushButton("Désactiver le routage")
        self.buttonOffRoutage.setIcon(QIcon('Logo\OFF.png'))
        self.buttonOffRoutage.setStyleSheet(self.stylesheet)

        # Ajout des widgets au layout
        self.layout.addRow(self.tableRoutage)
        self.layout.addRow(self.buttonOnRoutage, self.buttonOffRoutage)
        self.layout.addRow(self.buttonAddRoute, self.buttonDeleteRoute)
        self.layout.addRow(self.buttonSelect)
        self.layout.addRow(self.buttonAdd, self.buttonDelete)
        self.layout.addRow(self.buttonBackHome)

        self.setLayout(self.layout)

        # Filtre afin de désactiver les boutons si aucun routeur crée
        if not self.findChildren(QRadioButton):
            self.buttonSelect.setEnabled(False)
            self.buttonDelete.setEnabled(False)

        # Gestion des events
        self.buttonSelect.clicked.connect(
            lambda: self.btn_clickSelectInterface(myCtrl, nomRouteur))
        self.buttonAdd.clicked.connect(
            lambda: self.btn_clickAddInterface(myCtrl, nomRouteur))
        self.buttonDelete.clicked.connect(
            lambda: self.btn_clickDeleteInterface(myCtrl, nomRouteur))
        self.buttonBackHome.clicked.connect(
            lambda: self.btn_clickBackHome(myCtrl))
        self.buttonAddRoute.clicked.connect(
            lambda: self.btn_clickShowVueAddRoute(myCtrl, nomRouteur))
        self.buttonDeleteRoute.clicked.connect(
            lambda: self.btn_clickShowVueDeleteRoute(myCtrl, nomRouteur))
        self.buttonOnRoutage.clicked.connect(lambda: self.btn_clickOnRoutage(
            myCtrl, nomRouteur, self.buttonOnRoutage, self.buttonOffRoutage))
        self.buttonOffRoutage.clicked.connect(lambda: self.btn_clickOffRoutage(
            myCtrl, nomRouteur, self.buttonOnRoutage, self.buttonOffRoutage))

        self.setWindowTitle("Choix interface du routeur : " + nomRouteur)
        self.setGeometry(500, 200, 500, 400)
        self.show()

    def vueAjouterInterface(self, myCtrl, nomRouteur, parent=None):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller    
            - nomRouteur (String) : nom du routeur possédant l'interface
            
        But : Fonction qui met en place la vue permettant d'ajouter une interface.
        '''

        # Héritage - appel à la classe mère
        super(View, self).__init__(parent)

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Mise en place du layout
        self.layout = QFormLayout()

        # Mise en place des widgets
        self.text1 = QLabel()
        self.text1.setText("Nom : ")
        self.text1.setStyleSheet(self.stylesheet)

        self.le1 = QLineEdit()
        self.le1.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text1, self.le1)

        self.text2 = QLabel()
        self.text2.setText("Adresse IP : ")
        self.text2.setStyleSheet(self.stylesheet)

        self.le2 = QLineEdit()
        self.le2.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text2, self.le2)

        self.text3 = QLabel()
        self.text3.setText("Masque de sous réseaux : ")
        self.text3.setStyleSheet(self.stylesheet)

        self.le3 = QLineEdit()
        self.le3.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text3, self.le3)

        self.text4 = QLabel()
        self.text4.setText("Passerelle par défaut : ")
        self.text4.setStyleSheet(self.stylesheet)

        self.le4 = QLineEdit()
        self.le4.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text4, self.le4)

        self.buttonSave = QPushButton("Ajouter l'interface")
        self.buttonSave.setIcon(QIcon('Logo\plus.png'))
        self.buttonSave.setStyleSheet(self.stylesheet)

        self.buttonCancel = QPushButton("Annuler")
        self.buttonCancel.setIcon(QIcon('Logo\exit.png'))
        self.buttonCancel.setStyleSheet(self.stylesheet)

        self.layout.addRow(self.buttonSave, self.buttonCancel)
        self.setLayout(self.layout)

        # Gestion des events
        self.buttonSave.clicked.connect(
            lambda: self.btn_clickAddSaveInterface(myCtrl, nomRouteur))
        self.buttonCancel.clicked.connect(
            lambda: self.btn_clickCancelInterface(myCtrl, nomRouteur))

        self.setWindowTitle("Ajouter une interface")
        self.show()

    def vueConfigInterface(self,
                           myCtrl,
                           nomRouteur,
                           nomInterface,
                           adresseIP,
                           masque,
                           passerelleDefaut,
                           parent=None):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller    
            - nomRouteur (String) : nom du routeur possédant l'interface
            - nomInterface (String) : nom de l'interface modifiée
            - adresseIP (String) : adresse IP de l'interface modifiée
            - masque (String) : masque de l'interface modifiée
            - passerelleDefaut (String) : passerelle par defaut de l'interface modifiée
            
        But : Fonction qui met en place la vue permettant de configurer une interface.
        '''

        # Héritage - appel à la classe mère
        super(View, self).__init__(parent)

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Création du layout
        self.layout = QFormLayout()

        # Mise en place des widgets
        self.text1 = QLabel()
        self.text1.setText("Nom : ")
        self.text1.setStyleSheet(self.stylesheet)

        self.le1 = QLineEdit()
        self.le1.setText(nomInterface)
        self.le1.setEnabled(False)
        self.le1.setStyleSheet(self.stylesheet)

        self.layout.addRow(self.text1, self.le1)

        self.text2 = QLabel()
        self.text2.setText("Adresse IP : ")
        self.text2.setStyleSheet(self.stylesheet)

        self.le2 = QLineEdit()
        self.le2.setText(adresseIP)
        self.le2.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text2, self.le2)

        self.text3 = QLabel()
        self.text3.setText("Masque de sous réseaux : ")
        self.text3.setStyleSheet(self.stylesheet)

        self.le3 = QLineEdit()
        self.le3.setText(masque)
        self.le3.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text3, self.le3)

        self.text4 = QLabel()
        self.text4.setText("Passerelle par défaut : ")
        self.text4.setStyleSheet(self.stylesheet)

        self.le4 = QLineEdit()
        self.le4.setText(passerelleDefaut)
        self.le4.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text4, self.le4)

        self.buttonSaveInterface = QPushButton("Enregistrer")
        self.buttonSaveInterface.setIcon(QIcon('Logo\save.png'))
        self.buttonSaveInterface.setStyleSheet(self.stylesheet)

        self.buttonCancelInterface = QPushButton("Annuler")
        self.buttonCancelInterface.setIcon(QIcon('Logo\exit.png'))
        self.buttonCancelInterface.setStyleSheet(self.stylesheet)

        self.layout.addRow(self.buttonSaveInterface,
                           self.buttonCancelInterface)

        # Gestion des events
        self.buttonSaveInterface.clicked.connect(
            lambda: self.btn_clickEditSaveInterface(
                myCtrl, nomRouteur, self.le1.text(), self.le2.text(),
                self.le3.text(), self.le4.text()))
        self.buttonCancelInterface.clicked.connect(
            lambda: self.btn_clickCancelInterface(myCtrl, nomRouteur))

        self.setLayout(self.layout)
        self.setWindowTitle("Configuration de l'interface : " + nomInterface)
        self.show()

    def btn_clickOnRoutage(self, myCtrl, nomRouteur, boutonON, boutonOFF):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            - boutonON (Objet Bouton) : Bouton "Activer routage"
            - boutonOFF (Objet Bouton) : Bouton "Désactiver routage"
            
        But : Activer le routage du routeur
        
        Fonctionnement : Appel la fonction sshEnableRoutage pour activer le routage, puis fixe le boutonON
                         comme désactivé et le boutonOFF comme activé
        '''
        global nomFichier

        myCtrl.sshEnableRoutage(nomFichier, nomRouteur)
        boutonON.setEnabled(False)
        boutonOFF.setEnabled(True)

    def btn_clickOffRoutage(self, myCtrl, nomRouteur, boutonON, boutonOFF):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            - boutonON (Objet Bouton) : Bouton "Activer routage"
            - boutonOFF (Objet Bouton) : Bouton "Désactiver routage"
            
        But : Désactiver le routage du routeur
        
        Fonctionnement : Appel la fonction sshEnableRoutage pour désactiver le routage, puis fixe le boutonON
                         comme activé et le boutonOFF comme désactivé
        '''
        global nomFichier

        myCtrl.sshDisableRoutage(nomFichier, nomRouteur)
        boutonON.setEnabled(True)
        boutonOFF.setEnabled(False)

    def btn_clickShowVueAddRoute(self, myCtrl, nomRouteur):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            
        But : Afficher la vue permettant d'ajouter une route.
        
        Fonctionnement : Fermer la fenêtre courante puis lancer la vue chargée de l'ajout d'une route.
        '''
        self.close()
        self.vueAddRoute(myCtrl, nomRouteur)

    def btn_clickShowVueDeleteRoute(self, myCtrl, nomRouteur):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            
        But : Afficher la vue permettant de supprimer une route.
        
        Fonctionnement : Fermer la fenêtre courante puis lancer la vue chargée de la suppression d'une route.
        '''
        self.close()
        self.vueDeleteRoute(myCtrl, nomRouteur)

    def btn_clickBackHome(self, myCtrl):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            
        But : Retourner à la page d'accueil
        
        Fonctionnement : Fermer la fenêtre courante puis lancer la vue de l'accueil.
        '''
        self.close()
        self.__init__(myCtrl)

    def btn_clickAddInterface(self, myCtrl, nomRouteur):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            
        But : Appeller la vue permettant d'ajouter une interface
        
        Fonctionnement : Fermer la fenêtre courante puis lancer la vue chargée d'ajouter une interface.
        '''
        self.close()
        self.vueAjouterInterface(myCtrl, nomRouteur)

    def btn_clickDeleteInterface(self, myCtrl, nomRouteur):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            
        But : Supprimer une interface en appellant les fonctions deleteInterface et sshChangeInterface
        
        Fonctionnement : Appeller la fonction deleteInterface pour chaque checkBox (le tri se fera dans cette fonction)
                         puis appel la fonction sshChangeInterface. Enfin, on ferme la fenêtre courante et on appelle
                         la vue de l'accueil des interfaces.
        '''
        global nomFichier

        for items in self.findChildren(QRadioButton):
            myCtrl.deleteInterface(nomFichier, nomRouteur, items)

        myCtrl.sshChangeInterface(nomFichier, nomRouteur)

        self.close()
        self.accueilInterface(myCtrl, nomRouteur)

    def btn_clickSelectInterface(self, myCtrl, nomRouteur):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            
        But : Afficher la vue de configuration d'une interferface. Si aucune interface n'est choisi, appeller la
              vue de l'accueil des interfaces.
        
        Fonctionnement : Fermer la fenêtre courante. Vérifier quel checkbox est coché puis appeller la fonction 
                         selectInterface pour récupérer les informations liées au nom de l'interface. Puis appeller
                         la vue de configuration d'une interface avec les bons paramètres. 
        '''

        global nomFichier
        self.close()
        indicateur = False
        for items in self.findChildren(QRadioButton):
            if items.isChecked():
                indicateur = True
                reponse = myCtrl.selectInterface(nomFichier, nomRouteur, items)

        if (reponse[0] == True):
            self.vueConfigInterface(myCtrl, nomRouteur, reponse[1], reponse[2],
                                    reponse[3], reponse[4])

        # Si aucun bouton radio est check mais qu'on appuie quand meme sur "Sélectionner"
        if indicateur == False:
            self.accueilInterface(myCtrl, nomRouteur)

    def btn_clickAddSaveInterface(self, myCtrl, nomRouteur):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            
        But : Effectuer la sauvegarde de la nouvelle interface en question via l'appel des fonctions 
              addSaveInterface et sshChangeInterface.
        
        Fonctionnement : Appeler la fonction addSaveInterface et sshChangeInterface. Puis fermer la 
              fenêtre courante et lancer la vue de l'accueil des interfaces.
        '''
        global nomFichier

        textLe1 = self.le1.text()
        textLe2 = self.le2.text()
        textLe3 = self.le3.text()
        textLe4 = self.le4.text()

        myCtrl.addSaveInterface(nomFichier, nomRouteur, textLe1, textLe2,
                                textLe3, textLe4)

        myCtrl.sshChangeInterface(nomFichier, nomRouteur)

        self.close()
        self.accueilInterface(myCtrl, nomRouteur)

    def btn_clickEditSaveInterface(self, myCtrl, nomRouteur, nomInterface,
                                   adresseIP, masque, passerelleDefaut):
        '''
        Paramètres :
            - myCtrl (Controller) : instance de la classe Controller            
            - nomRouteur (String) : nom du routeur
            - nomInterface (String) : nom de l'interface
            - adresseIP (String) : adresse IP de l'interface
            - masque (String) : masque de l'interface
            - passerelleDefaut (String) : passerelle par defaut de l'interface
            
        But : Effectuer la sauvegarde des modifications sur l'interface en question via l'appel des fonctions 
              editSaveInterface et sshChangeInterface.
        
        Fonctionnement : Appeler la fonction editSaveInterface et sshChangeInterface. Puis fermer la 
              fenêtre courante et lancer la vue de l'accueil des interfaces.
        '''
        global nomFichier

        myCtrl.editSaveInterface(nomFichier, nomRouteur, nomInterface,
                                 adresseIP, masque, passerelleDefaut)

        myCtrl.sshChangeInterface(nomFichier, nomRouteur)

        self.close()
        self.accueilInterface(myCtrl, nomRouteur)

    def btn_clickCancelInterface(self, myCtrl, nomRouteur):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            - nomRouteur (String) : nom du routeur choisi
            
        But : Fonction permettant d'annuler l'enregistrement, la modification et l'ajout d'une interface.
        
        Fonctionnement : Fermer la fenêtre courante puis lancer la vue de l'accueil des interfaces.
        '''
        self.close()
        self.accueilInterface(myCtrl, nomRouteur)

    def saveDb(self):
        '''            
        But : Fonction permettant de sauvegarder les configurations faites sur l'application.
        
        Fonctionnement : Faire appel à la fonction getSaveFileName pour affichier la fenêtre de sauvegarde d'un
                         fichier. Puis copier/coller le fichier avec le nouveau nom. En cas d'erreur, on ne fait
                         rien.
        '''
        try:
            savName = QFileDialog.getSaveFileName(self, 'Sauvegarder fichier',
                                                  'c:\\', "Data files (*.csv)")
            global nomFichier
            shutil.copyfile(nomFichier, savName[0])
        except FileNotFoundError:
            pass

    def openDb(self, myCtrl):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            
        But : Fonction permettant d'ouvrir un fichier existant pour l'importer dans l'application.
        
        Fonctionnement : Faire appel à la fonction getOpenFileName pour affichier la fenêtre d'ouverture d'un
                         fichier. Puis fermer la fenêtre et lancer la vue de l'accueil. En cas d'erreur, on fixe le nom
                         du fichier par defaut et on lance la vue de l'accueil.
        '''
        global nomFichier
        try:
            fname = QFileDialog.getOpenFileName(
                self, 'Ouvrir fichier',
                'G:/EPISEN/ITS 1/S2/IHM/Projet/Test solo/',
                "Data files (*.csv)")
            nomFichier = fname[0]
            self.close()
            self.__init__(myCtrl)
        except FileNotFoundError:
            nomFichier = 'database.csv'
            self.__init__(myCtrl)

#=========== ROUTE ===========#

    def vueAddRoute(self, myCtrl, nomRouteur, parent=None):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            - nomRouteur (String) : nom du routeur
            
        But : Fonction qui met en place la vue permettant d'ajouter une route.
        '''
        # Héritage - appel à la classe mère
        super(View, self).__init__(parent)

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Mise en place du layout
        self.layout = QFormLayout()

        # Mise en place des widgets
        self.text1 = QLabel("Destination : ")
        self.text1.setStyleSheet(self.stylesheet)

        self.le1 = QLineEdit()
        self.le1.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text1, self.le1)

        self.text2 = QLabel("Masque : ")
        self.text2.setStyleSheet(self.stylesheet)

        self.le2 = QLineEdit()
        self.le2.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text2, self.le2)

        self.text3 = QLabel("Via : ")
        self.text3.setStyleSheet(self.stylesheet)

        self.le3 = QLineEdit()
        self.le3.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text3, self.le3)

        self.buttonSaveRoute = QPushButton("Ajouter la route")
        self.buttonSaveRoute.setIcon(QIcon('Logo\plus.png'))
        self.buttonSaveRoute.setStyleSheet(self.stylesheet)

        self.buttonCancelRoute = QPushButton("Annuler")
        self.buttonCancelRoute.setIcon(QIcon('Logo\exit.png'))
        self.buttonCancelRoute.setStyleSheet(self.stylesheet)

        self.layout.addRow(self.buttonSaveRoute, self.buttonCancelRoute)
        self.setLayout(self.layout)

        # Gestion des events
        self.buttonSaveRoute.clicked.connect(
            lambda: self.btn_clickAddRoute(myCtrl, nomRouteur, self.le1.text(),
                                           self.le2.text(), self.le3.text()))
        self.buttonCancelRoute.clicked.connect(
            lambda: self.btn_clickCancelRoute(myCtrl, nomRouteur))

        self.setWindowTitle("Ajouter une route")
        self.show()

    def vueDeleteRoute(self, myCtrl, nomRouteur, parent=None):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            - nomRouteur (String) : nom du routeur
            
        But : Fonction qui met en place la vue permettant de supprimer une route.
        '''
        # Héritage - appel à la classe mère
        super(View, self).__init__(parent)

        # Stylesheet
        self.stylesheet = open('style.css').read()
        self.setStyleSheet(self.stylesheet)

        # Mise en place du layout
        self.layout = QFormLayout()

        # Mise en place des widgets
        self.text1 = QLabel("Destination : ")
        self.text1.setStyleSheet(self.stylesheet)

        self.le1 = QLineEdit()
        self.le1.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text1, self.le1)

        self.text2 = QLabel("Masque : ")
        self.text2.setStyleSheet(self.stylesheet)

        self.le2 = QLineEdit()
        self.le2.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text2, self.le2)

        self.text3 = QLabel("Via : ")
        self.text3.setStyleSheet(self.stylesheet)

        self.le3 = QLineEdit()
        self.le3.setStyleSheet(self.stylesheet)
        self.layout.addRow(self.text3, self.le3)

        self.buttonDeleteRoute = QPushButton("Supprimer la route")
        self.buttonDeleteRoute.setIcon(QIcon('Logo\delete.png'))
        self.buttonDeleteRoute.setStyleSheet(self.stylesheet)

        self.buttonCancelRoute = QPushButton("Annuler")
        self.buttonCancelRoute.setIcon(QIcon('Logo\exit.png'))
        self.buttonCancelRoute.setStyleSheet(self.stylesheet)

        self.layout.addRow(self.buttonDeleteRoute, self.buttonCancelRoute)
        self.setLayout(self.layout)

        # Gestion des events
        self.buttonDeleteRoute.clicked.connect(
            lambda: self.btn_clickDeleteRoute(myCtrl, nomRouteur,
                                              self.le1.text(), self.le2.text(),
                                              self.le3.text()))
        self.buttonCancelRoute.clicked.connect(
            lambda: self.btn_clickCancelRoute(myCtrl, nomRouteur))

        self.setWindowTitle("Supprimer une route")
        self.show()

    def btn_clickCancelRoute(self, myCtrl, nomRouteur):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            - nomRouteur (String) : nom du routeur
            
        But : Fonction qui ferme la fenetre courante et lance la fenetre d'accueil des interfaces.
        '''
        self.close()
        self.accueilInterface(myCtrl, nomRouteur)

    def btn_clickAddRoute(self, myCtrl, nomRouteur, destination, masque, via):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            - nomRouteur (String) : nom du routeur
            - destination (String) : destination de la route que l'on va créer
            - masque (String) : masque de la route que l'on va créer
            - via (String) : passerelle par défaut de la route que l'on va créer
            
        But : Fonction qui appelle la fonction sshAddRoute, ferme la fenetre courante et lance la fenetre
              d'accueil des interfaces.
        '''
        global nomFichier

        myCtrl.sshAddRoute(nomFichier, nomRouteur, destination, masque, via)

        self.close()
        self.accueilInterface(myCtrl, nomRouteur)

    def btn_clickDeleteRoute(self, myCtrl, nomRouteur, destination, masque,
                             via):
        '''
        Paramètres : 
            - myCtrl (Controller) : instance de la classe Controller
            - nomRouteur (String) : nom du routeur
            - destination (String) : destination de la route que l'on va créer
            - masque (String) : masque de la route que l'on va créer
            - via (String) : passerelle par défaut de la route que l'on va créer
            
        But : Fonction qui appelle la fonction sshDelRoute, ferme la fenetre courante et lance la fenetre
              d'accueil des interfaces.
        '''

        global nomFichier

        myCtrl.sshDelRoute(nomFichier, nomRouteur, destination, masque, via)

        self.close()
        self.accueilInterface(myCtrl, nomRouteur)
예제 #5
0
class ViewSourceDialog(QMainWindow):
    closed = pyqtSignal(QObject)

    def __init__(self, parent=None, title="Source"):
        super(ViewSourceDialog, self).__init__()
        self.setParent(parent)
        self.menuBar = QMenuBar(self)
        self.menuBar.setStyleSheet(
            """QMenuBar { background: transparent; border: 0; }
                                      QMenuBar::item { background: transparent;
                                                       color: palette(window-text); }
                                      QMenuBar::item:pressed { background: palette(highlight);
                                                               color: palette(highlighted-text); }"""
        )
        self.setMenuBar(self.menuBar)

        self.text = ""
        self.findFlag = None

        self.fileMenu = QMenu(tr("&File"), self.menuBar)
        self.menuBar.addMenu(self.fileMenu)

        self.saveAsAction = QAction(tr("&Save As..."), self)
        self.saveAsAction.setShortcut("Ctrl+S")
        self.saveAsAction.triggered.connect(self.saveAs)
        self.addAction(self.saveAsAction)
        self.fileMenu.addAction(self.saveAsAction)

        self.viewMenu = QMenu(tr("&View"), self.menuBar)
        self.menuBar.addMenu(self.viewMenu)

        self.findAction = QAction(tr("&Find..."), self)
        self.findAction.setShortcut("Ctrl+F")
        self.findAction.triggered.connect(self.find)
        self.addAction(self.findAction)
        self.viewMenu.addAction(self.findAction)

        self.findNextAction = QAction(tr("Find Ne&xt"), self)
        self.findNextAction.setShortcut("Ctrl+G")
        self.findNextAction.triggered.connect(self.findNext)
        self.addAction(self.findNextAction)
        self.viewMenu.addAction(self.findNextAction)

        self.findPreviousAction = QAction(tr("Find Pre&vious"), self)
        self.findPreviousAction.setShortcut("Ctrl+Shift+G")
        self.findPreviousAction.triggered.connect(self.findPrevious)
        self.addAction(self.findPreviousAction)
        self.viewMenu.addAction(self.findPreviousAction)

        self.sourceView = SourceView(self)
        self.sourceView.setReadOnly(True)
        self.sourceView.setFontFamily("monospace")
        self.setCentralWidget(self.sourceView)
        closeWindowAction = QAction(self)
        closeWindowAction.setShortcut("Ctrl+W")
        closeWindowAction.triggered.connect(self.close)
        self.addAction(closeWindowAction)
        self.setWindowTitle(title)

        self.resize(640, 480)

    def closeEvent(self, ev):
        super(ViewSourceDialog, self).closeEvent(ev)
        self.deleteLater()

    def saveAs(self):
        fname = QFileDialog.getSaveFileName(None, tr("Save As..."),
                                            self.windowTitle() + ".txt",
                                            tr("Text files (*.txt)"))
        if type(fname) is tuple:
            fname = fname[0]
        if fname:
            g = str(self.sourceView.toPlainText())
            f = open(fname, "w")
            f.write(g)
            f.close()

    def find(self):
        find = QInputDialog.getText(self, tr("Find"), tr("Search for:"),
                                    QLineEdit.Normal, self.text)
        if find[1]:
            self.text = find[0]
        else:
            self.text = ""
        if self.findFlag:
            self.sourceView.find(self.text, self.findFlag)
        else:
            self.sourceView.find(self.text)

    def findNext(self, findFlag=None):
        if not self.text:
            self.find()
        else:
            self.findFlag = findFlag
            if self.findFlag:
                self.sourceView.find(self.text, self.findFlag)
            else:
                self.sourceView.find(self.text)

    def findPrevious(self):
        self.findNext(QTextDocument.FindBackward)

    def setFindFlag(self):
        if self.findReverseAction.isChecked():
            self.findFlag = QTextDocument.FindBackward
        else:
            self.findFlag = None

    def setPlainText(self, *args, **kwargs):
        self.sourceView.setPlainText(*args, **kwargs)

    def doNothing(self):
        pass

    def closeEvent(self, ev):
        self.closed.emit(self)
        self.deleteLater()
        ev.accept()
예제 #6
0
파일: winApp.py 프로젝트: piekill/piepresto
class WinApp(QMainWindow, Ui_MainWindow):
    stmt_signal = pyqtSignal(str)

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

        self.setupUi(self)
        self.connButtonBox.button(QDialogButtonBox.Ok).setText("Connect")
        self.runButtonBox.button(QDialogButtonBox.Ok).setText("Run")
        self.tunnelButton.clicked[bool].connect(self.toggle_tunnel)
        self.tunnelWidget.hide()
        self.keyFileButton.clicked.connect(self.choose_keyfile)
        self.clearButton.clicked.connect(self.clear_tunnel)
        self.keyComboBox.activated[str].connect(self.set_key_type)

        self.db_engine = DBEngine()
        self.db_engine.result_signal.connect(self.show_results)
        self.db_engine.progress_signal.connect(self.set_progress)
        self.db_engine.error_signal.connect(self.show_error)
        self.db_engine.msg_signal.connect(self.show_msg)
        self.stmt_signal.connect(self.db_engine.receive_stmt)

        self.db_lite = DBLite()
        self.tunnel = Tunnel()
        self.tunnel_keyfile = ""
        self.data_schema = []
        self.settings = QSettings()
        self.restore_settings()

        history = self.db_lite.history()
        self.historyMenuBar = QMenuBar(self.sqlWidget)
        self.historyMenuBar.setNativeMenuBar(False)
        self.historyMenu = self.historyMenuBar.addMenu('     &History   ⇲    ')
        actions = [
            QAction(sql.replace('\n', ' '), self.historyMenu)
            for sql in history
        ]
        for i in range(len(actions)):
            actions[i].triggered.connect(partial(self.use_history, history[i]))
        self.historyMenu.addActions(actions)

        self.history_cache = pylru.lrucache(history_limit, self.remove_action)
        for i in reversed(range(len(history))):
            self.history_cache[history[i]] = {
                KEY_ACTION: actions[i],
                KEY_RESULTS: [],
                KEY_COLUMNS: []
            }

        self.historyMenu.setStyleSheet("""
        QMenu {
            max-width: 1000px;
            font-size: 12px;
        }
        """)
        self.historyMenuBar.setStyleSheet("""
        QMenuBar {
            border: None;
        }
        QMenuBar::item {
            background: #404040;
            color: #ffffff;
            border-radius: 4px;
        }
        QMenuBar::item:selected {
            background: rgba(1, 1, 1, 0.2);;
            color: #404040;
            border-radius: 4px;
        }
        """)
        self.sqlWidgetLayout.insertWidget(0, self.historyMenuBar)

        self.connButtonBox.accepted.connect(self.connect)
        self.connButtonBox.rejected.connect(self.disconnect)
        self.runButtonBox.accepted.connect(self.run)
        self.runButtonBox.rejected.connect(self.cancel)
        self.tablesWidget.itemDoubleClicked.connect(self.get_meta)
        self.tablesWidget.itemExpanded.connect(self.get_meta)

        self.progressBar = QProgressBar()
        self.statusbar.addPermanentWidget(self.progressBar)
        self.progressBar.setValue(100)
        QApplication.processEvents()

        self.highlight = syntax.PrestoHighlighter(self.sqlEdit)

        self.dataWidget.setContextMenuPolicy(Qt.CustomContextMenu)
        self.dataWidget.customContextMenuRequested.connect(
            self.show_table_context_menu)
        self.dataWidget.horizontalHeader().setStretchLastSection(False)
        self.dataWidget.horizontalHeader().setSectionResizeMode(
            QHeaderView.ResizeToContents)

        self.schemaView.header().setStretchLastSection(False)
        self.schemaView.header().setSectionResizeMode(
            QHeaderView.ResizeToContents)

        self.runButtonBox.button(
            QDialogButtonBox.Ok).setShortcut("Ctrl+Return")

        self.completer = SQLCompleter(self)
        self.sqlEdit.setCompleter(self.completer)

        self.set_key_type(self.keyComboBox.currentText())
        self.sqlEdit.setFocus()

    def connect(self):
        self.tablesWidget.clear()
        self.schemaView.clear()
        try:
            if self.serverEdit.text().strip() and self.gatewayEdit.text(
            ).strip() and self.tunnelUserEdit.text().strip():
                self.statusbar.showMessage('Starting tunnel')
                QApplication.processEvents()
                self.tunnel.start_tunnel(
                    self.serverEdit.text().strip(),
                    self.gatewayEdit.text().strip(),
                    self.tunnelUserEdit.text().strip(),
                    self.keyComboBox.currentText() == 'KeyFile',
                    self.tunnel_keyfile, self.pwdLineEdit.text(),
                    self.urlEdit.text().strip())

            self.statusbar.showMessage('Connecting')
            QApplication.processEvents()
            self.db_engine.connect(self.urlEdit.text().strip(),
                                   self.userEdit.text().strip())
            self.statusbar.showMessage('Fetching db info')
            QApplication.processEvents()

            dbs = self.db_engine.dbs()
            for db in dbs:
                db_item = QTreeWidgetItem([db])
                db_item.setChildIndicatorPolicy(QTreeWidgetItem.ShowIndicator)
                self.tablesWidget.addTopLevelItem(db_item)
            self.completer.addItems(dbs)
            self.statusbar.showMessage('Connected')

        except Exception as err:
            QMessageBox.critical(self, "Error", str(err))
            self.db_engine.close()
            self.statusbar.showMessage('Disconnected')

    def disconnect(self):
        self.db_engine.close()
        self.tunnel.stop_tunnel()
        self.schemaView.clear()
        self.tablesWidget.clear()
        self.statusbar.showMessage('Disconnected')

    def get_meta(self, item):
        try:
            if item.parent():
                columns = self.db_engine.columns(item.parent().text(0),
                                                 item.text(0))
                self.set_columns(columns)
                self.completer.addItems([column[0] for column in columns])
            else:
                if item.childCount() <= 0:
                    tables = self.db_engine.tables(item.text(0))
                    item.addChildren(
                        [QTreeWidgetItem([table]) for table in tables])
                    self.completer.addTreeItem(item)
        except Exception as err:
            QMessageBox.critical(self, "Error", str(err))

    def set_columns(self, columns):
        try:
            self.schemaView.clear()
            for column in columns:
                column_item = self.type_tree(column[0],
                                             type_parser.parse(column[1]))
                self.schemaView.addTopLevelItem(column_item)
            self.schemaView.expandToDepth(2)
            for j in range(self.schemaView.columnCount()):
                self.schemaView.resizeColumnToContents(j)
        except Exception as err:
            QMessageBox.critical(self, "Error", str(err))

    def run(self):
        self.dataWidget.setRowCount(0)
        self.dataWidget.setColumnCount(0)
        try:
            self.stmt_signal.emit(self.sqlEdit.toPlainText().strip().replace(
                ';', ''))
            self.db_engine.start()
        except Exception as err:
            QMessageBox.critical(self, "Error", str(err))

    def show_results(self, results, columns, sql, save=True):
        try:
            num_cols = len(columns)
            num_rows = len(results)
            self.dataWidget.setRowCount(num_rows)
            self.dataWidget.setColumnCount(num_cols)
            for i in range(num_rows):
                for j in range(num_cols):
                    self.dataWidget.setItem(
                        i, j, QTableWidgetItem(str(results[i][j])))
            self.dataWidget.resizeColumnsToContents()
            for j in range(num_cols):
                header_label = columns[j][0]
                # header_width = self.fm.width(header_label)
                # if header_width > self.dataWidget.columnWidth(j):
                #     self.dataWidget.setColumnWidth(j, header_width)
                self.dataWidget.setHorizontalHeaderItem(
                    j, QTableWidgetItem(header_label))
            self.data_schema = [column[1] for column in columns]
            if not columns and not results:
                self.dataWidget.setColumnCount(1)
                self.dataWidget.setHorizontalHeaderItem(
                    0, QTableWidgetItem("Empty Result"))
            if save:
                self.save_history(sql, results, columns)
        except Exception as err:
            QMessageBox.critical(self, "Error", str(err))
        finally:
            self.statusbar.showMessage('Finished')

    def cancel(self):
        self.db_engine.cancel()

    def set_progress(self, progress):
        self.progressBar.setValue(progress)
        QApplication.processEvents()

    def save_history(self, sql, results, columns):
        if sql not in self.history_cache:
            action = QAction(sql.replace('\n', ' '), self.historyMenu)
            action.triggered.connect(partial(self.use_history, sql))
            self.history_cache[sql] = {
                KEY_ACTION: action,
                KEY_RESULTS: results,
                KEY_COLUMNS: columns
            }
        else:
            action = self.history_cache[sql][KEY_ACTION]
            self.historyMenu.removeAction(action)
            if len(results) * len(columns) <= CACHE_LIMIT:
                self.history_cache[sql][KEY_RESULTS] = results
                self.history_cache[sql][KEY_COLUMNS] = columns
            else:
                self.history_cache[sql][KEY_RESULTS] = []
                self.history_cache[sql][KEY_COLUMNS] = [
                    ("results too large to cache", "varchar")
                ]
        self.historyMenu.insertAction(
            self.historyMenu.actions()[0] if
            (self.historyMenu.actions()) else None, action)
        self.db_lite.upsert(sql)

    def use_history(self, sql):
        self.sqlEdit.setText(sql)
        QApplication.processEvents()
        cached = self.history_cache[sql]
        self.db_engine.result_signal.emit(cached[KEY_RESULTS],
                                          cached[KEY_COLUMNS], sql, False)
        self.statusbar.showMessage("Loaded cached history")

    def remove_action(self, sql, cached):
        self.historyMenu.removeAction(cached[KEY_ACTION])

    def show_table_context_menu(self, position):
        col = self.dataWidget.columnAt(position.x())
        dialog = QDialog(self, Qt.Popup)
        schema_view = QTreeWidget(dialog)
        schema_view.headerItem().setText(0, "Field")
        schema_view.headerItem().setText(1, "Type")
        root = type_parser.parse(self.data_schema[col])
        schema_tree = self.type_tree(
            self.dataWidget.horizontalHeaderItem(col).text(), root)
        schema_view.addTopLevelItem(schema_tree)
        schema_view.expandToDepth(2)
        schema_view.header().setStretchLastSection(False)
        schema_view.setSizeAdjustPolicy(
            QAbstractScrollArea.AdjustToContentsOnFirstShow)
        schema_view.header().setSectionResizeMode(QHeaderView.ResizeToContents)
        schema_view.setMinimumHeight(30)
        schema_view.setMaximumHeight(400)
        schema_view.adjustSize()
        schema_view.setHeaderHidden(True)

        dialog.move(
            self.dataWidget.mapToGlobal(position) +
            QPoint(dialog.width() / 5 * 2,
                   dialog.height() + 5))
        dialog.adjustSize()
        dialog.show()

    def type_tree(self, name, root):
        if root.children[0].data == 'primitive_type':
            return QTreeWidgetItem([name, root.children[0].children[0].value])
        elif root.children[0].data == 'row_type':
            root_widget = QTreeWidgetItem([name, 'row'])
            for i in range(len(root.children[0].children) // 2):
                name = root.children[0].children[i * 2].value
                child_type = root.children[0].children[i * 2 + 1]
                root_widget.addChild(self.type_tree(name, child_type))
            return root_widget
        elif root.children[0].data == 'array_type':
            if root.children[0].children[0].children[
                    0].data == 'primitive_type':
                return QTreeWidgetItem([
                    name, 'array(' +
                    root.children[0].children[0].children[0].children[0].value
                    + ')'
                ])
            else:
                root_widget = QTreeWidgetItem([name, 'array(row)'])
                for i in range(
                        len(root.children[0].children[0].children[0].children)
                        // 2):
                    name = root.children[0].children[0].children[0].children[
                        i * 2].value
                    child_type = root.children[0].children[0].children[
                        0].children[i * 2 + 1]
                    root_widget.addChild(self.type_tree(name, child_type))
                return root_widget

        elif root.children[0].data == 'map_type':
            root_widget = QTreeWidgetItem([name, 'map'])
            key = self.type_tree('_key', root.children[0].children[0])
            value = self.type_tree('_value', root.children[0].children[1])
            root_widget.addChildren([key, value])
            return root_widget
        else:
            pass

    def toggle_tunnel(self, pressed):
        if pressed:
            self.tunnelWidget.show()
            self.repaint()
        else:
            self.tunnelWidget.hide()

    def choose_keyfile(self):
        file_name, _ = QFileDialog.getOpenFileName(self, "Choose Key File",
                                                   QDir.homePath() + "/.ssh",
                                                   "All Files (*)")
        if file_name:
            self.tunnel_keyfile = file_name
            self.keyFileButton.setText(file_name.split('/')[-1])

    def clear_tunnel(self):
        self.tunnel_keyfile = None
        self.keyFileButton.setText("Choose Key File...")
        self.serverEdit.clear()
        self.gatewayEdit.clear()
        self.tunnelUserEdit.clear()
        self.pwdLineEdit.clear()

    def close_all(self):
        self.save_settings()
        self.db_engine.close()
        self.tunnel.stop_tunnel()

    def restore_settings(self):
        self.urlEdit.setText(self.settings.value(URL, ""))
        self.userEdit.setText(self.settings.value(USER, ""))
        self.serverEdit.setText(self.settings.value(SERVER, ""))
        self.gatewayEdit.setText(self.settings.value(GATEWAY, ""))
        self.tunnelUserEdit.setText(self.settings.value(TUNNEL_USER, ""))
        self.tunnel_keyfile = self.settings.value(KEYFILE, "")
        if self.tunnel_keyfile:
            self.keyFileButton.setText(self.tunnel_keyfile.split('/')[-1])
        self.pwdLineEdit.setText(self.settings.value(TUNNEL_PWD, ""))
        self.keyComboBox.setCurrentText(self.settings.value(
            KEYTYPE, "KeyFile"))

    def save_settings(self):
        self.settings.setValue(URL, self.urlEdit.text().strip())
        self.settings.setValue(USER, self.userEdit.text().strip())
        self.settings.setValue(SERVER, self.serverEdit.text().strip())
        self.settings.setValue(GATEWAY, self.gatewayEdit.text().strip())
        self.settings.setValue(TUNNEL_USER, self.tunnelUserEdit.text().strip())
        self.settings.setValue(KEYFILE, self.tunnel_keyfile)
        self.settings.setValue(KEYTYPE, self.keyComboBox.currentText())
        self.settings.setValue(TUNNEL_PWD, self.pwdLineEdit.text())
        self.settings.sync()

    def show_error(self, error):
        QMessageBox.critical(self, "Error", error)

    def show_msg(self, msg):
        self.statusbar.showMessage(msg)

    def set_key_type(self, key_type):
        if key_type == 'KeyFile':
            self.pwdLineEdit.hide()
            self.keyFileButton.show()
        else:
            self.keyFileButton.hide()
            self.pwdLineEdit.show()
예제 #7
0
class E(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.resize(1920, 900)  # set initial size of the window
        self.center()  # center the window
        # self.setStyleSheet("background-color: white;")

        self.setStyleSheet("background-color: rgb(240, 240, 240)")
        self.menubar = QMenuBar()
        self.menubar.setFont((QFont("Ariel", 10)))
        self.menubar.setStyleSheet("""
            QMenuBar {
                background: #0b794b
            }
            QMenuBar::item {
                color: rgb(255,255,255);
                font-size: 36px
            }
            QMenuBar::item:selected { 
                color: rgb(0, 0, 0);
                background-color: #519f7f
            }
            QMenu {
                background: #519f7f
            }

            """)
        #actionFile = self.menubar.addMenu("File")
        #actionFile.addAction("New")
        #actionFile.addAction("Open")
        #actionFile.addAction("Save")

        #self.menubar.addAction("Switch Profile")

        openFile = QAction("Open Externally", self)
        self.menubar.addAction(openFile)
        openFile.triggered.connect(self.onClickOpenNotepad)

        #action1 = QtWidgets.QWidgetAction(self)
        #self.label1 = QtWidgets.QLabel("Action1")
        #action1.setDefaultWidget(self.label1)
        #action1.setText('Action1')
        #self.menubar.addAction(action1)

        # menubar.setStyleSheet("QMenuBar::item {background: rgb(170,200,200)}")

        self.setWindowTitle(
            'Profile Editing Application- Currently Editing: ' +
            profileNewest)  # set the title of the window

        self.creatingTable(
        )  # create the table that will store the property data
        l1 = QLabel()

        l1.setText(
            "This is an application to edit the properties of Bioschemas profiles. <br><br><font color='green'>Green</font> properties/types are "
            "proposed by Bioschemas, or indicate proposed changes by Bioschemas to Schema.org <br><font color='red'>Red</font> properties/"
            "types exist in the core of Schema.org <br><font color='blue'>Blue</font> properties/types exist in the pending area of Schema.org"
            "<br>Black properties/types are reused from external vocabularies/ontologies"
        )
        l1.setFont((QFont("Ariel", 10)))
        # l1.setStyleSheet("background-color: rgb(220, 220, 220)")
        createNewProperty = QPushButton("Create New Property")
        createNewProperty.setStyleSheet("font: bold;")
        createNewProperty.clicked.connect(self.clickNewPropertyButton)
        createNewProperty.setMaximumWidth(300)

        showAllExamples = QPushButton("Show All Examples")
        showAllExamples.setStyleSheet("font: bold;")
        showAllExamples.clicked.connect(self.clickShowAllExamples)
        showAllExamples.setMaximumWidth(300)

        self.searchbar = QLineEdit()
        self.searchbar.setPlaceholderText("Search Properties")
        self.searchbar.setMaximumWidth(300)
        self.searchbar.textChanged.connect(self.update_display)
        self.searchbar.setStyleSheet(
            "background-color: white; border: 1px solid black")
        self.searchbar.setToolTip(
            "This will let you search through the loaded properties.")

        self.layout = QVBoxLayout(
        )  # this sets the layout to be aligned vertically
        l2 = QVBoxLayout()
        l2.setContentsMargins(10, 0, 0, 0)
        self.layout.addWidget(self.menubar)
        l2.addWidget(l1)
        l2.addWidget(createNewProperty)
        l2.addWidget(showAllExamples)
        l2.addWidget(self.searchbar)
        self.layout.addLayout(l2)
        self.layout.addWidget(
            self.tableWidget)  # add the widgets to the layout
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.setLayout(self.layout)

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def creatingTable(self):
        self.tableWidget = QTableWidget()

        #print("hiawdawde")
        data = importYaml(
        )  # get the initial data from the file and set it to a variable

        b = data['mapping'][0]
        rowNames = []
        for elim in b:
            rowNames.append(elim)
        # print(rowNames)
        h = len(
            data['mapping']) + 4  # this is used to set the height and width of
        # the table to the amount of entries in the file, adjusted for the marginality
        w = len(rowNames)

        self.tableWidget.setRowCount(h)
        self.tableWidget.setColumnCount(w)
        self.tableWidget.setHorizontalHeaderLabels(rowNames)
        for c in range(w):
            self.tableWidget.setColumnWidth(c, 150)
            if c == 0 or c == 1 or c == 8:
                self.tableWidget.setColumnWidth(c, 300)
            if c == 2:
                self.tableWidget.setColumnWidth(c, 500)

        liRec.append([
            "Marginality: Recommended", "", "", "", "", "", "", "", "", "", ""
        ])
        liMin.append(
            ["Marginality: Minimum", "", "", "", "", "", "", "", "", "", ""])
        liOpt.append(
            ["Marginality: Optional", "", "", "", "", "", "", "", "", "", ""])
        liUns.append([
            "Marginality: Unspecified", "", "", "", "", "", "", "", "", "", ""
        ])

        for rows in range(len(data['mapping'])):
            res = findYamlValue(data, rows, rowNames)
            sorter(res)

        liTot = liMin + liRec + liOpt + liUns

        if len(liRec) == 1:
            for c in range(len(liTot)):
                if liTot[c][0] == "Marginality: Recommended":
                    self.tableWidget.hideRow(c)

        font = QFont()
        font.setBold(True)
        font.setPointSize(10)

        fon = "Schema: \n"
        # fon.setFont(font)
        for c in range(len(liTot)):
            exampleList.append(liTot[c][9])
            if liTot[c][0] != "Marginality: Recommended":
                if liTot[c][0] != "Marginality: Minimum":
                    if liTot[c][0] != "Marginality: Optional":
                        if liTot[c][0] != "Marginality: Unspecified":
                            liTot[c][2] = "<b>Schema:</b> <br>" + liTot[c][2]
                            if liTot[c][5] != "":
                                liTot[c][2] = liTot[c][
                                    2] + "<br><br><b>Bioschemas:</b><br>" + liTot[
                                        c][5]

        URL = 'https://schema.org/docs/full.html'
        page = requests.get(URL)
        final = []
        soup = BeautifulSoup(page.content, 'html.parser')
        results = soup.find(id='mainContent')
        q = results.find_all('a')
        for elim in q:
            stringSchema = str(elim)
            frontCheck = stringSchema.split('href="/')
            for g in frontCheck:
                i = g.split('"')[0]
                if i != "<td class=":
                    final.append(i)

        final = list(dict.fromkeys(final))

        for c in range(len(liTot)):
            x = liTot[c][1]
            t = ""
            for s in x:
                if s == ",":
                    t = t + "\n"
                elif s != "[":
                    if s != "]":
                        if s != "'":
                            if s != " ":
                                t = t + s
            # liTot[c][1] = t  # i know this is really ugly, but the input is a string that looks like a list, so
            # had to cut off all the extra bits
            expectedList = t.split('\n')
            colouredList = ""
            for elLength in range(len(expectedList)):
                for schemaList in range(len(final)):
                    if expectedList[elLength] == final[schemaList]:
                        expectedList[
                            elLength] = "<a href=\"https://schema.org/" + expectedList[
                                elLength] + "\" style=\"color:red\">" + expectedList[
                                    elLength] + "<br></a>"

                if liTot[c][0] != "Marginality: Recommended":
                    if liTot[c][0] != "Marginality: Minimum":
                        if liTot[c][0] != "Marginality: Optional":
                            if liTot[c][0] != "Marginality: Unspecified":
                                if "color:red" not in expectedList[elLength]:
                                    expectedList[
                                        elLength] = "<a href=\"https://bioschemas.org/" + expectedList[
                                            elLength] + "\" style=\"color:green\">" + expectedList[
                                                elLength] + "<br></a>"

                colouredList = colouredList + expectedList[elLength]
            liTot[c][1] = colouredList

        for rows in range(len(liTot)):
            for x in range(w):
                self.tableWidget.setItem(rows, x,
                                         QTableWidgetItem(liTot[rows][x]))

        profileName = data['name']
        for rows in range(len(liTot)):
            for x in range(w - 1):
                textEdit = QTextBrowser()
                textEdit.setFont(QFont("Ariel", 9))
                textEdit.setStyleSheet(
                    "background-color: white; border: white")
                textEdit.setText(str(liTot[rows][x]))
                textEdit.setOpenExternalLinks(True)

                if str(liTot[rows][0]) != "Marginality: Minimum" and str(liTot[rows][0]) != "Marginality: Recommended" \
                        and str(liTot[rows][0]) != "Marginality: Optional" and str(
                    liTot[rows][0]) != "Marginality: Unspecified":
                    if x == 0:
                        textEdit.setStyleSheet(
                            "background-color: rgb(180, 180, 180); border: 2px solid white;"
                        )
                        if str(liTot[rows][3]) == "bioschemas":
                            textEdit.setText(
                                "<a href=\"https://bioschemas.org/profiles/" +
                                str(profileName) +
                                "\" style=\"color:green\"><b>" +
                                str(liTot[rows][x]) + "</b></a>")
                        if str(liTot[rows][3]) == "":
                            textEdit.setText("<a href=\"https://schema.org/" +
                                             str(liTot[rows][x]) +
                                             "\" style=\"color:red\"><b>" +
                                             str(liTot[rows][x]) + "</b></a>")

                else:
                    textEdit.setText("<b>" + str(liTot[rows][x]) + "</b>")

                self.tableWidget.setCellWidget(rows, x, textEdit)

                if str(liTot[rows][0]) == "Marginality: Minimum" or str(liTot[rows][0]) == "Marginality: Recommended" \
                        or str(liTot[rows][0]) == "Marginality: Optional" or str(
                    liTot[rows][0]) == "Marginality: Unspecified":
                    textEdit.setStyleSheet(
                        "background-color: rgb(180, 180, 180); border: none")

        for i in range(h):
            self.tableWidget.item(i, 0).setFont(font)
        self.tableWidget.setShowGrid(False)
        self.tableWidget.setFocusPolicy(QtCore.Qt.NoFocus)

        self.tableWidget.setWordWrap(True)
        self.tableWidget.setFont(QFont("Ariel", 9))
        self.tableWidget.insertColumn(w)
        for col in range(h):
            self.tableWidget.setItem(col, w, QTableWidgetItem(
                ""))  # all columns have to have some value to be coloured
            self.tableWidget.item(col,
                                  w).setBackground(QtGui.QColor(180, 180, 180))

        rowNames.append("Edit Property")
        self.tableWidget.setHorizontalHeaderLabels(rowNames)
        for x in range(len(liTot)):
            if liTot[x][0] != "Marginality: Recommended":
                if liTot[x][0] != "Marginality: Minimum":
                    if liTot[x][0] != "Marginality: Optional":
                        if liTot[x][0] != "Marginality: Unspecified":
                            eachButton = self.tableButton()
                            eachButton.setGeometry(200, 150, 100, 40)
                            eachButton.setIcon(QIcon('edit_button.png'))
                            eachButton.setIconSize(QSize(60, 60))
                            eachButton.setStyleSheet(
                                'QPushButton {background-color: #FFFFFF; border:  none}'
                            )

                            self.tableWidget.setCellWidget(x, w, eachButton)
                            buttonList.append(eachButton)
                            eachButton.clicked.connect(self.click)

        for x in range(len(liTot)):
            if liTot[x][0] != "Marginality: Recommended":
                if liTot[x][0] != "Marginality: Minimum":
                    if liTot[x][0] != "Marginality: Optional":
                        if liTot[x][0] != "Marginality: Unspecified":
                            eachExampleButton = self.tableExampleButton()
                            # eachExampleButton.setGeometry(200, 150, 100, 40)
                            eachExampleButton.setIcon(
                                QIcon('example_icon.png'))
                            eachExampleButton.setIconSize(QSize(60, 60))
                            eachExampleButton.setStyleSheet(
                                'QPushButton {background-color: #FFFFFF; border:  none}'
                            )

                            self.tableWidget.setCellWidget(
                                x, w - 1, eachExampleButton)
                            buttonList2.append(eachExampleButton)
                            eachExampleButton.clicked.connect(
                                self.clickExample)
        self.show()

        for c in range(h):
            self.tableWidget.setRowHeight(c, 250)
            self.tableWidget.item(c,
                                  0).setBackground(QtGui.QColor(200, 200, 200))

            if liTot[c][3] == "":
                self.tableWidget.item(c,
                                      0).setForeground(QtGui.QColor(100, 0, 0))
            elif liTot[c][3] == "bioschemas":
                self.tableWidget.item(c,
                                      0).setForeground(QtGui.QColor(0, 100, 0))
            else:
                self.tableWidget.item(c,
                                      0).setForeground(QtGui.QColor(0, 0, 100))

            if liTot[c][0] == "Marginality: Recommended" or liTot[c][
                    0] == "Marginality: Minimum" or liTot[c][
                        0] == "Marginality: Optional" or liTot[c][
                            0] == "Marginality: Unspecified":
                self.tableWidget.setRowHeight(c, 50)
                self.tableWidget.item(c,
                                      0).setForeground(QtGui.QColor(0, 0, 0))
                for s in range(w):
                    self.tableWidget.item(c, s).setBackground(
                        QtGui.QColor(180, 180, 180))

        self.tableWidget.hideColumn(3)
        self.tableWidget.hideColumn(4)
        self.tableWidget.hideColumn(5)
        if w == 10:
            self.tableWidget.hideColumn(6)
        else:
            self.tableWidget.hideColumn(
                7)  # to deal with when there are 10/11 columns

        # self.tableWidget.setStyleSheet('QTableWidget::item {border-bottom: 1px solid blue;}')
        self.tableWidget.setVerticalScrollMode(
            QAbstractItemView.ScrollPerPixel)
        self.tableWidget.verticalScrollBar().setSingleStep(20)
        self.tableWidget.setStyleSheet(
            "::section{Background-color:rgb(160,160,160);border-radius:1px;}")
        self.tableWidget.verticalScrollBar().setStyleSheet(
            'background:rgb(160,160,160)')
        self.tableWidget.horizontalScrollBar().setStyleSheet(
            'background:rgb(160,160,160)')
        self.tableWidget.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers)
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        self.tableWidget.horizontalHeader().setFont(font)

        self.tableWidget.horizontalHeaderItem(0).setToolTip(
            "This column is for listing the property name.")
        self.tableWidget.horizontalHeaderItem(1).setToolTip(
            "This column is for listing expected type of the property.")
        self.tableWidget.horizontalHeaderItem(2).setToolTip(
            "This column is for the description, as well as\nthe bioschemas description of the property."
        )
        self.tableWidget.horizontalHeaderItem(7).setToolTip(
            "This column is for listing the cardinality of the property.")
        self.tableWidget.horizontalHeaderItem(8).setToolTip(
            "This column is for listing the controlled vocabulary.")
        self.tableWidget.horizontalHeaderItem(9).setToolTip(
            "This column is for listing the examples of the property.")
        self.tableWidget.horizontalHeaderItem(10).setToolTip(
            "This column is for the edit buttons.")

        self.tableWidget.verticalHeader().hide()

        for c in range(h):
            if len(liMin) == 1:
                if self.tableWidget.item(c,
                                         0).text() == "Marginality: Minimum":
                    self.tableWidget.hideRow(c)
            if len(liRec) == 1:
                if self.tableWidget.item(
                        c, 0).text() == "Marginality: Recommended":
                    self.tableWidget.hideRow(c)
            if len(liOpt) == 1:
                if self.tableWidget.item(c,
                                         0).text() == "Marginality: Optional":
                    self.tableWidget.hideRow(c)
            if len(liUns) == 1:
                if self.tableWidget.item(
                        c, 0).text() == "Marginality: Unspecified":
                    self.tableWidget.hideRow(c)

            # if str(self.tableWidget.item(c, 0).background().color().getRgb()) == "(180, 180, 180, 255)":
            # print("yancy")

    def tableButton(self):
        btn = QPushButton("")
        return btn

    def tableExampleButton(self):
        btn = QPushButton("")
        return btn

    def click(self):
        btn = self.tableWidget.focusWidget()
        index = self.tableWidget.indexAt(btn.pos())
        global btnIndex
        btnIndex = index.row()
        self.d = Second()
        self.d.show()

    def clickExample(self):
        btn2 = self.tableWidget.focusWidget()
        index2 = self.tableWidget.indexAt(btn2.pos())
        global btnIndex2
        btnIndex2 = index2.row()
        self.sw = ExampleButtons()
        self.sw.show()

    def clickNewPropertyButton(self):
        global btnIndex
        btnIndex = 0
        self.d = Second()
        self.d.show()

    def clickShowAllExamples(self):
        global btnIndex2
        btnIndex2 = 0
        self.full = ExampleButtons()
        self.full.show()

    def onClickOpenNotepad(self):
        global profileNewest
        p = profileNewest
        #print(p)
        subprocess.call([
            'notepad.exe',
            'BioschemasGitClone/bioschemas.github.io/_profiles/' + p
        ])

    def update_display(self, text):
        data = importYaml(
        )  # get the initial data from the file and set it to a variable
        b = data['mapping'][0]
        h = len(data['mapping']) + 4
        x = self.tableWidget.item(1, 0).text()
        for row in range(h):
            if text.lower() in self.tableWidget.item(row, 0).text().lower() or self.tableWidget.item(row, 0).text() == \
                    "Marginality: Recommended" or self.tableWidget.item(row, 0).text() == "Marginality: Minimum" \
                    or self.tableWidget.item(row, 0).text() == "Marginality: Optional" or \
                    self.tableWidget.item(row, 0).text() == "Marginality: Unspecified":

                self.tableWidget.showRow(row)
            else:
                self.tableWidget.hideRow(row)

    def passed(self):
        return btnIndex

    def closeEvent(self, event):
        global startingHighest
        #print(startingHighest)
        c = startingHighest

        global profileNewest
        f = profileNewest
        location = f.split("/", 1)
        profile = location[0]
        p = os.listdir('BioschemasGitClone/bioschemas.github.io/_profiles/' +
                       profile)
        #print(p)

        h = 0
        newest = ""
        allVersionList = []
        for elim in p:
            m = elim.split("-", 1)
            x = str(m[0])
            x = x[2:]
            x = int(x)
            allVersionList.append(x)
            if x > h:
                h = x
                newest = elim

        lenDirectory = h
        #print(lenDirectory)
        x = natsorted(
            p
        )  # little function i found that will sort the list in a natural way, similar to windows file explorer
        #print(x)
        t = sorted(allVersionList)
        #print(t)
        #print("000")
        #print("oahwdh8o" + str(startingHighest))
        index = t.index(int(startingHighest))
        #print(index)
        count = 0
        for i in range(len(t)):
            #print("c=" + str(count))
            if i > index:
                #print("i= " + str(i))
                #print("nlent" + str(len(t)))
                if i != len(t) - 1:
                    #print(("llllll " + str(len(allVersionList))))
                    os.remove(
                        'BioschemasGitClone/bioschemas.github.io/_profiles/' +
                        profile + '/' + x[i])
            count = count + 1

        currentVersion = startingHighest + 1

        today = date.today()
        dateToday = today.strftime("%Y_%m_%d")

        p = os.listdir('BioschemasGitClone/bioschemas.github.io/_profiles/' +
                       profile)  # get the new length of the directory
        fileToRename = '/0.' + str(
            currentVersion) + '-DRAFT-' + dateToday + '.html'
        # print("\n" + p[-1])
        if t[-1] != startingHighest:
            os.rename(
                'BioschemasGitClone/bioschemas.github.io/_profiles/' +
                profile + '/' + x[-1],
                'BioschemasGitClone/bioschemas.github.io/_profiles/' +
                profile + '/' + fileToRename)
    def initUI(self):
        #控件
        infoLabel = QLabel(self)
        infoLabel.setAlignment(Qt.AlignCenter)
        infoLabel.setFont(QFont("微软雅黑", 20))
        infoLabel.setText("学生信息管理系统")

        nameLabel = QLabel(self)
        nameLabel.setAlignment(Qt.AlignCenter)
        nameLabel.setFont(QFont("微软雅黑", 10))
        nameLabel.setText("学生姓名")

        numLabel = QLabel(self)
        numLabel.setAlignment(Qt.AlignCenter)
        numLabel.setFont(QFont("微软雅黑", 10))
        numLabel.setText("学生学号")

        self.nameLineEdit = QLineEdit(self)

        self.numLineEdit = QLineEdit(self)

        self.stuInfoList = QTableWidget(self)
        #选中项目编辑动作为不编辑
        self.stuInfoList.setEditTriggers(self.stuInfoList.NoEditTriggers)
        #取消掉每次新增条目的序号id显示
        self.stuInfoList.verticalHeader().setHidden(True)
        self.stuInfoList.setColumnCount(4)
        self.stuInfoList.setHorizontalHeaderLabels(["姓名", "年龄", "学号", "专业"])
        #选中条目的动作为选中那一行
        self.stuInfoList.setSelectionBehavior(QAbstractItemView.SelectRows)
        #将每个条目扩展到充满容器
        self.stuInfoList.horizontalHeader().setStretchLastSection(True)
        #将容器宽度平均分给所有条目
        self.stuInfoList.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)

        queryButton = QPushButton(self)
        queryButton.setText("查询")
        queryButton.setDefault(True)
        queryButton.clicked.connect(self.queryButtonClicked)

        #菜单
        menuBar = QMenuBar(self)
        menuBar.setStyleSheet("QMenuBar{background-color:rgb(240,240,240)}")

        menu = QMenu(menuBar)
        menu.setTitle("菜单")
        menuBar.addMenu(menu)

        enterAction = QAction(menu)
        enterAction.setText("导入")
        enterAction.triggered.connect(self.enterActionTriggered)
        menu.addAction(enterAction)

        delAction = QAction(menu)
        delAction.setText("删除")
        delAction.triggered.connect(self.delActionTriggered)
        menu.addAction(delAction)

        quitAction = QAction(menu)
        quitAction.setText("退出")
        quitAction.triggered.connect(self.close)
        menu.addAction(quitAction)

        helpAction = QAction(menuBar)
        helpAction.setText("帮助")
        helpAction.triggered.connect(self.helpActionTriggered)
        menuBar.addAction(helpAction)

        #布局
        layout = QGridLayout(self)
        layout.addWidget(infoLabel, 0, 0, 1, 10)
        layout.addWidget(nameLabel, 1, 0, 1, 6)
        layout.addWidget(self.nameLineEdit, 1, 6, 1, 3)
        layout.addWidget(numLabel, 2, 0, 1, 6)
        layout.addWidget(self.numLineEdit, 2, 6, 1, 3)
        layout.addWidget(self.stuInfoList, 3, 0, 5, -1)
        layout.addWidget(queryButton, 8, 9, 1, 1)
        layout.setMenuBar(menuBar)
예제 #9
0
class ViewSourceDialog(QMainWindow):
    closed = pyqtSignal(QObject)
    def __init__(self, parent=None, title="Source"):
        super(ViewSourceDialog, self).__init__()
        self.setParent(parent)
        self.menuBar = QMenuBar(self)
        self.menuBar.setStyleSheet("""QMenuBar { background: transparent; border: 0; }
                                      QMenuBar::item { background: transparent;
                                                       color: palette(window-text); }
                                      QMenuBar::item:pressed { background: palette(highlight);
                                                               color: palette(highlighted-text); }""")
        self.setMenuBar(self.menuBar)

        self.text = ""
        self.findFlag = None

        self.fileMenu = QMenu(tr("&File"), self.menuBar)
        self.menuBar.addMenu(self.fileMenu)

        self.saveAsAction = QAction(tr("&Save As..."), self)
        self.saveAsAction.setShortcut("Ctrl+S")
        self.saveAsAction.triggered.connect(self.saveAs)
        self.addAction(self.saveAsAction)
        self.fileMenu.addAction(self.saveAsAction)

        self.viewMenu = QMenu(tr("&View"), self.menuBar)
        self.menuBar.addMenu(self.viewMenu)

        self.findAction = QAction(tr("&Find..."), self)
        self.findAction.setShortcut("Ctrl+F")
        self.findAction.triggered.connect(self.find)
        self.addAction(self.findAction)
        self.viewMenu.addAction(self.findAction)

        self.findNextAction = QAction(tr("Find Ne&xt"), self)
        self.findNextAction.setShortcut("Ctrl+G")
        self.findNextAction.triggered.connect(self.findNext)
        self.addAction(self.findNextAction)
        self.viewMenu.addAction(self.findNextAction)

        self.findPreviousAction = QAction(tr("Find Pre&vious"), self)
        self.findPreviousAction.setShortcut("Ctrl+Shift+G")
        self.findPreviousAction.triggered.connect(self.findPrevious)
        self.addAction(self.findPreviousAction)
        self.viewMenu.addAction(self.findPreviousAction)

        self.sourceView = SourceView(self)
        self.sourceView.setReadOnly(True)
        self.sourceView.setFontFamily("monospace")
        self.setCentralWidget(self.sourceView)
        closeWindowAction = QAction(self)
        closeWindowAction.setShortcut("Ctrl+W")
        closeWindowAction.triggered.connect(self.close)
        self.addAction(closeWindowAction)
        self.setWindowTitle(title)

        self.resize(640, 480)

    def closeEvent(self, ev):
        super(ViewSourceDialog, self).closeEvent(ev)
        self.deleteLater()

    def saveAs(self):
        fname = QFileDialog.getSaveFileName(None, tr("Save As..."), self.windowTitle() + ".txt", tr("Text files (*.txt)"))
        if type(fname) is tuple:
            fname = fname[0]
        if fname:
            g = str(self.sourceView.toPlainText())
            f = open(fname, "w")
            f.write(g)
            f.close()

    def find(self):
        find = QInputDialog.getText(self, tr("Find"), tr("Search for:"), QLineEdit.Normal, self.text)
        if find[1]:
            self.text = find[0]
        else:
            self.text = ""
        if self.findFlag:
            self.sourceView.find(self.text, self.findFlag)
        else:
            self.sourceView.find(self.text)

    def findNext(self, findFlag=None):
        if not self.text:
            self.find()
        else:
            self.findFlag = findFlag
            if self.findFlag:
                self.sourceView.find(self.text, self.findFlag)
            else:
                self.sourceView.find(self.text)

    def findPrevious(self):
        self.findNext(QTextDocument.FindBackward)

    def setFindFlag(self):
        if self.findReverseAction.isChecked():
            self.findFlag = QTextDocument.FindBackward
        else:
            self.findFlag = None

    def setPlainText(self, *args, **kwargs):
        self.sourceView.setPlainText(*args, **kwargs)

    def doNothing(self):
        pass

    def closeEvent(self, ev):
        self.closed.emit(self)
        self.deleteLater()
        ev.accept()
class Ui_MainWindow(QMainWindow):
    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.setFixedSize(1024, 768)
        MainWindow.setWindowTitle('Справочник')
        MainWindow.setWindowIcon(QIcon('img.png'))

        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setStyleSheet("border-image:url(prog.jpg);")
        MainWindow.setCentralWidget(self.centralwidget)
        self.page1()

        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName("menubar")
        tools = self.menubar.addMenu('Поиск по списку')
        tools.addAction("Операторы Turbo Pascal", self.page1)
        tools.addSeparator()
        tools.addAction("1.Присваивание переменной значение выражения",
                        self.page2)
        tools.addSeparator()
        tools.addAction("2.Begin___End", self.page3)
        tools.addSeparator()
        tools.addAction("3.Case___Of___Else___End", self.page4)
        tools.addSeparator()
        tools.addAction("4.For___To, Downto___Do", self.page5)
        tools.addSeparator()
        tools.addAction("5.Goto", self.page6)
        tools.addSeparator()
        tools.addAction("6.If___Then___Else", self.page7)
        tools.addSeparator()
        tools.addAction("7.Вызов процедуры", self.page8)
        tools.addSeparator()
        tools.addAction("8.Repeat___Until", self.page9)
        tools.addSeparator()
        tools.addAction("9.While___Do", self.page10)
        tools.addSeparator()
        tools.addAction("10.With___Do", self.page11)
        tools.addSeparator()
        tools.addAction("11.Inline", self.page12)
        tools.addSeparator()
        tools.addAction("12.Бинарные арифметические операторы", self.page13)
        tools.addSeparator()
        tools.addAction("13.Унарные арифметические операторы", self.page14)
        tools.addSeparator()
        tools.addAction("14.Булевы операторы", self.page15)
        tools.addSeparator()
        tools.addAction("15.Логические операторы", self.page16)
        tools.addSeparator()
        tools.addAction("16.PChar операторы", self.page17)
        tools.addSeparator()
        tools.addAction("17.Операторы сравнения", self.page18)
        tools.addSeparator()
        tools.addAction("18.Операторы множеств", self.page19)
        tools.addSeparator()
        tools.addAction("19.Строковые операторы", self.page20)
        tools.addSeparator()
        tools.addAction("20.Оператор '@'", self.page21)
        tools.triggered.connect(self.list.deleteLater)
        tools.triggered.connect(self.nextButton.deleteLater)
        tools.triggered.connect(self.backButton.deleteLater)

        self.menubar.setStyleSheet("""
                                      background-color: rgb(255, 215, 0);
                                      font: bold;
                                      font-family: Times New Roman;
                                      color: rgb(0, 0, 255);
                                      font-size: 19px;
                                      selection-background-color: white;    
                                      """)
        self.menubar.setGeometry(0, 0, 1024, 30)

    def pageparent(self):

        self.list = QTextBrowser(MainWindow)
        self.list.setStyleSheet("""
                                                      font: bold;
                                                      font-family: Times New Roman;
                                                      color: rgb(0, 0, 255);
                                                      background: rgb(255, 215, 0);
                                                      font-size: 20px;                                                                                                                                                                     
                            """)
        self.list.setGeometry(100, 70, 850, 500)
        self.list.show()

        self.nextButton = QPushButton(MainWindow)
        self.nextButton.setGeometry(QRect(600, 600, 221, 61))
        self.nextButton.setObjectName("nextButton")
        self.nextButton.setText("Вперед")
        self.nextButton.setStyleSheet("""
                                                  font: bold;
                                                  font-family: Times New Roman;
                                                  color: rgb(0, 0, 255);
                                                  background: rgb(255, 215, 0);
                                                  font-size: 27px;                                                                                                                                                                     
                        """)

        self.nextButton.show()

        self.backButton = QPushButton(MainWindow)
        self.backButton.setGeometry(QRect(200, 600, 221, 61))
        self.backButton.setObjectName("backButton")
        self.backButton.setText("Назад")
        self.backButton.setStyleSheet("""
                                                         font: bold;
                                                         font-family: Times New Roman;
                                                         color: rgb(0, 0, 255);
                                                         background: rgb(255, 215, 0);
                                                         font-size: 27px;""")
        self.backButton.show()

        self.nextButton.clicked.connect(self.list.deleteLater)
        self.nextButton.clicked.connect(self.nextButton.deleteLater)
        self.nextButton.clicked.connect(self.backButton.deleteLater)
        self.backButton.clicked.connect(self.list.deleteLater)
        self.backButton.clicked.connect(self.nextButton.deleteLater)
        self.backButton.clicked.connect(self.backButton.deleteLater)

    def page1(self):

        self.pageparent()

        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[1:17]:
                text += line + '\n'
        self.list.setPlainText(text)

        self.nextButton.clicked.connect(self.page2)
        self.backButton.clicked.connect(self.page21)

    def page2(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[18:27]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page3)
        self.backButton.clicked.connect(self.page1)

    def page3(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[28:47]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page4)
        self.backButton.clicked.connect(self.page2)

    def page4(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[48:74]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page5)
        self.backButton.clicked.connect(self.page3)

    def page5(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[75:98]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page6)
        self.backButton.clicked.connect(self.page4)

    def page6(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[99:114]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page7)
        self.backButton.clicked.connect(self.page5)

    def page7(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[115:138]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page8)
        self.backButton.clicked.connect(self.page6)

    def page8(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[139:164]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page9)
        self.backButton.clicked.connect(self.page7)

    def page9(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[165:186]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page10)
        self.backButton.clicked.connect(self.page8)

    def page10(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[187:204]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page11)
        self.backButton.clicked.connect(self.page9)

    def page11(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[205:224]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page12)
        self.backButton.clicked.connect(self.page10)

    def page12(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[225:249]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page13)
        self.backButton.clicked.connect(self.page11)

    def page13(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[250:262]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page14)
        self.backButton.clicked.connect(self.page12)

    def page14(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[263:276]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page15)
        self.backButton.clicked.connect(self.page13)

    def page15(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[277:287]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page16)
        self.backButton.clicked.connect(self.page14)

    def page16(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[288:301]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page17)
        self.backButton.clicked.connect(self.page15)

    def page17(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[302:314]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page18)
        self.backButton.clicked.connect(self.page16)

    def page18(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[315:334]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page19)
        self.backButton.clicked.connect(self.page17)

    def page19(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[335:347]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page20)
        self.backButton.clicked.connect(self.page18)

    def page20(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[348:354]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page21)
        self.backButton.clicked.connect(self.page19)

    def page21(self):

        self.pageparent()
        with open('text.txt') as file:
            lines = file.readlines()
            text = ""
            for line in lines[355:365]:
                text += line + '\n'
        self.list.setPlainText(text)
        self.nextButton.clicked.connect(self.page1)
        self.backButton.clicked.connect(self.page20)
예제 #11
0
class window2(QMainWindow):
   def __init__(self):
      super().__init__()
      self.model= model_detection()
      #self.predict_video=SSD_estimation_video()
      self.display_width=300
      self.display_height=300
      stylesheet="QPushButton{background-color: rgb(200,200,200);border: 1px solid gray;color: black;padding: 15px 32px;text-align: center;text-decoration: none;font-size: 16px;font-weight: bold;border-radius: 12px;}""QPushButton:pressed { background-color: (200,200,200) }"
      
      self.widget = QWidget()
      self.widget.setStyleSheet("background-color: rgb(250,250,250)")#rgb(195,134,134)pink;border-style: outset;border-width: 2px;border-radius: 10px;border-color: beige;font: bold 14px;min-width: 10em;padding: 6px;
      self.widget.setGeometry(100,100,680,480)#rgb(150,150,150)
      self.setWindowTitle("système D&E")
      self.setFixedSize(680, 480) 
      grid_layout = QGridLayout()
      
      vbox1 = QVBoxLayout()
      vbox2 = QVBoxLayout()
      vbox3 = QVBoxLayout()
      hbox=QHBoxLayout()
      ImgAct = QAction('&Importer Image', self)
      ImgAct.setShortcut('Ctrl+F')
      ImgAct.setStatusTip('Importer Image')
      ImgAct.triggered.connect(self.image)
      VidAct = QAction('&Importer une video', self)
      VidAct.setShortcut('Ctrl+U')
      VidAct.setStatusTip('Importer une video')
      VidAct.triggered.connect(self.video_up)
      LivAct = QAction('&Video en direct', self)
      LivAct.setShortcut('Ctrl+E')
      LivAct.setStatusTip('Video en direct')
      LivAct.triggered.connect(self.video_live)
      exitAct = QAction('&Quitter', self)
      exitAct.setShortcut('Ctrl+Q')
      exitAct.setStatusTip('Quitter')
      exitAct.triggered.connect(QCoreApplication.instance().quit)

      self.menubar = QMenuBar()
      self.menubar.setStyleSheet("background-color: rgb(250,250,250)")
      actionFile = self.menubar.addMenu("fichier")
      actionFile.addAction(ImgAct)
      actionFile.addAction(VidAct)
      actionFile.addAction(LivAct)
      actionFile.addAction(exitAct)
      #actionFile.addSeparator()
      #self.menubar.addMenu(exitAct)
      
      button1 = QPushButton(self.widget)
      button1.setText("Importer une image")
      button1.clicked.connect(self.image)
      button1.setStyleSheet(stylesheet)
      button1.setFixedWidth(250)
      button2 = QPushButton(self.widget)
      button2.setText("Importer une video")
      
      button2.clicked.connect(self.video_up)
      button2.setStyleSheet(stylesheet)
      button2.setFixedWidth(250)
      button3 = QPushButton(self.widget)
      button3.setText("Video en direct")
      
      button3.clicked.connect(self.video_live)
      button3.setStyleSheet(stylesheet)
      button3.setFixedWidth(250)
      button4 = QPushButton(self.widget)
      button4.setText("Quitter")
      
      button4.clicked.connect(QCoreApplication.instance().quit)
      button4.setStyleSheet(stylesheet)
      button4.setFixedWidth(250)
      
      self.image_label = QLabel(self)
      self.image_label.setStyleSheet("border: 10px solid darkgrey;") 
      self.image_label.setFixedWidth(300)
      self.textLabel = QLabel('Ecran')
       
      self.screen = QPixmap(self.display_width, self.display_height)
      self.screen.fill(QColor('Black'))
      
      
       
      self.image_label.setPixmap(self.screen)
      vbox1.addWidget(self.menubar)
      vbox2.addWidget(self.textLabel)
      vbox2.addWidget(self.image_label)
      vbox3.addWidget(button1)
      vbox3.addWidget(button2)
      vbox3.addWidget(button3)
      vbox3.addWidget(button4)
      grid_layout.addLayout(vbox1,0,0)
      grid_layout.addLayout(vbox2,1,2)
      grid_layout.addLayout(vbox3,1,0)
      
      
      self.widget.setLayout(grid_layout)
      
      self.setCentralWidget(self.widget)
      self.show()
      
      

   def convert_cv_qt(self,cv_img):
      """Convert from an opencv image to QPixmap"""
      rgb_image = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
      h, w, ch = rgb_image.shape
      bytes_per_line = ch * w
      convert_to_Qt_format = QtGui.QImage(rgb_image.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
      p = convert_to_Qt_format.scaled(self.display_width, self.display_height, Qt.KeepAspectRatio)
      return QPixmap.fromImage(p)

   def image(self):
      dialog = QFileDialog()

      options = dialog.Options()
      #options |= dialog.DontUseNativeDialog
      files, dd = dialog.getOpenFileNames(None,"IMAGE", "","JPEG(*.jpg *.jpeg);;PNG(*.png)")
      print(files)
      if(dd):
            prediction_img=SSD_estimation_img(self.model)
            cv_img=prediction_img.prediction_img(files[0])
            qt_img = self.convert_cv_qt(cv_img)
            # display it
            self.image_label.setPixmap(qt_img)
      else:
            pass
   def video_up(self):
      dialog = QFileDialog()

      options = dialog.Options()
      #options |= dialog.DontUseNativeDialog
      files, dd = dialog.getOpenFileNames(None,"VIDEO", "","MP4(*.mp4)")#, options=options
      
      if(dd):
            self.screen.fill(QColor('Black'))
            self.image_label.setPixmap(self.screen)
            predict_vid = SSD_estimation_video(self.model,files[0],'Video')
            predict_vid.run()
      else:
            pass

   def video_live(self):
      #dialog = QFileDialog()
            self.screen.fill(QColor('Black'))
            self.image_label.setPixmap(self.screen)
            predict_live = SSD_estimation_video(self.model,1,'live_webcam')
            predict_live.run()
            if(predict_live.fps==0.0):
                  print("Aucune Camera!!")
예제 #12
0
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 700, 500)
        self.setWindowTitle('Paint')
        self.setWindowIcon(QIcon('data/icon.png'))
        self.setStyleSheet("background-color: #c8d9cb;")
        self.can_resize = False
        self.can_save = False
        self.printt = False

        self.background = Qt.white

        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(self.background)

        self.drawing = False
        self.brushSize = 2
        self.brushColor = Qt.black
        self.LastPoint = QPoint()
        self.act = 1

        self.mewo = QLabel(self)
        self.mewo.resize(700, 70)
        self.mewo.move(0, 0)
        self.mewo.setStyleSheet("background-color: white;")

        self.menubar = QMenuBar(self)
        self.menu_file = self.menubar.addMenu('Файл')
        self.menu_file.addAction('Открыть').triggered.connect(self.open_file)
        self.menu_file.addAction('Создать новый').triggered.connect(
            self.create_new)
        self.menu_file.addAction('Сохранить').triggered.connect(self.save)
        self.menu_view = self.menubar.addAction('Тема')
        self.menu_view.triggered.connect(self.view_f)
        self.menubar.setStyleSheet("background-color: white;")

        self.toolbar = QToolBar(self)
        self.toolbar.move(0, 20)

        self.lb1 = QLabel(self)
        self.lb1.resize(40, 440)
        self.lb1.move(0, 70)
        self.lb1.setStyleSheet("background-color: #c8d9cb;")

        self.lb2 = QLabel(self)
        self.lb2.resize(700, 20)
        self.lb2.move(0, 70)
        self.lb2.setStyleSheet("background-color: #c8d9cb;")

        self.lb3 = QLabel(self)
        self.lb3.resize(40, 440)
        self.lb3.move(660, 70)
        self.lb3.setStyleSheet("background-color: #c8d9cb;")

        self.lb4 = QLabel(self)
        self.lb4.resize(700, 20)
        self.lb4.move(0, 480)
        self.lb4.setStyleSheet("background-color: #c8d9cb;")

        paste = self.toolbar.addAction(QIcon('data/paste.ico'), 'Paste')
        paste.triggered.connect(self.paste)
        rot1 = self.toolbar.addAction(QIcon('data/rotate_right.ico'), 'Rotate')
        rot1.triggered.connect(self.rotate1)
        rot2 = self.toolbar.addAction(QIcon('data/rotate_left.ico'), 'Rotate')
        rot2.triggered.connect(self.rotate2)
        self.toolbar.addSeparator()
        pen = self.toolbar.addAction(QIcon('data/pen.ico'), 'Pen')
        pen.triggered.connect(self.click_act1)
        eraser = self.toolbar.addAction(QIcon('data/eraser.ico'), 'Eraser')
        eraser.triggered.connect(self.click_act2)
        fill = self.toolbar.addAction(QIcon('data/fill.ico'), 'Fill')
        fill.triggered.connect(self.click_act4)
        text = self.toolbar.addAction(QIcon('data/text.ico'), 'Text')
        text.triggered.connect(self.click_act3)
        #self.toolbar.addSeparator()

        self.lbl = QLabel()
        self.lbl.setFixedSize(30, 30)
        self.lbl.setStyleSheet(
            "background-color: black; border-style: solid; border-width: 2px; border-color: black;"
        )
        self.toolbar.addWidget(self.lbl)

        a = self.toolbar.addAction(QIcon('data/color.ico'), 'Select color')
        a.triggered.connect(self.click1)

        self.toolbar.setStyleSheet("background-color: white;")

    def get_cardinal_points(self, have_seen, center_pos):
        points = []
        cx, cy = center_pos
        for self.xn, self.yn in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
            xx, yy = cx + self.xn, cy + self.yn
            if (660 > xx > 40 and 480 > yy > 90 and (xx, yy) not in have_seen):
                print(self.image.pixelColor(xx, yy).name())
                points.append((xx, yy))
                have_seen.add((xx, yy))
        return points

    def keyPressEvent(self, event):
        if self.printt and event.key() != Qt.Key_Shift:
            painter = QPainter(self.image)
            painter.drawText(QRect(self.xn, self.yn, 13, 20), 0, event.text())
            if event.text() in ['щ', 'ш', 'ю', 'ф', 'ы', 'ж', 'м', 'm', 'w']:
                self.xn += 10
            elif event.text() in ['i', 'j', 'l']:
                self.xn += 4
            else:
                self.xn += 7
            if event.text().isupper():
                print(2)
                self.xn += 2
            self.update()

    def mousePressEvent(self, event):
        if self.act == 3:
            self.xn = event.x()
            self.yn = event.y() - 5
            self.printt = True
        elif self.act == 4:
            self.w, self.h = self.image.width(), self.image.height()
            self.xn = event.x()
            self.yn = event.y()
            painter = QPainter(self.image)
            painter.setPen(QPen(self.brushColor))
            have_seen = set()
            queue = [(self.xn, self.yn)]
            while queue:
                x, y = queue.pop()
                painter.drawPoint(QPoint(x, y))
                queue.extend(self.get_cardinal_points(have_seen, (x, y)))

            self.update()

        elif event.button(
        ) == Qt.LeftButton and 660 > event.x() > 40 and 480 > event.y() > 90:
            self.drawing = True
            self.lastPoint = event.pos()

    def mouseMoveEvent(self, event):
        if self.drawing and 660 > event.x() > 40 and 480 > event.y() > 90:
            if self.act == 1:
                painter = QPainter(self.image)
                painter.setPen(
                    QPen(self.brushColor, self.brushSize, Qt.SolidLine,
                         Qt.RoundCap, Qt.RoundJoin))
                painter.drawLine(self.lastPoint, event.pos())
                self.lastPoint = event.pos()
                self.update()
            elif self.act == 2:
                painter = QPainter(self.image)
                painter.setPen(
                    QPen(Qt.white, 15, Qt.SolidLine, Qt.RoundCap,
                         Qt.RoundJoin))
                painter.drawLine(self.lastPoint, event.pos())
                self.lastPoint = event.pos()
                self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

    def paintEvent(self, event):
        canvasPainter = QPainter(self)
        canvasPainter.drawImage(self.rect(), self.image, self.image.rect())

    def click_act1(self):
        self.act = 1

    def click_act2(self):
        self.act = 2

    def click_act3(self):
        self.act = 3

    def click_act4(self):
        self.act = 4

    def paste(self):
        clipboard = QGuiApplication.clipboard()
        mimeData = clipboard.mimeData()
        self.image = mimeData.imageData()
        self.update()

    def rotate1(self):
        my_transform = QTransform()
        my_transform.rotate(90)
        self.image = self.image.transformed(my_transform)
        self.update()

    def rotate2(self):
        my_transform = QTransform()
        my_transform.rotate(-90)
        self.image = self.image.transformed(my_transform)
        self.update()

    def click1(self):
        color = QColorDialog.getColor()
        if color.isValid():
            self.lbl.setStyleSheet(
                f"background-color: {color.name()}; border-style: solid; border-width: 2px; border-color: black;"
            )
            self.brushColor = color.toRgb()

    def save(self):
        filePath, _ = QFileDialog.getSaveFileName(
            self, "Save Image", "",
            "PNG(*.png);;JPEG(*.jpg *.jpeg);;All Files(*.*) ")

        if filePath == "":
            return
        self.image.save(filePath)

    def open_file(self):
        fname = QFileDialog.getOpenFileName(self, 'Выбрать картинку', '')[0]
        self.image.load(fname)

    def create_new(self):
        self.act = 1
        self.brushColor = Qt.black
        self.lbl.setStyleSheet(
            f"background-color: black; border-style: solid; border-width: 2px; border-color: black;"
        )
        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(self.background)
        self.update()

    def save_file(self):
        if self.can_save:
            filename = QFileDialog.getSaveFileName(self, 'Save file', '',
                                                   '*.png;;*.jpg')
            if len(filename[0]) != 0:
                self.pixmap.save(filename[0], filename[1][2:])

    def view_f(self):
        self.id = QInputDialog(self)
        color, ok_pressed = self.id.getItem(
            self, "Смена темы", "Выберите тему",
            ("Классический", "Красный", "Жёлтый"), 0, False)
        if color == "Классический":
            self.setStyleSheet("background-color: #c8d9cb;")
            self.lb1.setStyleSheet("background-color: #c8d9cb;")
            self.lb2.setStyleSheet("background-color: #c8d9cb;")
            self.lb3.setStyleSheet("background-color: #c8d9cb;")
            self.lb4.setStyleSheet("background-color: #c8d9cb;")
        elif color == "Красный":
            self.setStyleSheet("background-color: red;")
            self.lb1.setStyleSheet("background-color: red;")
            self.lb2.setStyleSheet("background-color: red;")
            self.lb3.setStyleSheet("background-color: red;")
            self.lb4.setStyleSheet("background-color: red;")
        elif color == "Жёлтый":
            self.setStyleSheet("background-color: #f6ff42;")
            self.lb1.setStyleSheet("background-color: #f6ff42;")
            self.lb2.setStyleSheet("background-color: #f6ff42;")
            self.lb3.setStyleSheet("background-color: #f6ff42;")
            self.lb4.setStyleSheet("background-color: #f6ff42;")
예제 #13
0
class Ui_MainWindow(object):
    def setupUi(self, windget):
        windget.resize(850, 700)
        self.h1_layout = QHBoxLayout()
        self.h2_layout = QHBoxLayout()
        self.h3_layout = QHBoxLayout()
        self.h4_layout = QHBoxLayout()
        self.h5_layout = QHBoxLayout()
        self.h6_layout = QHBoxLayout()
        self.h7_layout = QHBoxLayout()
        self.h8_layout = QHBoxLayout()
        self.h9_layout = QHBoxLayout()
        self.h10_layout = QHBoxLayout()
        self.h11_layout = QHBoxLayout()
        self.all_v_layout = QVBoxLayout()

        self.statusbar = QtWidgets.QStatusBar()
        self.toolbar = QToolBar()
        self.menubar = QMenuBar()
        self.menubar.setStyleSheet(
            "QMenuBar{background-color: rgb(240, 240, 240)}")
        self.menubar.setFixedSize(870, 22)
        self.menubar.setMaximumSize(9999, 9999)
        self.h4_layout.addWidget(self.menubar)
        self.h5_layout.addWidget(self.toolbar)

        self.file_Menu = self.menubar.addMenu("文件")

        self.file_compare = QAction(QIcon('exit.png'), '&对比')
        self.file_compare.setShortcut('Shift+F10')
        self.file_compare.setStatusTip('对比文件')
        self.file_Menu.addAction(self.file_compare)

        self.file_save = QAction(QIcon('exit.png'), '&保存')
        self.file_save.setShortcut('Ctrl+s')
        self.file_save.setStatusTip('保存备案比对结果')
        self.file_Menu.addAction(self.file_save)

        self.file_open = QAction(QIcon('exit.png'), '&打开')
        self.file_open.setShortcut('')
        self.file_open.setStatusTip('打开备案比对结果')
        self.file_Menu.addAction(self.file_open)

        self.select_Menu = self.menubar.addMenu("选择")

        self.select_backup = QAction(QIcon('exit.png'), '&备案文件')
        self.select_backup.setShortcut('')
        self.select_backup.setStatusTip('选择备案文件')
        self.select_Menu.addAction(self.select_backup)

        self.select_source = QAction(QIcon('exit.png'), '&待对比文件')
        self.select_source.setShortcut('')
        self.select_source.setStatusTip('选择待对比文件')
        self.select_Menu.addAction(self.select_source)

        self.record_Menu = self.menubar.addMenu("对比记录")

        self.win_Menu = self.menubar.addMenu("窗口")

        self.win_max = QAction(QIcon('exit.png'), '&窗口最大化')
        self.win_max.setShortcut('')
        self.win_max.setStatusTip('最大化窗口')
        self.win_Menu.addAction(self.win_max)

        self.win_min = QAction(QIcon('exit.png'), '&窗口最小化')
        self.win_min.setShortcut('')
        self.win_min.setStatusTip('最小化窗口')
        self.win_Menu.addAction(self.win_min)

        self.user_Menu = self.menubar.addMenu("用户")

        self.user_out = QAction(QIcon('exit.png'), '&用户信息')
        self.user_out.setShortcut('')
        self.user_out.setStatusTip('注销用户')
        self.user_Menu.addAction(self.user_out)

        #     self.user_out.triggered.connect(self.sign_out)
        #
        # def sign_out(self):
        #     self.close()
        #     dialog = logindialog()
        #     if dialog.exec_() == QDialog.Accepted:
        #         the_window = Main()
        #         self.windowList.append(the_window)  # 这句一定要写,不然无法重新登录
        #         the_window.show()

        self.quit_Menu = self.menubar.addMenu("退出")

        self.quit_app = QAction(QIcon('exit.png'), '&退出')
        self.quit_app.setShortcut('Ctrl+Q')
        self.quit_app.setStatusTip('退出')
        self.quit_Menu.addAction(self.quit_app)

        self.help_Menu = self.menubar.addMenu("帮助")
        self.help_app = QAction(QIcon('exit.png'), '&帮助')
        self.help_app.setShortcut('')
        self.help_app.setStatusTip('帮助信息')
        self.help_Menu.addAction(self.help_app)

        self.groupbox_1 = QGroupBox('备案文件')  # 1
        # self.groupbox_1.setMaximumSize(9999,9999)
        self.groupbox_2 = QGroupBox('待对比文件')
        # self.groupbox_2.setMaximumSize(9999,9999)
        self.groupbox_3 = QGroupBox('比对结果')
        self.groupbox_4 = QGroupBox()
        self.groupbox_4.setLayout(self.h5_layout)
        self.h11_layout.addWidget(self.groupbox_4)
        self.toolbutton = QtWidgets.QToolButton()
        self.toolbar.setMovable(False)
        self.toolbutton.setAutoRaise(True)
        self.toolbutton.setIcon(QIcon('素材/开始.png'))
        self.toolbutton.setText("开始")
        self.toolbutton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)

        self.toolbutton2 = QtWidgets.QToolButton()
        # self.toolbutton2.setCheckable(False)
        self.toolbutton2.setAutoRaise(True)
        self.toolbutton2.setIcon(QIcon('素材/文档.png'))
        self.toolbutton2.setText("保存")
        self.toolbutton2.setToolTip("保存比对结果")
        # 在工具栏ToolBar里同时添加图标和文字,并设置图标和文字的相对位置;若没有下面的一行或多行代码,则只显示图标或文字。
        self.toolbutton2.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)

        self.comboBox = QtWidgets.QComboBox()
        self.comboBox.addItem("")
        self.comboBox.addItem("")

        self.toolbutton3 = QtWidgets.QToolButton()
        # self.toolbutton3.setCheckable(False)
        self.toolbutton3.setAutoRaise(True)
        self.toolbutton3.setIcon(QIcon('素材/关闭.png'))
        self.toolbutton3.setText("退出")
        self.toolbutton3.setToolTip("退出")
        # 在工具栏ToolBar里同时添加图标和文字,并设置图标和文字的相对位置;若没有下面的一行或多行代码,则只显示图标或文字。
        self.toolbutton3.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)

        self.toolbutton4 = QtWidgets.QToolButton()
        # self.toolbutton3.setCheckable(False)
        self.toolbutton4.setAutoRaise(True)
        self.toolbutton4.setIcon(QIcon('素材/下载.png'))
        self.toolbutton4.setText("下载备案")
        self.toolbutton4.setToolTip("下载备案文件")
        # 在工具栏ToolBar里同时添加图标和文字,并设置图标和文字的相对位置;若没有下面的一行或多行代码,则只显示图标或文字。
        self.toolbutton4.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)

        self.toolbutton5 = QtWidgets.QToolButton()
        # self.toolbutton3.setCheckable(False)
        self.toolbutton5.setAutoRaise(True)
        self.toolbutton5.setIcon(QIcon('素材/上传.png'))
        self.toolbutton5.setText("上传结果")
        self.toolbutton5.setToolTip("上传代码比对结果")
        # 在工具栏ToolBar里同时添加图标和文字,并设置图标和文字的相对位置;若没有下面的一行或多行代码,则只显示图标或文字。
        self.toolbutton5.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)

        self.toolbar.addWidget(self.toolbutton)
        self.toolbar.addSeparator()
        self.toolbar.addSeparator()
        self.toolbar.addWidget(self.toolbutton4)
        self.toolbar.addSeparator()
        self.toolbar.addSeparator()
        self.toolbar.addWidget(self.comboBox)
        self.toolbar.addSeparator()
        self.toolbar.addSeparator()
        self.toolbar.addWidget(self.toolbutton2)
        self.toolbar.addSeparator()
        self.toolbar.addSeparator()
        self.toolbar.addWidget(self.toolbutton5)
        self.toolbar.addSeparator()
        self.toolbar.addSeparator()
        self.toolbar.addWidget(self.toolbutton3)

        self.backup_label = QtWidgets.QLabel()
        self.backup_label.setFixedSize(375, 25)
        self.backup_label.setFont(QFont(
            "Roman times",
            11,
        ))
        self.backup_label.setText("请选择合适的备案文件")

        self.backup_button = QtWidgets.QPushButton()
        self.backup_button.setFixedSize(30, 30)
        self.backup_button.setIcon(QIcon("素材/文件夹.png"))

        self.source_label = QtWidgets.QLabel()
        self.source_label.setFixedSize(375, 25)
        self.source_label.setFont(QFont(
            "Roman times",
            11,
        ))
        self.source_label.setText("请选择合适的待比对文件")

        self.source_button = QtWidgets.QPushButton()
        self.source_button.setFixedSize(30, 30)
        self.source_button.setIcon(QIcon("素材/文件夹.png"))

        self.h6_layout.addWidget(self.backup_label)
        self.h6_layout.addWidget(self.backup_button)
        self.h6_layout.addWidget(self.source_label)
        self.h6_layout.addWidget(self.source_button)

        self.backup_win = QtWidgets.QWidget()
        self.backup_win.setFixedSize(420, 300)
        # self.backup_win.resize(500, 300)
        # self.backup_win.setMaximumSize(9999,9999)
        # self.backup_win.resize(420,300)

        self.source_win = QtWidgets.QWidget()
        self.source_win.setFixedSize(420, 300)
        # self.source_win.setMaximumSize(9999,9999)

        self.h1_layout.addWidget(self.backup_win)
        self.groupbox_1.setLayout(self.h1_layout)
        self.h2_layout.addWidget(self.source_win)
        self.groupbox_2.setLayout(self.h2_layout)

        self.backup_model = QFileSystemModel()

        self.backup_tree = QTreeView(self.backup_win)

        self.backup_model.setReadOnly(True)
        self.backup_tree.setGeometry(0, 0, 400, 290)

        self.source_model = QFileSystemModel()

        self.source_tree = QTreeView(self.source_win)

        self.source_model.setReadOnly(True)
        self.source_tree.setGeometry(0, 0, 400, 290)

        self.textBrowser = QtWidgets.QTextBrowser()

        self.textBrowser.setFixedSize(800, 250)
        self.textBrowser.setMaximumSize(9999, 9999)
        self.h7_layout.addWidget(self.textBrowser)
        self.groupbox_3.setLayout(self.h7_layout)
        self.pbar = QtWidgets.QProgressBar()
        self.pbar.setAlignment(Qt.AlignLeading | Qt.AlignLeft
                               | Qt.AlignVCenter)
        self.h9_layout.addWidget(self.pbar)
        # self.statusbar = QtWidgets.QStatusBar()
        self.h10_layout.addWidget(self.statusbar)

        self.h3_layout.addWidget(self.groupbox_1)
        self.h3_layout.addWidget(self.groupbox_2)
        # self.h3_layout.setSpacing(0)
        self.h8_layout.addWidget(self.groupbox_3)
        self.all_v_layout.addLayout(self.h4_layout)
        self.all_v_layout.addLayout(self.h11_layout)
        self.all_v_layout.addLayout(self.h6_layout)
        self.all_v_layout.addLayout(self.h3_layout)
        self.all_v_layout.addLayout(self.h8_layout)
        self.all_v_layout.addLayout(self.h9_layout)
        self.all_v_layout.addLayout(self.h10_layout)
        windget.setLayout(self.all_v_layout)
        self.retranslateUi(windget)

    def retranslateUi(self, windget):
        _translate = QtCore.QCoreApplication.translate
        windget.setWindowTitle(_translate("MainWindow", "电表代码对比软件"))
        windget.setWindowIcon(QIcon('素材/电网.ico'))
        self.comboBox.setItemText(0, _translate("MainWindow", "直接对比方式"))
        self.comboBox.setItemText(1, _translate("MainWindow", "数字签名对比方式"))
예제 #14
0
class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.filenames = json_files()

        if type(self.filenames) is list:
            self.curr_file = self.filenames[0]
        else:
            self.curr_file = self.filenames

        self.initUI()

    def initUI(self):

        self.num = -1  # index for search bar query
        self.show_save = False  # bool for showing unsaved changes dialog
        self.temp_file = ".temp.csv"
        self.refresh_file = False  # failsafe 1 for itemChanged trigger

        self.list_1 = QListWidget()

        lister(file=self.curr_file, target=self.list_1, index=0, mode=0)
        self.list_1.clicked.connect(self.clear_selection)
        self.list_1.installEventFilter(self)

        self.list_items = self.list_1.count(
        )  # failsafe 2 for itemChanged trigger
        self.list_1.itemChanged.connect(self.edit_next_item)
        self.list_1.verticalScrollBar().valueChanged.connect(self.sync_scroll)

        self.list_2 = QListWidget()
        lister(file=self.curr_file, target=self.list_2, index=1, mode=0)
        self.list_2.clicked.connect(self.clear_selection)

        self.list_3 = QListWidget()
        lister(file=self.curr_file, target=self.list_3, index=2, mode=0)
        self.list_3.clicked.connect(self.clear_selection)

        self.all_lists = [self.list_1, self.list_2, self.list_3]

        self.menubar = QMenuBar()
        self.menubar.setNativeMenuBar(False)

        exit_event = QAction('Exit', self)
        exit_event.setShortcut('Ctrl+W')
        exit_event.triggered.connect(app.quit)

        showAct = QAction('Show extras', self, checkable=True)
        showAct.setChecked(False)
        showAct.setShortcut('Ctrl+E')
        showAct.triggered.connect(self.hide_notes)

        addAct = QAction('Fields', self)
        addAct.setShortcut('Ctrl+N')
        addAct.triggered.connect(self.add_item)

        fileOpen = QAction('Open file', self)
        fileOpen.triggered.connect(self.fileDialog)
        fileOpen.setShortcut('Ctrl+O')

        fileSave = QAction('Save file', self)
        fileSave.triggered.connect(self.save)
        fileSave.triggered.connect(self.refresh_recents)
        fileSave.setShortcut('Ctrl+S')

        self.fileRecents = QMenu('Recent file', self)
        self.refresh_recents()

        self.toggle_theme = QAction('Toggle theme', self, checkable=True)
        self.toggle_theme.setChecked(json_theme())
        self.toggle_theme.triggered.connect(self.theme)
        self.toggle_theme.setShortcut('Ctrl+T')

        self.col_sort_index = QMenu('Sorting column index', self)
        self.col_sort_index.addAction(QAction(str(0), self))
        self.col_sort_index.addAction(QAction(str(1), self))
        self.col_sort_index.addAction(QAction(str(2), self))
        self.col_sort_index.triggered.connect(self.sort_col_choice)

        self.col_search_index = QMenu('Searching column index', self)
        self.col_search_index.addAction(QAction(str(0), self))
        self.col_search_index.addAction(QAction(str(1), self))
        self.col_search_index.addAction(QAction(str(2), self))
        self.col_search_index.triggered.connect(self.search_col_choice)

        self.sort = QAction('Sort entries', self, checkable=True)
        self.curr_col = 0
        self.search_col = 0
        self.sort.triggered.connect(self.refresh_list)
        self.sort.setShortcut('Ctrl+R')

        self.addFields = self.menubar.addMenu('Add')
        self.addFields.addAction(addAct)

        self.optionMenu = self.menubar.addMenu('Options')
        self.optionMenu.addAction(exit_event)
        self.optionMenu.addAction(showAct)
        self.optionMenu.addAction(self.toggle_theme)
        self.optionMenu.addMenu(self.col_sort_index)
        self.optionMenu.addMenu(self.col_search_index)
        self.optionMenu.addAction(self.sort)

        self.fileMenu = self.menubar.addMenu('File')
        self.fileMenu.addAction(fileOpen)
        self.fileMenu.addAction(fileSave)
        self.fileMenu.addMenu(self.fileRecents)

        self.search_bar = QLineEdit()
        self.search_bar.setPlaceholderText('Search vocab')
        self.search_bar.setClearButtonEnabled(True)
        self.search_bar.setMaxLength(10)
        self.search_bar.returnPressed.connect(self.search_item)

        self.status_bar = QStatusBar()
        status(self.status_bar, self.list_1)

        grid = QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(self.menubar, 0, 0)
        grid.addWidget(self.list_1, 1, 0)
        grid.addWidget(self.list_2, 1, 1)
        grid.addWidget(self.list_3, 1, 2)
        grid.addWidget(self.search_bar, 0, 1)
        grid.addWidget(self.status_bar)

        self.theme()
        self.setLayout(grid)
        self.setGeometry(*json_window_size())
        self.setWindowTitle(f'{split_name(self.curr_file)}')
        self.show()

        self.list_1.scrollToBottom()
        self.list_2.verticalScrollBar().setHidden(True)
        self.list_3.verticalScrollBar().setHidden(True)
        self.list_3.setHidden(True)

    def sync_scroll(self):

        scroll_location = self.list_1.verticalScrollBar().value()

        self.list_2.verticalScrollBar().setValue(scroll_location)
        self.list_3.verticalScrollBar().setValue(scroll_location)

    def edit_next_item(self, event):
        """When an item is added and edited on the first col, starts editing its counterpart on the next col"""

        if self.list_items == self.list_1.count(
        ) - 2 or self.list_items != self.list_1.count(
        ) and self.refresh_file == False:

            item = self.list_2.item(self.list_2.count() - 1)
            self.list_2.editItem(item)

            self.list_items = self.list_1.count()

    def closeEvent(self, event):
        """Triggered upon program exit, shows a dialog for unsaved changes using a bool"""

        if self.show_save == True:

            reply = QMessageBox.question(
                self, 'Message',
                "You may have unsaved changes, are you sure you want to quit?",
                QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

            if reply == QMessageBox.Yes:
                try:
                    remove(self.temp_file)
                except:
                    pass

                event.accept()
            else:
                event.ignore()

        else:
            pass

    def sort_col_choice(self, action):
        self.curr_col = int(action.text())

    def search_col_choice(self, action):
        self.search_col = int(action.text())

    def refresh_list(self):
        """Refreshes the contents of the lists, when sorting is used"""

        self.save(
            mode=1
        )  # saves a temp copy, with changes, but irreversable sorting introduced

        clear_lists(self.all_lists)

        if self.sort.isChecked() == True:
            mode = 2
        else:
            mode = 0

        try:
            lister(file=self.temp_file,
                   target=self.list_1,
                   index=0,
                   mode=mode,
                   column=self.curr_col)
            lister(file=self.temp_file,
                   target=self.list_2,
                   index=1,
                   mode=mode,
                   column=self.curr_col)
            lister(file=self.temp_file,
                   target=self.list_3,
                   index=2,
                   mode=mode,
                   column=self.curr_col)

        except:
            lister(file=self.curr_file,
                   target=self.list_1,
                   index=0,
                   mode=mode,
                   column=self.curr_col)
            lister(file=self.curr_file,
                   target=self.list_2,
                   index=1,
                   mode=mode,
                   column=self.curr_col)
            lister(file=self.curr_file,
                   target=self.list_3,
                   index=2,
                   mode=mode,
                   column=self.curr_col)

    def refresh_recents(self):

        try:

            file_1 = QAction(self.curr_file, self)
            self.fileRecents.addAction(file_1)
            file_1.triggered.connect(self.clickedFileAct)

            if type(self.filenames) is list:

                if self.filenames[1] != None:
                    file_2 = QAction(self.filenames[1], self)
                    self.fileRecents.addAction(file_2)
                    file_2.triggered.connect(self.clickedFileAct)

                if self.filenames[2] != None:
                    file_3 = QAction(self.filenames[2], self)
                    self.fileRecents.addAction(file_3)
                    file_3.triggered.connect(self.clickedFileAct)

        except:
            pass

    def clickedFileAct(self):

        self.refresh_file = True

        file = self.sender().text()
        self.curr_file = file
        self.setWindowTitle(f'{split_name(self.curr_file)}')

        clear_lists(self.all_lists)

        lister(file=self.curr_file, target=self.list_1, index=0)
        lister(file=self.curr_file, target=self.list_2, index=1)
        lister(file=self.curr_file, target=self.list_3, index=2)

        status(self.status_bar, self.list_1)
        self.theme()

        self.list_1.scrollToBottom()
        self.list_3.setHidden(True)

        self.refresh_file = False

    def eventFilter(self, source, event):
        """Item (row) deletion"""

        if (event.type() == QEvent.ContextMenu and source is self.list_1):
            menu = QMenu()
            menu.addAction("Delete row")
            if menu.exec_(event.globalPos()):
                item = source.itemAt(event.pos())
                try:
                    model = self.list_1.indexFromItem(item)
                    row = model.row()

                    self.show_save = True

                    self.list_1.takeItem(row)
                    self.list_2.takeItem(row)
                    self.list_3.takeItem(row)

                    status(self.status_bar, self.list_1,
                           f'Deleted row number: {row+1}.')
                    self.clearSelection()

                except:
                    pass

            return True
        return super(Example, self).eventFilter(source, event)

    def hide_notes(self):
        """Toggles showing the note column and stretches the window for clearer reading of it"""

        self.list_3.setHidden(not self.list_3.isHidden())

    def theme(self):
        """Sets the theme for the window and its widgets"""

        palette = QPalette()

        # dark theme
        if self.toggle_theme.isChecked() == True:

            palette.setColor(QPalette.Window, QColor(0, 0, 0))
            dark = "background-color: rgb(0, 0, 0); color: rgb(255, 255, 255);"

            self.menubar.setStyleSheet(dark)
            self.addFields.setStyleSheet(dark)
            self.optionMenu.setStyleSheet(dark)
            self.fileMenu.setStyleSheet(dark)
            self.search_bar.setStyleSheet(
                "background-color: rgb(0, 0, 0); color: rgb(255, 255, 255)"
            )  # border: 0px; for transparency
            self.status_bar.setStyleSheet(dark)

            style_items(self.all_lists, dark_theme=True)

        # light theme
        elif self.toggle_theme.isChecked() == False:

            palette.setColor(QPalette.Window, QColor(255, 255, 255))
            light = "background-color: rgb(255, 255, 255); color: rgb(0, 0, 0)"

            self.menubar.setStyleSheet(light)
            self.addFields.setStyleSheet(light)
            self.optionMenu.setStyleSheet(light)
            self.fileMenu.setStyleSheet(light)
            self.search_bar.setStyleSheet(light)
            self.status_bar.setStyleSheet(light)

            style_items(self.all_lists, dark_theme=False)

        self.setPalette(palette)

        self.theme_bool = self.toggle_theme.isChecked(
        )  # used in the save func

    def search_item(self):
        """Takes input from the search bar and matches with an item, 
		gets index and scrolls to it, more reusults being qued with the num class var
		"""

        query = self.search_bar.text()
        search = self.all_lists[self.search_col].findItems(
            query, Qt.MatchContains)
        status(self.status_bar, self.list_1, f'Found {len(search)} results.')
        self.clear_selection()

        # testing search in all column

        # search_list =[]
        # for x in range(3):
        # 	search_list.append(self.all_lists[x].findItems(query, Qt.MatchContains))

        # parent_list = []
        # for x in range(3):
        # 	for y in range(len(search_list[x])):
        # 		parent_list.append(self.all_lists[x]) # replace with x

        # import itertools
        # merged = list(itertools.chain.from_iterable(search_list))

        # search_dict = dict(zip(parent_list, merged))
        # print(search_dict)
        # print()
        # print(len(merged))
        # print(len(parent_list))

        self.num += 1
        for i in search:

            try:
                model_index = self.all_lists[self.search_col].indexFromItem(
                    search[self.num])

            except:
                self.num = 0
                model_index = self.all_lists[self.search_col].indexFromItem(
                    search[self.num])

            item_index = model_index.row()

            self.all_lists[self.search_col].item(item_index).setSelected(True)
            self.list_1.scrollToItem(self.list_1.item(item_index),
                                     QAbstractItemView.PositionAtCenter)

    def add_item(self):

        self.show_save = True

        for x in range(3):
            if x == 0:
                lister(file=self.curr_file,
                       target=self.list_1,
                       index=x,
                       mode=1)

            elif x == 1:
                lister(file=self.curr_file,
                       target=self.list_2,
                       index=x,
                       mode=1)

            elif x == 2:
                lister(file=self.curr_file,
                       target=self.list_3,
                       index=x,
                       mode=1)

        item = self.list_1.item(self.list_1.count() - 1)
        self.list_1.editItem(item)
        status(self.status_bar, self.list_1)

        self.list_1.scrollToBottom()
        self.list_2.scrollToBottom()
        self.list_3.scrollToBottom()

    def clear_selection(self):
        """Clears all item slections for aesthetical purposes, but only single clicks"""

        self.list_1.clearSelection()
        self.list_2.clearSelection()
        self.list_3.clearSelection()

    def fileDialog(self):

        fname = QFileDialog()
        path = fname.getOpenFileName(self,
                                     'Open file',
                                     getcwd(),
                                     filter='csv (*.csv);;')
        if path[0] == '':  # failsafe for canceling the dialog
            return self.curr_file

        self.curr_file = path[0]
        self.setWindowTitle(f'{split_name(self.curr_file)}')

        clear_lists(self.all_lists)

        lister(file=self.curr_file, target=self.list_1, index=0)
        lister(file=self.curr_file, target=self.list_2, index=1)
        lister(file=self.curr_file, target=self.list_3, index=2)

        status(self.status_bar, self.list_1)
        self.theme()

    def save(self, mode=0):

        self.show_save = False

        list1_items = items_text(self.list_1)
        list2_items = items_text(self.list_2)
        list3_items = items_text(self.list_3)

        total_dicts = []
        for (a, b, c) in zip(list1_items, list2_items,
                             list3_items):  # each letter is a column
            dictionary = {'word_1': a, 'word_2': b, 'notes': c}
            total_dicts.append(dictionary)

        if mode == 0:

            writer(file=self.curr_file, data=total_dicts)
            status(self.status_bar, self.list_1, ('Saved current changes.'))

            try:
                json_template(theme=self.theme_bool,
                              files=[self.curr_file, None, None],
                              window_size=self.geometry().getRect()
                              )  # current size values of the window

            except:
                json_template(
                )  # bug cannot be avoided, even though used setChecked at the beggining

        elif mode == 1:

            self.show_save = True
            writer(file=self.temp_file, data=total_dicts)

        # avoids stacking and refreshes recent file actions
        actions = self.fileRecents.actions()
        for action in actions:
            self.fileRecents.removeAction(action)
예제 #15
0
class MainWindow(QWidget): #Main application GUI

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.check_previous_data = 0
        self.previous_tickers = []
        self.basepath = path.dirname(__file__) #relative path

        if getattr(sys, 'frozen', False):
            # path of files changes if run as exe or script
            application_path = path.dirname(sys.executable)
        else:
            application_path = self.basepath

        try:
            historicPath = path.abspath(path.join(application_path,
                                                  "WSBhistoric_data.xlsx"))
            df = read_excel(historicPath)
            for tick in df[0]:
                self.previous_tickers.append(tick)
            self.check_previous_data = 1
            # print(self.previous_tickers)
        except: print("No previous data found")

        self.setWindowTitle("WSBFinScrape")
        self.setFixedSize(555, 620)
        self.setObjectName("myParentWidget")

        #create menu bar
        self.menubar = QMenuBar()
        self.menubar.setObjectName("menubar")
        supportMenu = self.menubar.addMenu("Support the Developer")
        supportMenu.addAction("Donate a Coffee", self.on_triggered_support)
        settingsMenu = self.menubar.addMenu("Settings")
        settingsMenu.addAction("Config", self.on_triggered_config)
        settingsMenu.addAction("Restart", self.restart)
        self.menubar.setStyleSheet("color: white;font-weight: bold;")
        self.menubar.setLayoutDirection(Qt.RightToLeft)


        # add window icon
        iconPath = path.abspath(path.join(self.basepath,"gorillaicon.jpg"))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(iconPath), QtGui.QIcon.Normal,
                       QtGui.QIcon.Off)
        self.setWindowIcon(icon)
        self.trayIcon = QSystemTrayIcon(QtGui.QIcon(iconPath), self)
        self.trayIcon.show()

        #add WSB logo
        WSBPath = path.abspath(path.join(self.basepath, "WallStreetBets.png"))
        self.WSBlabel = QLabel()
        self.WSBlabel.setAlignment(QtCore.Qt.AlignCenter |
                                   QtCore.Qt.AlignVCenter)
        self.WSBlabel.setText("")
        self.WSBlabel.setPixmap(QtGui.QPixmap(WSBPath))
        # self.label.setAlignment(Qt.AlignCenter)
        self.WSBlabel.setObjectName("label")

        # making scrollable area
        self.grid = QGridLayout()
        scrollwidget = QWidget()
        scrollwidget.setLayout(self.grid)
        scrollarea = QScrollArea()
        scrollarea.setWidgetResizable(True)
        scrollarea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scrollarea.setWidget(scrollwidget)
        self.mainLayout = QVBoxLayout()
        self.mainLayout.setObjectName("mainlayout")
        self.grid.setObjectName("gridlayout")

        self.mainLayout.addWidget(self.menubar)
        self.mainLayout.addWidget(self.WSBlabel)
        self.mainLayout.addWidget(scrollarea)

        self.setLayout(self.mainLayout)

        self.setStyleSheet("background-color: black;")

        labelstyle = "color: white; background-color: " \
                     "black; font-size: 8.2pt; font-weight: bold;"
        titleticker = QLabel("Ticker")
        titlePostCount = QLabel("#Mentions")
        titleStockPrice = QLabel("Current Price")
        titleDDcount = QLabel("#DD Posts")
        self.grid.addWidget(titlePostCount, 0, 1)
        self.grid.addWidget(titleStockPrice, 0, 2)
        self.grid.addWidget(titleticker, 0, 0)
        self.grid.addWidget(titleDDcount, 0, 3)
        titleticker.setStyleSheet(labelstyle)
        titleStockPrice.setStyleSheet(labelstyle)
        titlePostCount.setStyleSheet(labelstyle)
        titleDDcount.setStyleSheet(labelstyle)

        titlePostCount.setFixedSize(100, 30)
        titleticker.setFixedSize(160, 30)
        titleStockPrice.setFixedSize(100, 30)
        titleDDcount.setFixedSize(100, 30)

        titlePostCount.setAlignment(QtCore.Qt.AlignCenter |
                                    QtCore.Qt.AlignVCenter)
        titleStockPrice.setAlignment(QtCore.Qt.AlignCenter |
                                     QtCore.Qt.AlignVCenter)
        titleticker.setAlignment(QtCore.Qt.AlignCenter |
                                 QtCore.Qt.AlignVCenter)
        titleDDcount.setAlignment(QtCore.Qt.AlignCenter |
                                 QtCore.Qt.AlignVCenter)
        self.createTickButtons(mapping=sort_tickers)


    def createTickButtons(self, mapping):
        x = 0
        y = 0
        for key, value in mapping:
            # self.buttons.append(QPushButton(key))
            x += 1
            # y += 1
            button = QPushButton("$" + key)
            self.grid.addWidget(button, x, y)
            ticker_ob = OpenWindow()
            button.clicked.connect(partial(ticker_ob.handleTickerbutton,
                                           data=key))

            button.setFixedSize(160, 30)
            if self.check_previous_data == 1:
                if key not in self.previous_tickers:
                    button.setStyleSheet("QPushButton {border :2px solid "
                                         ";border-color: cyan; "
                                         "color: cyan; background-color: black;} "
                                         "QPushButton::pressed {background-color: "
                                         "grey;}")
                else:
                    button.setStyleSheet("QPushButton {border :2px solid "
                                     ";border-color: white; "
                                     "color: yellow; background-color: black;} "
                                     "QPushButton::pressed {background-color: "
                                     "grey;}")
            else: button.setStyleSheet("QPushButton {border :2px solid "
                                     ";border-color: white; "
                                     "color: yellow; background-color: black;} "
                                     "QPushButton::pressed {background-color: "
                                     "grey;}")

            button.setFont(QtGui.QFont('Times', 8))
            # button.set
            # self.buttons[-1].setFixedSize(40, 80)
            label = QLabel(str(value))
            self.grid.addWidget(label, x, 1)
            label.setStyleSheet("border :2px solid; color: yellow; "
                                "background-color: black;")
            label.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)

            try:
                label_DD_post = QLabel(str(count_DD_posts[key]))
                self.grid.addWidget(label_DD_post, x, 3)
                label_DD_post.setStyleSheet("border :2px solid; color: yellow; "
                                    "background-color: black;")
                label_DD_post.setAlignment(QtCore.Qt.AlignCenter |
                                      QtCore.Qt.AlignVCenter)
            except:
                label_DD_post = QLabel("0")
                self.grid.addWidget(label_DD_post, x, 3)
                label_DD_post.setStyleSheet("border :2px solid; color: yellow; "
                                            "background-color: black;")
                label_DD_post.setAlignment(QtCore.Qt.AlignCenter |
                                           QtCore.Qt.AlignVCenter)
        self.tickerPrice()
        self.dump_ticker_data()


    def tickerPrice(self):
        x = 0
        # today = datetime.date.today()
        for string_key in string_list:
            x += 1
            yest_container = float("{:.2f}".format(tickerPriceData[
                                                       string_key].iloc[0][
                                                       "Close"]))
            today_container = float("{:.2f}".format(tickerPriceData[
                                                        string_key].iloc[1][
                                                        "Close"]))
            price_label = QLabel("$ " + str(today_container))
            self.grid.addWidget(price_label, x, 2)
            price_label.setAlignment(
                QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)

            if today_container > yest_container:#Higher
                price_label.setStyleSheet("color: rgb(0,204,0); "
                                       "background-color: "
                                       "black;font-weight: bold")
            elif today_container < yest_container:#Lower
                price_label.setStyleSheet("color: rgb(255, 0, 0"
                                          "); background-color: "
                                          "black;font-weight: bold")
            #USE A SINGLE LABEL AND JUST SET STYLE SHEET
            elif today_container == yest_container:#Neutral
                price_label.setStyleSheet("color: white; background-color: "
                                          "black;font-weight: bold")
            else:
                error_label = price_label
                error_label.setText("!ERROR")
                error_label.setStyleSheet("color: grey; background-color: "
                                          "black;font-weight: bold")

        created_label = QLabel("created by Nebulezz")

        created_label.setStyleSheet("color: red; font-size: 8.2pt; "
                                    "font-weight: bold; font: italic;")
        created_label.setAlignment(
            QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
        self.mainLayout.addWidget(created_label)

    def dump_ticker_data(self):
        # create excel of tickers to check against in the future.
        ticker_dump = []
        for ticker in data_save_tickers:
            if ticker in ticker_dump:
                continue
            else:
                ticker_dump.append(ticker)
        historicDump = Series(ticker_dump)
        historicDump.to_excel('WSBhistoric_data.xlsx')


    def restart(self):#RESTARTS APPLICATION WITH INTERMEDIATE MESSAGEBOX
        msgBox = QMessageBox()
        msgBox.setIcon(QMessageBox.Information)
        msgBox.setText("Restart Application?")
        msgBox.setWindowTitle("Restart")
        msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)

        returnValue = msgBox.exec()
        if returnValue == QMessageBox.Ok:
            execl(sys.executable, sys.executable, *sys.argv)

    @QtCore.pyqtSlot()
    def on_triggered_support(self):
        QtGui.QDesktopServices.openUrl(QtCore.QUrl("https://www.paypal.com/biz/fund?id=E34JBGHTN3DFJ"))

    @QtCore.pyqtSlot()
    def on_triggered_config(self):#TRIGGERED CONFIG MENU ACTION
        if getattr(sys, 'frozen', False):
            # path of files changes if run as exe or script
            application_path = path.dirname(sys.executable)
        else:
            application_path = self.basepath

        configPath = path.abspath(path.join(application_path,"WSBconfig.txt"))
        configRead = open(configPath, "r")
        configlist = re.findall(r'\d+', configRead.read())
        configval = configlist[0]

        def saveFile():#SAVES SELECTED NUMBER OF POSTS TO FILE
            configfile = open(configPath, "w")
            configfile.write("#Posts to read: " + str(sld.value()))
            print("Post count changed to: ", sld.value())
            configfile.close()

            msgBox = QMessageBox()
            msgBox.setIcon(QMessageBox.Information)
            msgBox.setText("Post Count Saved!")
            msgBox.setWindowTitle("Info")
            msgBox.setStandardButtons(QMessageBox.Ok)
            msgBox.exec()



        #CREATES DIALOG FOR CHANGING SETTINGS
        whoDialog = QDialog(self)
        whoDialog.setWindowTitle("Number of Posts to Read?")
        whoDialog.setFixedSize(350, 230)
        whoDialog.setContentsMargins(5, 0, 5, 5)
        whoDialog.setStyleSheet("color: white;")
        mainlayout = QGridLayout()  # mainlayout for diallog box
        whoDialog.setLayout(mainlayout)  # set mainlayout of dialog
        verticalLayoutWidget = QWidget()

        info_label = QLabel("WARNING! Increasing the post read amount "
                            "will increase app load time.")
        changes_label = QLabel("Restart app to see changes take affect.")
        saveButton = QPushButton("Save")
        saveButton.setStyleSheet("QPushButton {color: white; "
                                 "background-color: black; "
                                 "padding :5px; font-size: 9pt; border: 2px "
                                 "solid; border-color: white;}"
                                 "QPushButton::pressed {background-color: grey;}")
        number_label = QLabel(str(configval))
        number_label.setStyleSheet("color: white; background-color: black; "
                                 "padding :5px; font-size: 9pt;")
        number_label.setAlignment(
            QtCore.Qt.AlignCenter | QtCore.Qt.AlignHCenter)

        #CREATES A SLIDER FOR PICKING POST NUMBER
        sld = QSlider(Qt.Horizontal)
        sld.setFocusPolicy(Qt.NoFocus)
        sld.setMinimum(100)
        sld.setMaximum(1000)
        sld.setTickPosition(QSlider.TicksAbove)
        sld.setTickInterval(100)
        sld.setSingleStep(10)
        sld.setValue(int(configval))

        number_label.setWordWrap(True)
        info_label.setWordWrap(True)
        # changes_label.setWordWrap(True)
        mainlayout.addWidget(verticalLayoutWidget)
        mainlayout.addWidget(info_label, 0, 0, 2, 0)
        mainlayout.addWidget(number_label, 2, 2)
        mainlayout.addWidget(saveButton, 2, 3)
        mainlayout.addWidget(sld, 3, 0, 2, 0)
        mainlayout.addWidget(changes_label, 4, 0, 2, 0)

        def updateValue(value):
            number_label.setText(str(value))

        sld.valueChanged.connect(updateValue)#UPDATES LABEL WITH SLIDER VALUE
        saveButton.clicked.connect(saveFile)#CONNECTS TO SAVE FUNCTION
        whoDialog.exec_()