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) # 给控件设置颜色
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
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] + """); """)
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()
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()
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()