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;")
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)
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)
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)
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 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()
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)
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)
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!!")
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;")
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", "数字签名对比方式"))
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)
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_()