IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Couleur pour un onglet avec Pmw.NoteBook


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Client Solution Developer
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Client Solution Developer

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut Couleur pour un onglet avec Pmw.NoteBook
    Bonjour,

    lorsque je sélectionne un onglet à l'aide de Pmw.NoteBook, je souhaiterais que la couleur d'affichage (de l'onglet sélectionné et de sa "fenêtre") soit différente de celle des autres onglets.

    J'ai bien essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pmw.Color.changecolor(boss, background ='yellow', foreground ='blue')
    mais c'est toute la fenêtre qui change de couleur.

    J'ai aussi lu qu'il existait la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pmw.NoteBook(boss).recolorborders()
    mais je ne comprends pas comment utiliser cette méthode (elle est sans effet).

    Quelqu'un peut-il m'aider?

    Merci d'avance.

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour pieral85,

    Citation Envoyé par pieral85 Voir le message
    J'ai bien essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pmw.Color.changecolor(boss, background ='yellow', foreground ='blue')
    mais c'est toute la fenêtre qui change de couleur.
    Comme ceci (sur la demo de Pmw) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import Tkinter
    import Pmw
     
     
    class Demo:
        def __init__(self, parent):
            self.colors = ('yellow', 'green', 'orange')
            self.notebook = Pmw.NoteBook(parent, raisecommand=self.color_me,
                                         lowercommand=self.hide_me)
            self.notebook.pack(fill='both', expand=1, padx=10, pady=10)
            self.notebook.add('1')
            self.notebook.add('2')
            self.notebook.add('3')
            button = Tkinter.Button()
            self.defaultbg = button.cget('background')
            self.defaultfg = button.cget('foreground')
            button.destroy()
            self.notebook.tab('1').focus_set()
     
        def color_me(self, e):
            Pmw.Color.changecolor(self.notebook.tab(e), 'black',
                                  foreground=self.colors[int(e)-1])
            Pmw.Color.changecolor(self.notebook.page(e), self.colors[int(e)-1],
                                  foreground='red')
            self.notebook.recolorborders()
     
        def hide_me(self, e):
            Pmw.Color.changecolor(self.notebook.tab(e), self.defaultbg,
                                  foreground=self.defaultfg)
            self.notebook.recolorborders()
     
     
    # Pmw.NoteBook color demo
    if __name__ == '__main__':
        root = Tkinter.Tk()
        Pmw.initialise(root)
        root.title('Pmw.NoteBook color demo')
        widget = Demo(root)
        exitButton = Tkinter.Button(root, text='Exit', command=root.destroy)
        exitButton.pack(pady=5)
        root.mainloop()
    Il y a sans doute plus simple (une méthode) mais je ne suis pas adepte de Pmw (Le mélange des tabs/espaces fonts que je n'ai jamais eu le courage de lire le code en entier)

    @+

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Re,

    Deux choses qui risques de vous intéresser vu le sujet. borderwidth et pagemargin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    import Tkinter
    import Pmw
     
     
    class Demo:
        def __init__(self, parent):
            self.colors = ('yellow', 'green', 'orange')
            self.notebook = Pmw.NoteBook(parent, raisecommand=self.color_me,
                                         lowercommand=self.hide_me, borderwidth=0,
                                         pagemargin=0)
            self.notebook.pack(fill='both', expand=1, padx=10, pady=10)
            self.notebook.add('1')
            self.notebook.add('2')
            self.notebook.add('3')
            button = Tkinter.Button()
            self.defaultbg = button.cget('background')
            self.defaultfg = button.cget('foreground')
            button.destroy()
            self.notebook.tab('1').focus_set()
     
        def color_me(self, e):
            Pmw.Color.changecolor(self.notebook.tab(e), 'black',
                                  foreground=self.colors[int(e)-1])
            Pmw.Color.changecolor(self.notebook.page(e), self.colors[int(e)-1],
                                  foreground='red')
     
        def hide_me(self, e):
            Pmw.Color.changecolor(self.notebook.tab(e), self.defaultbg,
                                  foreground=self.defaultfg)
            Pmw.Color.changecolor(self.notebook.page(e), self.defaultbg,
                                  foreground=self.defaultfg)
     
     
    # Pmw.NoteBook color demo
    if __name__ == '__main__':
        root = Tkinter.Tk()
        Pmw.initialise(root)
        root.title('Pmw.NoteBook color demo')
        widget = Demo(root)
        exitButton = Tkinter.Button(root, text='Exit', command=root.destroy)
        exitButton.pack(pady=5)
        root.mainloop()
    @+

  4. #4
    Membre averti
    Profil pro
    Client Solution Developer
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Client Solution Developer

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut
    Merci pour les infos PauseKawa. Pour ceux qui souhaiteraient s'en servir, voici le code que je souhaitais réaliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    # -*- coding: cp1252 -*-
    from Tkinter import *
    import Pmw
     
    class Onglets(Frame):
        """Onglets dans une fenêtre où "boss" est la fenêtre parent et "iOng" est
    l'indice de l'onglet affiché à l'ouverture de la fenêtre"""
     
        def __init__(self, boss =None, iOng =0):
            Frame.__init__(self)
            self.bg = '#EBE9ED'         #Couleur de l'onglet sélectionné
            self.defBg = 'dark grey'    #Couleur de fond de l'onglet (par défaut)
     
            Pmw.initialise()
            self.notebook = Pmw.NoteBook(boss, raisecommand =self.montrer,
                                         lowercommand =self.cacher, pagemargin=0)        
            ong = []    #Liste contenant les 5 onglets de la fenêtre de paramétrage
            for i in range(5):
                ong.append(self.notebook.add('onglet %s' % (i)))
                Pmw.Color.changecolor(self.notebook.tab(i), self.defBg,
                                      foreground='black')
                self.notebook.tab(i).configure(bd =0)
            self.montrer(0) #Si "l'onglet 0" est sélectionné par défaut, cette...
                #...ligne permet de le mettre dans la couleur voulue (self.bg)
     
            self.notebook.selectpage(iOng)
            self.notebook.pack(padx =10, pady =10, fill =BOTH, expand =1)
     
        def montrer(self, n):
            """Actions à effectuer quand un onglet est sélectionné"""
            iOngSel = self.notebook.index(n)    #index de l'onglet sélectionné
            Pmw.Color.changecolor(self.notebook.tab(iOngSel), self.bg,
                                  foreground='dark green')
            Pmw.Color.changecolor(self.notebook.page(iOngSel), self.bg,
                                  foreground='purple')
            print "et c'est l'onglet", iOngSel, "qui est sélectionné."
     
        def cacher(self, n):
            """Actions à faire quand un onglet est désélectionné"""
            iOngSel = self.notebook.index(n)    #index de l'onglet désélectionné
            Pmw.Color.changecolor(self.notebook.tab(iOngSel), self.defBg)
            Pmw.Color.changecolor(self.notebook.page(iOngSel), self.defBg)
            print "C'est l'onglet", iOngSel, "qui est désélectionné",
     
     
    if __name__ == "__main__":
        Onglets().mainloop()
    2/3 autres petites remarques/questions:

    1°) Pour la méthode Pmw.Color.changecolor, et concernant l'option foreground=une_couleur, je sais que ça correspond à la couleur de la police lorsque l'objet en question est un bouton, mais à quoi cela correspond-il lorsque l'objet est un frame? (Il n'y a que l'option background qui détermine la couleur du frame).

    2°) Lorsque tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            button = Tkinter.Button()
            self.defaultbg = button.cget('background')
    pourquoi ne pas directement déterminer la couleur grise correspondant à celle par défaut des boutons?
    J'ai aussi vu que self.defaultbg était un SystemButtonFace, qu'est-ce que cela a de particulier? Y aurait-il de la documentation à ce sujet?

    3°) J'ai beau essayé de voir quelle différence ça apporte, je ne vois pas l'utilité de la méthode mon_notebook.recolorborders() malgré la documentation.

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Citation Envoyé par pieral85 Voir le message
    2/3 autres petites remarques/questions:

    1°) Pour la méthode Pmw.Color.changecolor, et concernant l'option foreground=une_couleur, je sais que ça correspond à la couleur de la police lorsque l'objet en question est un bouton, mais à quoi cela correspond-il lorsque l'objet est un frame? (Il n'y a que l'option background qui détermine la couleur du frame).

    2°) Lorsque tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            button = Tkinter.Button()
            self.defaultbg = button.cget('background')
    pourquoi ne pas directement déterminer la couleur grise correspondant à celle par défaut des boutons?
    J'ai aussi vu que self.defaultbg était un SystemButtonFace, qu'est-ce que cela a de particulier? Y aurait-il de la documentation à ce sujet?

    3°) J'ai beau essayé de voir quelle différence ça apporte, je ne vois pas l'utilité de la méthode mon_notebook.recolorborders() malgré la documentation.
    1) C'est effectivement inutile. En fait cela ne lève pas d'AttributeError du fait que c'est testé (PmwColor.py)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            try:
                value = str(widget.cget(option))
            except:
                continue
    2) La couleur par défaut est spécifique au système d'après la doc.
    Pour ce qui est de SystemButtonFace aussi (Windows/Mac).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> import Tkinter
    >>> b = Tkinter.Button()
    >>> b.cget('bg')
    '#d9d9d9'
    >>> b.winfo_rgb('#d9d9d9')
    (55769, 55769, 55769)
    >>> rgb = b.winfo_rgb('#d9d9d9')
    >>> red, green, blue = rgb[0]/256, rgb[1]/256, rgb[2]/256
    >>> red
    217
    >>> green
    217
    >>> blue
    217
    >>> quit()
    patrice@Zeus:~/Bureau$ cat /etc/X11/rgb.txt | grep "217 217 217"
    217 217 217 		gray85
    217 217 217 		grey85
    3) .recolorborders() sert a changer la couleur des éléments (polygon) du Canvas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pmw.MegaArchetype.__init__(self, parent, Tkinter.Canvas)
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
            if self._withTabs:
                self._pageLeftBorder = self.create_polygon(0, 0, 0, 0, 0, 0,
                    fill = self._lightBorderColor, tags = 'lighttag')
                self._pageBottomRightBorder = self.create_polygon(0, 0, 0, 0, 0, 0,
                    fill = self._darkBorderColor, tags = 'darktag')
                self._pageTop1Border = self.create_polygon(0, 0, 0, 0, 0, 0,
                    fill = self._darkBorderColor, tags = 'lighttag')
                self._pageTop2Border = self.create_polygon(0, 0, 0, 0, 0, 0,
                    fill = self._darkBorderColor, tags = 'lighttag')
            else:
                self._pageLeftBorder = self.create_polygon(0, 0, 0, 0, 0, 0,
                    fill = self._darkBorderColor, tags = 'darktag')
                self._pageBottomRightBorder = self.create_polygon(0, 0, 0, 0, 0, 0,
                    fill = self._lightBorderColor, tags = 'lighttag')
                self._pageTopBorder = self.create_polygon(0, 0, 0, 0, 0, 0,
                    fill = self._darkBorderColor, tags = 'darktag')
    Car .changecolor ne touche que les Widgets eux mêmes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for child in widget.winfo_children():
           _recolorTree(child, oldpalette, newcolors)
    @+

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Re,

    Juste pour l'info le getdefaultpalette de Pmw:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    def getdefaultpalette(root):
        # Return the default values of all options, using the defaults
        # from a few widgets.
     
        ckbtn = Tkinter.Checkbutton(root)
        entry = Tkinter.Entry(root)
        scbar = Tkinter.Scrollbar(root)
     
        orig = {}
        orig['activeBackground'] = str(ckbtn.configure('activebackground')[4])
        orig['activeForeground'] = str(ckbtn.configure('activeforeground')[4])
        orig['background'] = str(ckbtn.configure('background')[4])
        orig['disabledForeground'] = str(ckbtn.configure('disabledforeground')[4])
        orig['foreground'] = str(ckbtn.configure('foreground')[4])
        orig['highlightBackground'] = str(ckbtn.configure('highlightbackground')[4])
        orig['highlightColor'] = str(ckbtn.configure('highlightcolor')[4])
        orig['insertBackground'] = str(entry.configure('insertbackground')[4])
        orig['selectColor'] = str(ckbtn.configure('selectcolor')[4])
        orig['selectBackground'] = str(entry.configure('selectbackground')[4])
        orig['selectForeground'] = str(entry.configure('selectforeground')[4])
        orig['troughColor'] = str(scbar.configure('troughcolor')[4])
     
        ckbtn.destroy()
        entry.destroy()
        scbar.destroy()
     
        return orig
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Couleurs pour les graphiques avec Matlab
    Par mansgueg dans le forum MATLAB
    Réponses: 1
    Dernier message: 24/06/2010, 16h27
  2. Comment faire pour une interface avec un menu ribbon ? sans onglet
    Par Yogy dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 20/01/2010, 15h58
  3. Réponses: 5
    Dernier message: 21/09/2008, 12h28
  4. Différente couleur pour l'onglet actif du menu css
    Par brotelle dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 12/04/2006, 10h18
  5. Réponses: 1
    Dernier message: 30/11/2005, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo