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 :

Possibilité de widgets avec background transparent ?


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut Possibilité de widgets avec background transparent ?
    Bonjour,

    Je suis débutant Python 2.7 et Tkinter.
    J'ai suivi la méthode d'apprentissage classique mais je "bloque" sur un aspect :

    J'ai créé un petit programme dont l'affichage des widgets est géré en lignes et colonnes (avec des .grid(row=x,column=y)).

    J'ai chargé une image de fonds à ma fenêtre (dans un label avec .grid(rowspan=X et columnspan=Y), X et Y étant de grands nombres).

    Les Widgets suivants (des "Label" de texte par exemple) apparaissent comme posés sur l'image, c'est d'ailleurs ce que je voulais... Le seul problème est que leur background n'est pas transparent . Y a t il une astuce pour rendre les "background"/arrières-fonds des widgets transparents ?

    J'ai essayé les paramètres bg="" et background="" mais cela ne fonctionne pas.

    Merci de votre aide.

    Bertrand

  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,

    La gestion de la transparence se fait via l'attribute -alpha
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .attributes("-alpha", valeur)
    (Valeur : de 1.0 visible à 0.0 transparent)
    C'est gérer par le WM et ne fonctionne pas pour tous les WM.

    @+

  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
    Citation Envoyé par Bear the french Voir le message
    J'ai chargé une image de fonds à ma fenêtre (dans un label avec .grid(rowspan=X et columnspan=Y), X et Y étant de grands nombres).

    Les Widgets suivants (des "Label" de texte par exemple) apparaissent comme posés sur l'image, c'est d'ailleurs ce que je voulais...
    Vous pouvez aussi utiliser un Canvas et create_text

  4. #4
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Merci PauseKawa

    J'arrive à appliquer ce paramétrage à l'ensemble de ma fenêtre mais pas à mes widgets. Peut-être y a t il une astuce en matière de syntaxe que j'ignore.

    Voilà comment ça fait pour l'instant - bref, ce n'est pas beau



    Bertrand

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    from math import sqrt
     
     
    # --- définition des fonctions : ---
     
    def _pythagore_hypo(*args):
        # calcul la longueur de l'hypoténuse pour un triangle rectangle
        # le théorème :  le carré de la longueur de l’hypoténuse est égal
        # à la somme des carrés des longueurs des deux autres côtés
        return round(sqrt(sum(x**2 for x in args)),2)
     
    def evaluer(event):
        chain.configure(text = "La longueur de l'hypothénuse = " + str(_pythagore_hypo(float(entr1.get()),float(entr2.get()))),font=("Arial",9,"bold"))
     
     
     
    #---------------------------------------------------------------------------
    # GUI : Création de la fenêtre principale ("root", la racine) :
    fen1 = Tk()
    # Donne un titre à la fenêtre (par défaut c'est Tk) et lui affecte une icone
    fen1.title("Mon programme test")
    fen1.wm_attributes("-topmost", 1, "-alpha", 0.95)
    fen1.update()
     
    # pick a .gif image file you have in the working directory, pour le background
    photo = PhotoImage(file="slade.gif")
     
    #---------------------------------------------------------------------------
    # Coeur du programme
    #---------------------------------------------------------------------------
     
    # Initialisation de la variable changement de ligne pour la commande .grid
    lig=1
     
    # Actions (saisies et renvois d'informations)
    entr1 = Entry(fen1)
    entr2 = Entry(fen1)
    chain = Label(fen1)
    entr1.bind("<Return>",evaluer)
    entr2.bind("<Return>",evaluer)
     
    # Affichage
    Label(fen1, image=photo).grid(row=1,column=1, rowspan=20,columnspan = 20)
    Label(fen1, text="").grid(row=lig,column=1)
    lig += 1
    ligne1 = Label(fen1, text="LE THEOREME DE PYTHAGORE",font=("Helvetica", 14,"bold")).grid(row=lig,column=1,columnspan = 2)
    lig += 1
    Label(fen1, text="").grid(row=lig,column=1)
    lig += 1
    ligne1=Label(fen1, text="         Un triangle rectangle compose de 2 cotes perpendiculaires dont la        ",font=("Arial",9)).grid(row=lig,column=1,columnspan = 2)
    lig += 1
    Label(fen1, text="").grid(row=lig,column=1)
    lig += 1
    Label(fen1, text = 'Longueur du premier cote =',font=("Arial",9)).grid(row=lig,column=1)
    entr1.grid(row=lig,column=2)
    lig += 1
    Label(fen1, text = 'Longueur du deuxieme cote =',font=("Arial",9)).grid(row=lig,column=1)
    entr2.grid(row=lig,column=2)
    lig += 1
    Label(fen1, text="").grid(row=lig,column=1)
    lig += 1
    Label(fen1, text = '(Appuyez sur la touche ENTREE pour lancer ou relancer le calcul)',font=("Helvetica", 7,"italic")).grid(row=lig,column=1,columnspan = 2)
    lig += 1
    chain.grid(row=lig,column=1,columnspan = 2)
    lig += 1
    Label(fen1, text="").grid(row=lig,column=1)
    lig += 1
     
     
     
    # Pied du programme ----------------------------------------------------
    Label(fen1, text="").grid(row=lig,column=1)
    lig += 1
    Button(fen1,text='Quitter',command=fen1.quit).grid(row=lig,column=1,columnspan = 2)
    lig += 1
    Label(fen1, text="").grid(row=lig,column=1)
    lig += 1
     
     
    fen1.mainloop()         # démarrage du réceptionnaire d'événements
    fen1.destroy()          # destruction (fermeture) de la fenêtre

  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
    C'est bien pour cela que je vous parle d'un Canvas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
    fen1 = Tk()
    photo = PhotoImage(file="slade.gif")
    c = Canvas(fen1) 
    c.pack()
    c.create_image(0, 0, image = photo, anchor=NW)
    c.create_text(10, 10, text='TEST')
    fen1.mainloop()

  6. #6
    Membre chevronné Avatar de Bear the french
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations forums :
    Inscription : Mai 2012
    Messages : 352
    Par défaut
    Encore merci

    Je pensais les .grid plus simples mais en fait, ça fait presque moins de code avec la méthode du canvas et .place().



    Reste le problème d'affichage sur la transparence de la réponse.
    A mon avis, je vais finir par trouver à remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chain.place(anchor=CENTER,x=191, y=210)
    Bertrand

  7. #7
    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
    Pour l'affichage en transparence de la réponse il suffit de changer la valeur text d'un create_text.

    @+

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

Discussions similaires

  1. comment faire un background transparent?
    Par guigui1005 dans le forum Composants
    Réponses: 5
    Dernier message: 17/05/2012, 21h45
  2. [Débutant] trackbar avec background color transparent
    Par softcode dans le forum C#
    Réponses: 0
    Dernier message: 08/12/2011, 12h36
  3. Widget avec arrière-plan transparent
    Par Invité dans le forum Qt
    Réponses: 9
    Dernier message: 11/04/2011, 15h19
  4. Flash avec background transparent
    Par Paskalin dans le forum Intégration
    Réponses: 2
    Dernier message: 18/10/2009, 10h23
  5. Widgets à background transparent sur un Panel
    Par Lotendan dans le forum wxPython
    Réponses: 6
    Dernier message: 28/01/2009, 17h10

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