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 :

Image Cliquable sur Canvas


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur en électronique
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en électronique
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Par défaut Image Cliquable sur Canvas
    Bonjour a tous,

    Je plante un peu le décor, j'utilise python 2.7 avec Tkinter et le tout sur Linux pour faire un petit logiciel de Gestion d'un Stock Perso.

    Pour l'instant, j'ai crée le Menu, et les images sur le Canvas mais je n'arrive pas du tout a les faire devenir Cliquable.


    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
    # -*- coding: utf-8 -*-
    from Tkinter import *
    from PIL import Image,ImageTk
    import tkMessageBox
     
     
    class FenPrincipale:
        def __init__(self):
            """Constructeur de la fenetre principale"""
            #Creation de la fenetre principale
            self.root = Tk()
            ##################################
     
     
            #Affichage fond et icone        
            self.can = Canvas(self.root, bd=10,relief=RIDGE)
     
            self.imgFond = PhotoImage(file="Images/Icones/font.gif")
            self.can.create_image(300,225,image=self.imgFond)        
     
            self.imageQuitter = Image.open("Images/Icones/Quitter.png")        
            self.imgQuitter = ImageTk.PhotoImage(self.imageQuitter)
            self.Quitter = self.can.create_image(100,100,image=self.imgQuitter)
     
            self.can.pack()
            ######################################################################
     
     
            # Affichage de la fenetre et bouclage
            self.root.mainloop()
            self.root.destroy()
            ##############################################
     
     
    # Programme principal
    if __name__ == '__main__':
        FenPrincipale()
    #########################"""
    J'ai tenté de faire un [...].bind([...]) ça n'existe pas avec une image.

    J'ai aussi tenté faire un bouton, intégré l'image dedans mais comme mon image est ronde, le tour reste gris comme le bouton est gris or le bouton ne gère pas la transparence.

    Puis j'ai pensé a réaliser un Frame qui serait devant tout le reste pour pouvoir obtenir les coordonnées x, y pour gérer les cliques mais la Frame n'est pas transparente et je n'arrive a la faire devenir transparente.

    Verdict, j'ai des idées mais rien ne fonctionne

    J'en viens donc a votre aide, comment feriez vous?

    Merci


    PS : Bien sur j'ai plus d'image normalement, la j'ai uniquement laissé celle pour quitter

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Si vous voulez rendre un item du canvas "clickabe", il faut lui associer des événements et des actions via .tag_bind. Et cela est, à priori, "valable" pour n'importe quel item crée dans le canvas.

    Dans la pratique, il faut stocker l'identifiant ou associer un tag à l'item créé par .create_XXX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deleteBtn = cnv.create_image(10, 10, image=icons('action_delete'))
    puis faire le .tag_bind... sur deleteBtn.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cnv.tag_bind(deleteBtn, '<1>', do_action_delete)
    Ici, çà dit d'appeler la fonction do_action_delete lorsqu'on clique sur mouse button 1

    Et voilà
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Développeur en électronique
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en électronique
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Par défaut
    Wow! Super efficace!

    Je demandais pas mieux qu'une seule ligne pour faire ce que je voulais

    Merci beaucoup wiztricks

    De la même façon, il n'existerait pas une commande pour changer l'apparence du pointeur de la souris lorsqu'elle passe sur l'image "clikable" ?

    le [...]create_image([...],cursor='fleur') ne fonctionne pas

    Merci encore

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par punky591 Voir le message
    De la même façon, il n'existerait pas une commande pour changer l'apparence du pointeur de la souris lorsqu'elle passe
    Le cursor est une option du widget/window (ici canvas).
    Si vous voulez changer l'apparence du "cursor" lorsqu'il passe sur certains items, "il suffit" d'associer des events/commandes à un "tag", ici "toggle_cursor":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cnv.tag_bind('toggle_cursor', '<Enter>', lambda e: cnv.configure(cursor = 'hand1'))
    cnv.tag_bind('toggle_cursor', '<Leave>', lambda e: cnv.configure(cursor=''))
    Puis d'associer ce tag aux items qui vous intéressent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deleteBtn = cnv.create_image(10, 10, image=icons('action_delete'), tag='toggle_cursor')
    Ici lors de la création mais cela peut être fait et défait à d'autres moments.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Développeur en électronique
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en électronique
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Par défaut
    Bonjour

    Encore une fois... Merci!

    Ça fonctionne exactement comme je le veux

    Très bonne explication wiztricks

    D'ailleurs, comment savez-vous tout cela? Il existe un site ou tout est répertorié? Ou puis-je apprendre tout cela?

    Le seul truc bien que j'ai trouvé c'est ca : http://www.tutorialspoint.com/python/tk_canvas.htm

    Dans le cas présent, ça explique les options du Canvas, mais rien de ce que vous m'avez montré.

    Comment se procurer de telles informations?

    Merci encore

    Bonne journée!

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    D'ailleurs, comment savez-vous tout cela? Il existe un site ou tout est répertorié? Ou puis-je apprendre tout cela?

    Dans le cas présent, ça explique les options du Canvas, mais rien de ce que vous m'avez montré.
    Sur le wiki de python.org sont répertoriées la plupart des documentations/tutoriels sur tkinter.

    Je n'ai pas de recommandation particulière: çà dépend de ce que vous voulez faire et de votre "background".

    Personnellement, lorsque je cherche quelque chose, je regarde plutôt Tkinter reference: a GUI for Python et surtout le manuel TCL/Tk

    Mais cela ne vous montre pas comment "utiliser" les widgets, pour cela il faut lire des codes déjà écrits ou des exemples: effbot est pas mal, le tutorial de tkdocs est aussi très bien.
    Vous avez aussi des contributions genre http://tkinter.unpythonic.net/wiki/ ou encore des codes écrits en TCL à l'url

    Bon courage
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Homme Profil pro
    Développeur en électronique
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en électronique
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Par défaut
    Bonsoir

    Comme je vous l'avais dit, j'ai terminé la partie graphique, mais j'ai maintenant un petit problème a base de texte.

    En fait mon programme est pas compliqué, j'ajoute des éléments saisie dans un 'Entry' puis je les supprimes ( le jour ou j'en ai plus besoin ) en le sélectionnant a partir d'un combobox.

    Voici mon code réduit pour que vous compreniez

    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
    85
    86
    87
    88
    89
    90
    # -*- coding: utf-8 -*-
     
     
     
    import Tkinter as Tk
    from PIL import Image,ImageTk       #sudo apt-get install python-imaging-tk
    import tkMessageBox
    import Tix                          #sudo apt-get install tix
    import ttk
    import sqlite3
     
     
    class FenRangement(Tix.Tk):
        def __init__(self,event=None):
            Tix.Tk.__init__(self)
            self.initialize()
            self.mainloop()
        def initialize(self):        
            #Creation de la fenetre principale
            self.title('Rangement')
            self.geometry("%dx%d+%d+%d" %(180,250,((self.winfo_screenwidth()-180)/2),((self.winfo_screenheight()-250)/2)+58))
            self.resizable(width=False, height=False)
            ##################################
     
            #Affichage fond et icone
            self.can = Tix.Canvas(self,width = 180, height = 250, bd=10,relief=Tix.RIDGE)
     
            self.can.create_text(90,30,text="Rangements disponible :",fill='black',font='Times 11')
            self.varcombo = Tix.StringVar()
            self.comboR = Tix.ComboBox(self.can, editable=1, dropdown=1, variable=self.varcombo,relief=Tix.GROOVE)
            self.comboR.entry.config(state='readonly')## met la zone de texte en lecture seule
            self.comboR.subwidget( "slistbox" ).config( width = 9 )
            self.comboR.subwidget("label" ).destroy()
            self.comboR.place(x=15,y=60,width=150)
     
            Tix.Button(self.can,text="Supprimer",command=self.suppression).place(x=43,y=110,width=95)
            self.EntryAjouter = Tix.Entry(self.can)
            self.EntryAjouter.place(x=15,y=160,width = 150)
            Tix.Button(self.can,text="Ajouter",command=self.ajout).place(x=20,y=200,width=70)
            Tix.Button(self.can,text="Fermer",command=self.fermer).place(x=90,y=200,width=70)
            self.can.pack()
            ########################
     
            #Remplissage combobox
            self.rempcombobox()
            #####################
     
        def rempcombobox(self): # Remplissage de la Combobox
            self.BDD = sqlite3.connect("StockBDD.sq3")  # Connection a la BDD
            self.BDDcurseur = self.BDD.cursor()         # Création du curseur
            try:                                                                # Test si BDD existante
                self.BDDcurseur.execute("SELECT emplacement FROM rangements")
                for i in self.BDDcurseur:
                    self.comboR.insert(Tix.END,i)
            except:                                                             # Création de la BDD le cas échéant
                self.BDDcurseur.execute("CREATE TABLE rangements ( emplacement TEXT )")
     
        def fermer(self):   # Permet d'enregistrer les changement de la BDD puis fermer la fenetre
            self.BDD.commit()
            self.BDDcurseur.close()
            self.BDD.close()
            self.destroy()
     
        def suppression(self):      #suppression de l'élément selectionné dans la liste et de l'entry puis de la BDD
            txtsuppression = self.varcombo.get()
            if txtsuppression is not "":
                self.comboR.entry.config(state='normal') # Suppression du text dans l'entry
                self.comboR.subwidget_list['entry'].delete(0,Tix.END) #IDEM
                self.comboR.entry.config(state='readonly')#END
                try: # test dans le cas ou l'élément à supprimer l'a déjà été
                    self.BDDcurseur.execute("DELETE FROM rangements WHERE emplacement=(?)",(txtsuppression,))        # Suppression de l'élement selectionné dans la BDD
                    self.indexsupp = self.comboR.subwidget_list['slistbox'].subwidget_list['listbox'].curselection() # Suppression de la valeur dans la listbox
                    self.comboR.subwidget_list['slistbox'].subwidget_list['listbox'].delete( first=self.indexsupp , last=None )#IDEM
                except:
                    tkMessageBox.showerror("Erreur","Impossible de supprimer l'élément. \n (Elément déjà supprimé?)",parent=self)
            else:
                tkMessageBox.showerror("Erreur","Veuillez saisir un rangement a supprimer",parent=self) #Aucune selection
     
        def ajout(self):    # ajout d'un nouvel élement
            txtajout = self.EntryAjouter.get() 
            if txtajout is not "":
                self.BDDcurseur.execute("INSERT INTO rangements( emplacement ) VALUES(?)",(txtajout,))  # ajout a la BDD
                self.comboR.insert(Tix.END,txtajout)                                                    #ajout dans la listbox
                self.EntryAjouter.delete(0,Tix.END)                                                     #effacement de l'entry
     
            else:
                tkMessageBox.showerror("Erreur","Veuillez saisir un rangement a ajouter",parent=self)
     
    if __name__ == "__main__":
        FenRangement()
    Lorsque je rentre un mot( 'Boite' par exemple ), que je ferme ma fenêtre ( donc que ça s'enregistre dans la BDD), que je la rouvre, puis que je le sélectionne dans la combobox, que je le supprime ; puis que je referme, et rouvre pour voir, tout va bien le mot n'est plus la.

    Mais par contre, lorsque je rentre 2 mots ('Boite Noire' par exemple), que je ferme la fenêtre ( ca s'enregistre encore ), que je rouvre, que je les sélectionnes dans la combobox (Déjà la, ils sont entouré d'accolades , ça commence mal ), puis que je les supprimes, ça ne fonctionne plus...

    Mon avis, est que je ne peux pas supprimer car mon programme cherche dans le cas ci dessus '{Boite Noire}' au lieu de 'Boite Noire' ; Forcement il ne le trouve pas, donc il ne le supprime pas.

    Je suppose que le problème viens au moment ou la combobox est remplie ( méthode rempcombobox ) mais alors pourquoi ça fait ça je ne sais pas.

    J'en viens donc a vous

    Merci d''avance

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Je suppose que le problème viens au moment ou la combobox est remplie ( méthode rempcombobox ) mais alors pourquoi ça fait ça je ne sais pas.
    Ayant écrit "SELECT emplacement FROM rangements" vous pourriez espérez recevoir une liste de "string"... En fait, SELECT remonte toujours une liste éventuellement vide de "rows". Et ces rows sont des "tuple".

    Pratiquement, ce n'est pas 'Boite Noire' mais ('Boite Noire', ) qui est passée à .insert. Pourquoi TK s'arrange-t-il mieux de ('Boite', ) que de ('Boite Noire', )? En première approximation, je dirais "garbage in => garbage out"...

    Tout çà pour dire qu'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        def rempcombobox(self): # Remplissage de la Combobox
            self.BDD = sqlite3.connect("StockBDD.sq3")  # Connection a la BDD
            self.BDDcurseur = self.BDD.cursor()         # Création du curseur
            try:                                                                # Test si BDD existante
                self.BDDcurseur.execute("SELECT emplacement FROM rangements")
                for i in self.BDDcurseur:
                    self.comboR.insert(Tix.END,  i[0])
            except:                                                             # Création de la BDD le cas échéant
                self.BDDcurseur.execute("CREATE TABLE rangements ( emplacement TEXT )")
    devrait le faire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre averti
    Homme Profil pro
    Développeur en électronique
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en électronique
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Par défaut
    En effet j’espérais recevoir une liste de string ; Cela fonctionne très bien comme vous l'avez dit, même si cela me surprend tout de même qu'il faut indiquer 'l'indice' de ce qu'on veut.

    Enfin bref, comme d'habitude, merci beaucoup pour votre aide, je cherchais depuis le début d’après-midi plutôt vers le formatage de la chaîne en string mais sans succès, j'obtenais des '(Boite Noire',) , je trouvais ça encore plus loin que ce que je voulais

    Merci beaucoup, bonne soirée a vous

  10. #10
    Membre averti
    Homme Profil pro
    Développeur en électronique
    Inscrit en
    Mai 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur en électronique
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 28
    Par défaut
    Bonsoir wiztricks et tout le monde

    Aujourd'hui, encore un nouveau petit problème , voici un petit code qui en dira beaucoup :

    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
     
    import Tkinter as Tk
    import Tix
     
     
    class FenRangement(Tix.Tk):
        def __init__(self,event=None):
            Tix.Tk.__init__(self)
            self.initialize()
            self.mainloop()
        def initialize(self):
     
            self.varcombo = Tix.StringVar()
            self.comboR = Tix.ComboBox(self, editable=1, command = self.clic, variable=self.varcombo,relief=Tix.GROOVE)
            self.comboR.place(x=15,y=60,width=150)
            self.comboR.insert(Tix.END,'Un clic')
     
        def clic(self,event=None):
             print "1 clic"
     
     
    if __name__ == "__main__":
        FenRangement()
    En fait, lorsque je clique sur 'un clic' dans le menu déroulant, j'appelle 2 fois la méthode 'clic'. Une fois a l'appuie sur le bouton de la souris, et une autre fois au relâchement du bouton.
    Or bien sur, je ne souhaite qu'un seul appel de la fonction.
    J'ai bien tenté un bind (<Button-1>,self.clic) mais la fonction n'est même pas appelé.
    J'ai tenté quelque autre truc qui n'ont pas fonctionné non plus.
    Le comportement de la combobox m'impressionne quand même, c'est pratique de 'capter' le clic et le relâchement mais lorsque l'on en souhaite qu'un, c'est pas pratique du tout )

    Autre chose, connaissez-vous un moyen de supprimer l'intégralité du contenu d'un TreeView de façon rapide?

    D'avance, Merci beaucoup pour votre aide, c'est vraiment sympa de votre part d'aider les gens du forum. Merci a vous.

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Voilà une question qu'elle est bonne!

    Je n'ai pas eu la chance d'avoir à pratiquer ce widget.
    De fait, il est "compliqué".
    Pour comprendre "comment l'utiliser", il faut se mettre en situation "que faire avec" (des cas d'utilisation) et voir comment l'API proposée nous permet de résoudre le problème simplement.

    Dit autrement, ok, ce comportement est "strange"...
    Mais au delà, est ce que cela vous handicape pour faire quelque chose de particulier? Et/ou est ce que la méthode que vous vous proposez pour traiter le cas d'utilisation est "en ligne" avec ce que propose le widget?

    Je vous suggère de poser la question directement dans le forum: un lecteur inspiré aura peut être une réponse plus satisfaisante.

    Pour ttk.Treeview, c'est plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tv.delete(*tv.get_children(''))
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    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
    Et une petite explication sur ceci:

    Citation Envoyé par punky591 Voir le message
    J'ai bien tenté un bind (<Button-1>,self.clic) mais la fonction n'est même pas appelé.
    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
    import Tkinter as Tk
     
     
    def OnClic(event):
        print event.widget
     
    root = Tk.Tk()
    f = Tk.Frame(root, bg='red')
    l = Tk.Label(f, text='Clic on me !')
    l.pack(padx=5, pady=5)
    f.pack()
    l.bind('<1>', OnClic)
    f.bind('<1>', OnClic)
    print f
    print l
    root.mainloop()
    Si l'on considère que f est ici notre Combobox et l un de ses subwidgets vous remarquerez vous devez cliquer sur le rouge (que vous voyez grâce aux padx/pady) pour que le bind sur f soit effectif.
    Pour 'propager' le bind on utilise bind_all
    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
    import Tkinter as Tk
     
     
    def OnClic(event):
        print event.widget
     
    root = Tk.Tk()
    f = Tk.Frame(root, bg='red')
    l = Tk.Label(f, text='Clic on me !')
    l.pack(padx=5, pady=5)
    f.pack()
    f.bind_all('<1>', OnClic)
    print f
    print l
    root.mainloop()
    C'est le même principe pour Tix.Combobox: Les subwidgets sont 'au dessus'
    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
    import Tkinter as Tk
    import Tix
     
     
    class FenRangement(Tix.Tk):
        def __init__(self,event=None):
            Tix.Tk.__init__(self)
            self.initialize()
            self.mainloop()
     
        def initialize(self):
            self.varcombo = Tix.StringVar()
            self.comboR = Tix.ComboBox(self, editable=1, variable=self.varcombo,
                                       relief=Tix.GROOVE, selectmode=Tix.BROWSE,
                                       browsecmd=self.clic)
            self.comboR.place(x=15, y=60, width=150)
            self.comboR.bind_all('<1>', self.OnClic)
            self.comboR.insert(Tix.END,'Un clic')
            self.comboR.insert(Tix.END,'Deux clics')
            self.comboR.insert(Tix.END,'Trois clics')
     
        def OnClic(self, event):
            print event.widget
     
        def clic(self, event=None):
             print "clic"
     
     
    if __name__ == "__main__":
        FenRangement()
    @+

Discussions similaires

  1. Éparpiller images cliquables sur la page
    Par Alex-L dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 15/01/2011, 13h16
  2. [MySQL] Mettre une image cliquable sur un lien en PHP
    Par qmike dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/07/2010, 12h54
  3. Image cliquable sur écran tactile
    Par vincenze2000 dans le forum Java ME
    Réponses: 3
    Dernier message: 17/01/2009, 17h13
  4. Réponses: 1
    Dernier message: 05/08/2006, 20h43
  5. [Tkinter] Insérer une image jpg sur un canvas avec PIL
    Par Kyojimbo dans le forum Tkinter
    Réponses: 2
    Dernier message: 23/02/2006, 16h46

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