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 :

Transparence de widgets


Sujet :

Tkinter Python

  1. #1
    Invité
    Invité(e)
    Par défaut Transparence de widgets
    Bonsoir tout le monde!
    J'ai dernièrement réalisé un petit programme, que je souhaiterais améliorer en y incorporant une image en arrière plan. Le problème est que chaque widget (que ce soit une frame, un bouton, ou une listbox) cache ledit arrière plan. J'aimerais donc pouvoir rendre le background des widgets de mon programme (cités précédemment), partiellement ou complètement transparent. La seule alternative à peu près viable que j'ai pu trouver était d'utiliser un canvas et d'y inclure mes widgets, mais il n'existe pas de widget canvas_listbox ....

    D'avance merci pour toutes vos réponses (TOUT est bon à prendre ;-) )
    Raph.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 243
    Points : 36 701
    Points
    36 701
    Par défaut
    Salut,

    Les versions actuelles de TCL/Tk permettent de "modifier" la transparence d'un Toplevel et celle des widgets (Listbox) qu'on aura "mis dedans".
    Pour cela il faut modifier l'attribut -alpha de la window (au sens window manager):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import tkinter as tk
    >>> app = tk.Tk()
    >>> w = tk.Listbox()
    >>> w.pack()
    >>> app.wm_attributes()
    ('-alpha', 1.0, '-transparentcolor', '', '-disabled', 0, '-fullscreen', 0, '-toolwindow', 0, '-topmos
    t', 0)
    >>> app.wm_attributes('-alpha', 0.5)
    ''
    note: le 0.5 dit transparent à 50%.
    Et attention à la syntaxe, la méthode "wm_attributes" est assez "crue" côté masquage du TCL/Tk ne pas lui passer de liste de clés/valeurs!!
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir wiztricks,

    en y incorporant une image en arrière plan
    Et positionner un toplevel en overrideredirect sur le Frame principal de la fenêtre root ?
    En plus de la gestion de la géométrie par rapport au Widget cela demande une gestion de la position du toplevel (focus/lift), des bindings Unmap/Map/Configure, voir du protocol WM_DELETE_WINDOW du toplevel avec un destroy du root.
    C'est possible, et pourquoi pas bien que capilotracté (), mais il vas falloir jouer fin avec l'overrideredirect.

    A noter toutefois qu'alpha et le réactions d'overrideredirect dépendent du système.

    Toujours pas de poste Windows chez moi (et pas d'alpha) mais en aircoding cela donne +- (sans me prendre la tête avec un Frame et sa géométrie mais cela me semblerai plus juste):
    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
    import Tkinter as tk
     
    def SetBackground(root, imagefile):
        def OnConfig(event):
         fond.geometry(root.winfo_geometry())
         #root.focus_force()
     
        def OnUnmap(event):
         fond.withdraw()
     
        def OnMap(event):
            fond.deiconify()
            OnConfig(None)
            root.after(1, root.focus_force)
     
        fond = tk.Toplevel()
        Photo = tk.PhotoImage(file=imagefile)
        labelimage = tk.Label(fond, image=Photo, bd=0)
        labelimage.photo = Photo
        labelimage.pack()
        fond.update()
        root.geometry(fond.winfo_geometry())
        root.attributes("-alpha", 0.5)
        root.grab_set()
        root.bind("<Configure>", OnConfig)
        root.bind("<Unmap>", OnUnmap)
        root.bind("<Map>", OnMap)
        fond.protocol("WM_DELETE_WINDOW", root.destroy)
        fond.overrideredirect(1)
        root.after(1, root.focus_force)
     
    root = tk.Tk()
    root.title("Tkinter alpha sample")
    tk.Label(root, text="Un Widget").pack()
    tk.Button(root, text="Quit", command=root.destroy).pack()
    SetBackground(root, "image.gif")
    root.mainloop()
    (Exemple : A de bonnes chances de ne pas fonctionner)

    @+

    Edit : C'est une question récurrente et une petite contribution dans ce sens serait sans doute pas mal...
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 243
    Points : 36 701
    Points
    36 701
    Par défaut
    Salut PauseKawa,

    On peut effectivement faire une réponse plus élaborée mais sans connaître le contexte, difficile de savoir ce qui est applicable ou pas sans un retour du PO.

    C'est une question récurrente et une petite contribution dans ce sens serait sans doute pas mal...
    La version de TCL/Tk qui apporte des améliorations sur ces questions devait être intégrée à Python 3.3... Mais le train est parti sans elle.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Invité
    Invité(e)
    Par défaut Re-transparence
    Salut tout le monde!
    Merci de vos réponses, je vais essaye ce que tu as dit PauseKawa, mais mon petit regret est que la transparence caractères est aussi affectée avec la modification de la valeur alpha. J’espère qu'ils vont faire une mise à jour rapidement !

  6. #6
    Invité
    Invité(e)
    Par défaut Re-transparence
    Pardon, essayeR

Discussions similaires

  1. Problème de transparence de widget
    Par Invité dans le forum Tkinter
    Réponses: 4
    Dernier message: 10/03/2014, 19h32
  2. Widget avec arrière-plan transparent
    Par Invité dans le forum Qt
    Réponses: 9
    Dernier message: 11/04/2011, 16h19
  3. Background png transparent dans widget
    Par opacho dans le forum Qt
    Réponses: 1
    Dernier message: 26/09/2009, 01h52
  4. Widgets à background transparent sur un Panel
    Par Lotendan dans le forum wxPython
    Réponses: 6
    Dernier message: 28/01/2009, 18h10
  5. Qt4 SDL widget transparent
    Par manpe dans le forum Qt
    Réponses: 10
    Dernier message: 14/04/2008, 14h16

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