Пример #1
0
def _interactive_color_dialog(callback):
    from PyQt5.QtWidgets import QColorDialog

    dialog = QColorDialog()

    dialog.currentColorChanged.connect(callback)
    dialog.show()
    return dialog
class Demo(QWidget):
    def __init__(self):
        super().__init__()
        self.main_window = self

        # 初始化颜色
        self.color = QColor(107, 173, 246)
        # 创建颜色对话框--但不显示
        self.color_dialog = QColorDialog(self.color, self.main_window)

        # 创建调色板
        self.palette = QPalette()

    def setup_ui(self) -> None:
        # 颜色选取信号
        # 会向槽函数传递一个值---QColor
        # self.color_dialog.colorSelected.connect(self.update_color)  # 选中最终颜色时发出信号-点击对话框的确定按钮时
        self.color_dialog.currentColorChanged.connect(self.update_color)  # 当前颜色变化时

        # self.cd.setOption(QColorDialog.NoButtons)  #选项控制--单个选项
        # QColorDialog.NoButtons   不显示“ 确定”和“ 取消”按钮。(对“实时对话框”有用)
        # QColorDialog.ShowAlphaChannel   对话框中增加alpha设置项
        self.color_dialog.setOptions(QColorDialog.NoButtons | QColorDialog.ShowAlphaChannel)  # 选项控制--多个选项

        # 打开对话框,获取颜色
        # noinspection PyCallByClass
        # self.color = self.color_dialog.getColor(self.color, None)

        # 打开对话框
        self.color_dialog.show()

    def update_color2(self, event: QColor):
        self.palette.setColor(QPalette.Background, event)  # 给调色板设置颜色
        self.setPalette(self.palette)  # 给控件设置颜色

    def update_color(self, event: QColor) -> None:
        # print(event, type(event))
        # print(self.color_dialog.selectedColor(), type(self.color_dialog.selectedColor()))

        # QPalette.Background   表示设置背景色
        # QPalette.WindowText  表示设置文本颜色
        self.palette.setColor(QPalette.Background, event)  # 给调色板设置颜色
        # self.palette.setColor(QPalette.Background, self.color_dialog.selectedColor())  # 给调色板设置颜色

        self.main_window.setPalette(self.palette)  # 给控件设置颜色
Пример #3
0
class SkinColorDialogUI(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # 初始化颜色
        self.color = QColor(*settings.SKIN_COLOR)
        # 创建颜色对话框--但不显示
        # self.color_dialog = QColorDialog(self.color, self.main_window)
        self.color_dialog = QColorDialog(self.color, self)

        # 创建调色板
        self.palette = QPalette()

        self.options()

    def update_color(self, event: QColor) -> None:
        """
        更新颜色
        两种方式同时
        :param event:
        :return:
        """
        # print(event, type(event))
        # print(self.color_dialog.selectedColor(), type(self.color_dialog.selectedColor()))

        # QPalette.Background   表示设置背景色
        # QPalette.WindowText  表示设置文本颜色
        self.palette.setColor(QPalette.Background, event)  # 给调色板设置颜色
        self.palette.setBrush(QPalette.Base, QBrush(QColor(*event.getRgb())))
        # self.palette.setColor(QPalette.Background, self.color_dialog.selectedColor())  # 给调色板设置颜色

        # 给控件设置颜色
        if event.isValid():
            # self.main_window.setStyleSheet('QWidget {background-color:%s}' % event.name())
            # self.main_window.setPalette(self.palette)
            self.color_dialog.setStyleSheet('QWidget {background-color:%s}' %
                                            event.name())
            self.color_dialog.setPalette(self.palette)
            # 发色信号
            communicate.skin_color.emit(event)

    def options(self) -> None:
        """
        参数设置
        """
        # 颜色选取信号
        # 会向槽函数传递一个值---QColor
        # self.color_dialog.colorSelected.connect(self.update_color)  # 选中最终颜色时发出信号-点击对话框的确定按钮时
        self.color_dialog.currentColorChanged.connect(
            self.update_color)  # 当前颜色变化时

        # self.cd.setOption(QColorDialog.NoButtons)  #选项控制--单个选项
        # QColorDialog.NoButtons   不显示“ 确定”和“ 取消”按钮。(对“实时对话框”有用)
        # QColorDialog.ShowAlphaChannel   对话框中增加alpha设置项
        self.color_dialog.setOptions(
            QColorDialog.NoButtons
            | QColorDialog.ShowAlphaChannel)  # 选项控制--多个选项

        # 打开对话框,会等待完成
        # noinspection PyCallByClass
        # self.color_dialog.getColor(self.color, None)

        # 最终回调函数
        self.color_dialog.finished.connect(self.finished_color)

    def setup_ui(self) -> None:
        # 打开对话框,等待打开
        # self.color_dialog.open()
        self.color_dialog.show()

    def finished_color(self, event: int) -> None:
        """
        设置颜色到全局变量
        :param event:
        :return:
        """
        if event:
            pass
        color = self.color_dialog.currentColor().getRgb()[:3]
        settings.SKIN_COLOR = color
Пример #4
0
class MainWindow(QMainWindow, Ui_MainWindow):
     def __init__(self):
         QMainWindow.__init__(self)
         self.setupUi(self)
         try:
             icon = QIcon()
             icon.addPixmap(QPixmap(ICON_APP), QIcon.Normal, QIcon.Off)
             self.setWindowIcon(icon)
         except:
             print("Erreur de chargement de l'icone")
         self.fichier = None
         self.fichierPrevisualisation = None
         self.theme = None
         self.langage = None
         self.mot = None
         self.colorDialog = QColorDialog(self)
         self.colorDialog.currentColorChanged.connect(self.on_colorChanged)
         self.nom.textChanged.connect(self.on_nom_textChanged)
         self.auteur.textChanged.connect(self.on_auteur_textChanged)
         self.show()
         self.initCreation()
     def initCreation(self):
         """
            Initialisation de la création du thème
         """
         if self.fichier is None:
             actions = ["Créer un thème", "Charger un thème"]
             message = "Que voulez-vous faire ?"
             item, ok = QInputDialog.getItem(self, "VPEdThemeCreator", message, actions, 0, False)
             if ok and item == actions[1]:
                 self.on_actionOuvrir_triggered(init = True)
             else:
                 self.on_actionNouveau_triggered()

         # Tabulation
         self.previsualisation.spaceWidth = self.previsualisation.fontMetrics().width(" ")
         self.previsualisation.setTabStopWidth(self.previsualisation.spaceWidth * 7)
         self.previsualisation.setStyleSheet("""
                font:14px comic sans ms, verdana;background:rgb(""" + self.theme.themeGeneral.backgrounds[4] + """);
                color:rgb(""" + self.theme.themeGeneral.foregrounds[0] + """);
         """)
         self.previsualisation.setHorizontalScrollBar(QScrollBar(Qt.Horizontal, self.previsualisation))

         # Evènements
         self.langages.itemClicked.connect(self.on_langages_itemChanged)
         self.mots.itemClicked.connect(self.on_mots_itemChanged)

         for lang in LANGUAGES.keys():
             self.langages.addItem(lang)

         #Changement de couleur (évènement)
         self.changerCouleur.clicked.connect(self.on_changerCouleur)
         self.italique.clicked.connect(self.on_checkBoxFont_clicked)
         self.gras.clicked.connect(self.on_checkBoxFont_clicked)
         self.general.currentTextChanged.connect(self.on_comboBoxGeneral_textChanged)

     @pyqtSlot()
     def on_nom_textChanged(self):
         self.theme.nom = self.nom.text()

     @pyqtSlot()
     def on_auteur_textChanged(self):
         self.theme.auteur = self.auteur.text()

     @pyqtSlot()
     def on_actionNouveau_triggered(self):
         """
            Création d'un nouveau
         :return:
         """
         self.fichier = VPThemeFile(THEME_DEFAUT)
         self.theme = self.fichier.lire()
         self.setWindowTitle("VPEditor Theme Creator - New...")
         self.chargerTheme(self.theme)

     @pyqtSlot()
     def on_actionOuvrir_triggered(self, init=False):
         """
            Ouverture d'un thème
         :return:
         """
         chemin, filtre = QFileDialog.getOpenFileName(self, "Chargement thème", filter="VPEditor Thème(*.vpt)")
         if chemin:
             self.fichier = VPThemeFile(chemin)
             if self.fichier.isThemeFile():
                 self.theme = self.fichier.lire()
                 self.setWindowTitle("VPEditor Theme Creator - " + chemin)
                 self.chargerTheme(self.theme)
             else:
                 message = "Ce fichier n'est pas un thème VPEditor"
                 reponse = QMessageBox.information(self, "Erreur", message, QMessageBox.Ok)
                 if init is True:
                     self.on_actionNouveau_triggered()
         else:
             if init is True:
                 self.on_actionNouveau_triggered()

     def chargerTheme(self, theme:VPTheme):
         """
            Chargment du thème
         :param theme:
         :return:
         """
         #Nom du thème
         self.nom.setText(theme.nom)
         self.auteur.setText(theme.auteur)
         self.previsualisation.theme = theme
         self.previsualisation.setPlainText("")
         self.couleur.setStyleSheet("background:none")
         self.mots.clear()

     @pyqtSlot()
     def on_actionEnregistrer_triggered(self):
         """Enregistrement du theme"""
         if type(self.fichier) == VPThemeFile and self.fichier.chemin != THEME_DEFAUT:
             self.fichier.ecrire(self.theme)
         else:
             self.on_actionEnregitrer_sous_triggered()

     @pyqtSlot()
     def on_actionEnregitrer_sous_triggered(self):
         """Enregistrement du theme"""
         """Parfois confusion dans ui_main entre enregitrer et enregistrer"""
         #Vérification
         if self.nom.text() not in ("", " "):
             if self.auteur.text() not in ("", " "):
                 chemin, filtre = QFileDialog.getSaveFileName(self, "Enregistrement du thème", filter="VPEditor Thème(*.vpt)")
                 if chemin:
                     fichier = VPThemeFile(chemin)
                     fichier.ecrire(self.theme)
                     self.fichier = fichier
                     self.setWindowTitle("VPEditor Theme Creator - " + chemin)
             else:
                 alerte = alert(self, "Veuillez entrer votre nom en tant qu'auteur");
         else:
             alerte = alert(self, "Veuillez entrer le nom du thème");


     def on_langages_itemChanged(self, item):
         langageSelectionne = item.text()
         self.langage = langageSelectionne
         self.rafraichirMots(langageSelectionne)
         try:
             cheminPrevisualisation = "VPEdThemeCreatorSRC/previsualisation/"+langageSelectionne+"."+LANGUAGES[langageSelectionne]["exts"][0]
             self.fichierPrevisualisation = UserFile(cheminPrevisualisation)
             self.previsualisation.theme = self.theme
             self.previsualisation.colorSyntax = ColorSyntax(self.previsualisation.document(), self.fichierPrevisualisation.extension(), self.theme)
             self.previsualisation.setPlainText(self.fichierPrevisualisation.lire())
         except:
             pass

     def rafraichirMots(self, langage):
         """Actualiser la partie des mots"""
         # On efface la liste des mots
         self.mots.clear()
         for mot in LANGUAGES[langage]["coloration"]:
             self.mots.addItem(mot)

     def on_mots_itemChanged(self, item):
         """Lorsqu'on change de mot"""
         self.rafraichirCouleurs(item.text())


     def rafraichirCouleurs(self, mot):
         """Mettre à jour la zone couleurs"""
         self.mot = mot
         if mot is not None:
             if self.langage is not None:
                 self.codeCouleur = self.theme.coloration[self.langage][mot]["couleur"]
                 self.couleur.setStyleSheet("background:" + self.codeCouleur + ";")
                 self.italique.setChecked(self.theme.coloration[self.langage][mot]["italique"])
                 self.gras.setChecked(self.theme.coloration[self.langage][mot]["gras"])
                 self.colorDialog.setCurrentColor(QColor(self.codeCouleur))

     def on_changerCouleur(self):
         """Lorsqu'on clique sur le bouton changer couleur"""
         self.colorDialog.show()

     def on_colorChanged(self, color):
         """Lorsqu'on change la couleur dans QColorDialog"""
         self.couleur.setStyleSheet("background:" + color.name() + ";")
         self.theme.coloration[self.langage][self.mot]["couleur"] = color.name()
         self.rafraichirTabs()

     def on_checkBoxFont_clicked(self):
         """Quand on clique sur un checkbox dans la zone font"""
         self.theme.coloration[self.langage][self.mot]["italique"] = self.italique.checkState()
         self.theme.coloration[self.langage][self.mot]["gras"] = self.gras.checkState()
         self.rafraichirTabs()

     def rafraichirTabs(self):
         """Mise à jour des TabText"""
         self.previsualisation.theme = self.theme
         self.previsualisation.colorSyntax = ColorSyntax(self.previsualisation.document(), self.fichierPrevisualisation.extension(), self.theme)

     def on_comboBoxGeneral_textChanged(self, text):
         """Lorsqu'on change le thème général"""
         if text.lower().find("sombre") >= 0 or text.lower().find("noir") >= 0:
             self.theme.setStylesWidgets("sombre")
         else:
             self.theme.setStylesWidgets("clair")
         self.previsualisation.setStyleSheet("""
             font:14px comic sans ms, verdana;background:rgb(""" + self.theme.themeGeneral.backgrounds[4] + """);
             color:rgb(""" + self.theme.themeGeneral.foregrounds[0] + """);
         """)
Пример #5
0
 def handle_select_color_btn(self):
     dialog = QColorDialog(self)
     dialog.setWindowTitle("Select Text Color")
     dialog.colorSelected.connect(
         lambda c: self.set_watermark_color(color=c))
     dialog.show()
Пример #6
0
class ThemeDialog(QDialog, Ui_dialogTheme):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        self.fenetre = parent
        self.setupUi(self)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        icon = QIcon()
        icon.addPixmap(QPixmap(ICON_APP), QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)
        self.theme = parent.theme
        self.langage = ""
        self.mot = ""
        self.codeCouleur = ""
        self.colorDialog = QColorDialog(self)
        self.colorDialog.setWindowTitle("Selectionnez une couleur")
        self.colorDialog.setWindowIcon(icon)

        #Initialisation de certains éléments
        #Chargement des themes prédéefinis
        fichier_themes_predefinis = AppFile(THEME_PREDEFINIS)
        self.themes = fichier_themes_predefinis.lire()
        if self.themes is not None:
            for nom, fichier in self.themes:
                self.comboBoxThemes.addItem(nom)

        self.couleur.setEnabled(False)
        if self.theme.themeGeneral.environnement in ("sombre", "noir"):
            self.comboBoxGeneral.setCurrentIndex(0)
        else:
            self.comboBoxGeneral.setCurrentIndex(1)
        #Ajout des langages
        for lang in LANGUAGES.keys():
            self.listLangages.addItem(lang.upper())
        self.rafraichirMots()
        #Slots
        self.comboBoxThemes.currentTextChanged.connect(
            self.on_comboBoxThemes_textChanged)
        self.listLangages.itemClicked.connect(self.on_langageClicked)
        self.listMots.itemClicked.connect(self.on_motClicked)
        self.pushButtonChangerCouleur.clicked.connect(self.on_changerCouleur)
        self.colorDialog.currentColorChanged.connect(self.on_colorChanged)
        self.checkBoxItalique.clicked.connect(self.on_checkBoxFont_clicked)
        self.checkBoxGras.clicked.connect(self.on_checkBoxFont_clicked)
        self.comboBoxGeneral.currentTextChanged.connect(
            self.on_comboBoxGeneral_textChanged)
        self.show()

    def on_comboBoxThemes_textChanged(self, text):
        #Recherche du fichier theme
        nomFichierNouveau = ""
        for nom, fichier in self.themes:
            if nom == text:
                nomFichierNouveau = fichier
        fichierNouveau = VPThemeFile(appFolder + "/themes/" +
                                     nomFichierNouveau)
        theme = fichierNouveau.lire()
        if theme is not None and type(theme) == VPTheme:
            self.theme = theme
            self.rafraichirTabs()

    def on_comboBoxGeneral_textChanged(self, text):
        """Lorsqu'on change le thème général"""
        if text.lower().find("sombre") >= 0 or text.lower().find("noir") >= 0:
            self.theme.setStylesWidgets("sombre")
        else:
            self.theme.setStylesWidgets("clair")
        message = "Ce nouveau thème sera pris en compte au prochain démarrage de l'application"
        messageBox = QMessageBox.information(self, "Message", message,
                                             QMessageBox.Ok)

    def rafraichirMots(self):
        """Actualiser la partie des mots"""
        langagesSelectionnes = self.listLangages.selectedItems()
        if len(langagesSelectionnes) > 0:
            langage = langagesSelectionnes[0].text().upper()
        else:
            langage = self.listLangages.item(0).text().upper()
            self.listLangages.setCurrentRow(0)
        #On efface la liste des mots
        self.listMots.clear()
        for mot in LANGUAGES[langage]["coloration"]:
            self.listMots.addItem(mot)
        self.langage = langage
        self.listMots.setCurrentRow(0)
        self.rafraichirCouleurs()

    def on_langageClicked(self, item):
        """Lorsqu'on change de langage"""
        self.rafraichirMots()

    def rafraichirCouleurs(self):
        """Mettre à jour la zone couleurs"""
        motsSelectionnes = self.listMots.selectedItems()
        if len(motsSelectionnes) > 0:
            mot = motsSelectionnes[0].text()
        else:
            mot = None
        self.mot = mot
        if mot is not None:
            if self.langage != "":
                self.codeCouleur = self.theme.coloration[
                    self.langage][mot]["couleur"]
                self.couleur.setStyleSheet("min-height:45px;background:" +
                                           self.codeCouleur + ";")
                self.checkBoxItalique.setChecked(
                    self.theme.coloration[self.langage][mot]["italique"])
                self.checkBoxGras.setChecked(
                    self.theme.coloration[self.langage][mot]["gras"])
                self.colorDialog.setCurrentColor(QColor(self.codeCouleur))

    def on_motClicked(self):
        """Lorsqu'on change de mot"""
        self.rafraichirCouleurs()

    def on_changerCouleur(self):
        """Lorsqu'on clique sur le bouton changer couleur"""
        self.colorDialog.show()

    def on_colorChanged(self, color):
        """Lorsqu'on change la couleur dans QColorDialog"""
        self.couleur.setStyleSheet("min-height:45px;background:" +
                                   color.name() + ";")
        self.theme.coloration[self.langage][self.mot]["couleur"] = color.name()
        self.rafraichirTabs()

    def on_checkBoxFont_clicked(self):
        """Quand on clique sur un checkbox dans la zone font"""
        self.theme.coloration[self.langage][
            self.mot]["italique"] = self.checkBoxItalique.checkState()
        self.theme.coloration[self.langage][
            self.mot]["gras"] = self.checkBoxGras.checkState()
        self.rafraichirTabs()

    def rafraichirTabs(self):
        """Mise à jour des TabText"""
        tabs = self.fenetre.tabs
        for tabText in tabs.tabtexts:
            tabText.theme = self.theme
            tabText.coloration()

    def closeEvent(self, event):
        """Quand on ferme la boîte"""
        fichier_theme.ecrire(self.theme)
        event.accept()
Пример #7
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowFlags(
            #stay on top so it always appears visibly when we active with keyboard shortcut
            QtCore.Qt.WindowStaysOnTopHint |
            #we want to have minimal top bar so it looks clean, but still be resizable so not a frameless window
            QtCore.Qt.CustomizeWindowHint)

        #initialise starting state
        self.showing = False
        self.dialog = False
        self.loadDefaultColor()

        #set window color, position and size
        self.setStyleSheet("background-color: " + self.color.name() + ";")
        self.setWindowOpacity(self.color.alpha() / 255)
        self.oldPos = self.pos()
        self.setGeometry(0, 0, 500, 500)
        self.center()

        #need to show then hide otherwise program just ends if we do nothing
        self.show()
        self.hide()

    #when keyboard shortcut is pressed, show/hide accordingly
    def on_activate(self):
        if self.showing:
            self.hide()
        else:
            self.show()
        self.showing = not self.showing

    #just puts the window in the centre of the screen
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    #called when a colour is selected in the color dialog
    def updateColor(self, color):
        self.show()
        if color.isValid():
            self.setStyleSheet("background-color: " + color.name() + ";")
            self.setWindowOpacity(color.alpha() / 255)
            self.color = color
            self.saveDefaultColor()

    #saves color to settings.txt so it can be restored when program is next ran
    def saveDefaultColor(self):
        with open("settings.txt", "w") as f:
            s = ",".join([
                str(self.color.alpha()),
                str(self.color.red()),
                str(self.color.green()),
                str(self.color.blue())
            ])
            f.write(s)

    #load most recent colour from last time
    def loadDefaultColor(self):
        with open("settings.txt", "r") as f:
            s = f.read().split(",")
            self.color = QtGui.QColor(int(s[1]), int(s[2]), int(s[3]))
            self.color.setAlpha(int(s[0]))

    #when color dialog is rejected (cancel is pressed)
    #need to still reshow the overlay
    def dialogClosed(self):
        self.dialog.done(0)
        self.show()
        self.showing = True

    #when we click on the overlay
    def mousePressEvent(self, event):
        #if left, we are dragging and moving the overlay
        if event.button() == Qt.LeftButton:
            self.oldPos = event.globalPos()
        #if right, we open color dialog
        elif event.button() == Qt.RightButton:
            self.hide()
            showing = False

            #initialise and show color dialog, with current colour as default
            self.dialog = QColorDialog(self)
            self.dialog.setStyleSheet("background-color: #dddddd;")
            self.dialog.setOption(QColorDialog.ShowAlphaChannel)
            self.dialog.reject = self.dialogClosed
            self.dialog.setCurrentColor(self.color)
            self.dialog.colorSelected.connect(self.updateColor)
            self.dialog.show()

    #when mouse is moved, we move overlay accordingly
    def mouseMoveEvent(self, event):
        delta = QPoint(event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()