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

  1. #21
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Encore une fois, très efficace!

    J'avais tenté(self,"Info","Blabla") mais pas dans ce sens la

    Enfin bref merci beaucoup

  2. #22
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Bonjour Bonjour

    Je vous rassure j'ai bientôt terminé la partie graphique, ça sera ma dernière question a ce sujet! ( Normalement )

    Avez vous déjà eu l'occasion de devoir utiliser dans vos Applications des tableau?

    Ce que j’entends par tableau ce serait pas un tableau excel mais plutôt un tableau que l'on puisse sélectionner ligne par ligne comme une listbox mais a plusieurs colonne en fait?

    Parce que je cherche a faire un tableau mais je ne trouve pas vraiment de 'truc' tout fait. J'ai pensé mettre plusieurs listbox les une a coté des autres puis de trouver une solution pour sélectionner toute les lignes dans le cas ou j'en sélectionne une des listbox mais c'est un peu une usine a gaz

    Donc j'en reviens a vous Comment feriez-vous?

    L'utilisation que j'en aurait sera pour lister des désignations de composants avec leur caractéristiques/quantité/prix/etc... si ça peut vous aider a comprendre

    Merciiiii

  3. #23
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    Par défaut
    Salut,

    Je n'ai peut être pas tout compris mais le widget Treeview devrait répondre tout ou partie à cela.

    Cordialement,
    - W

  4. #24
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Bonsoir,

    J'avais trouvé pas mal de truc dans le même genre mais ça demandait a chaque fois d'importer encore un nouveau truc qui n'est pas Tk.

    Celui la me plaît bien Merci!

    J'ai eu un peu de difficulté a trouver comment l'utiliser mais ça fonctionne comme je le veux c'est bon

    La partie graphique est maintenant terminée. Je vais passer a la base de données!

    Merci beaucoup pour toute votre aide jusqu’à présent, ça m'a été d'une très grande utilité, merci beaucoup

  5. #25
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    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

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    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

  7. #27
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    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

  8. #28
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    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.

  9. #29
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 313
    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 313
    Points : 36 819
    Points
    36 819
    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

  10. #30
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Bonsoir Bonsoir

    A vrai dire, le combobox permet d'afficher dans la treeview les valeurs correspondantes au choix de la combobox. Comme la treeview, est effacée a chaque appel je ne le vois pas donc ca me va

    Aujourd'hui je cherche a comprendre le joker en python :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a=220
    if str(a) == str(22) + "*":
        print "Egal"
    else:
        print "Différent"
    Il n'est pas censé m'afficher 'Egal'? Comment fonctionne le joker en python, je crois que je n'ai pas tout compris

    J'ai tenté des \* et d'autre chose sans succes, et sur google, essayé de mettre '* python' pour voir Il vous met tout ce qui fin par 'python'

    Merci d'avance

  11. #31
    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
    Bonjour,

    Vous travaillez ici sur des string et '22' + '*' cela donne '22*'
    Vous comprendrez bien que '220' est définitivement différent de '22*'.
    Si vous voulez faire des comparaisons vous devez passer par les méthodes de l'objet string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> '22*'.startswith('22')
    True
    >>> '22*'.endswith('2*')
    True
    >>> a = '220'
    >>> b = str(22) + "*"
    >>> a[:2]
    '22'
    >>> a[:2] == b[:2]
    True
    Pour quelque chose de plus 'compliqué' vous pouvez vous tourner vers re.

    C'est le *tv.get_children('') de wiztricks qui vous gène ? * est utilisé ici pour envoyer un tuple des résultats de .get_children('') à .delete.
    Voici un exemple basé sur le fait qu'en Python 3 print est une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> l = [0, 1, 2, 3]
    >>> print(*l)
    0 1 2 3
    >>> s = 'abcd'
    >>> print(*s)
    a b c d
    Vous trouverez pas mal de doc sur le sujet, y compris dans la doc sur les fonctions en python pour ce qui est des arguments à longueur variable (* et **).

    @+

  12. #32
    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
    Bonjour,

    Les 'Widgets' Tix sont composites et tout command est passé aux subwidgets.

    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
    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)
            [w.bind('<1>', self.clic1) for w in self.comboR.subwidgets_all() if isinstance(w, Tix._dummyListbox)]
            self.comboR.place(x=15,y=60,width=150)
            self.comboR.insert(Tix.END,'Un clic')
     
        def clic(self,event=None):
             print "1 clic"
     
        def clic1(self,event=None):
             print "1 clic..."
     
    if __name__ == "__main__":
        FenRangement()
    @+
    [w.bind('<1>', self.clic1) for w in self.comboR.subwidgets_all() if isinstance(w, Tix._dummyListbox)]
    self.comboR.subwidget("listbox").bind('<1>', self.clic1)

  13. #33
    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
    Bonjour,

    Quelques petits print/after pour voir ce qui se passe:
    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
     
    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)
            for w in self.comboR.subwidgets_all():
                if hasattr(w, 'command'):
                    print w
            #self.comboR.deletecommand(*self.comboR._tclCommands)
            self.comboR.place(x=15,y=60,width=150)
            self.comboR.insert(Tix.END,'Un clic')
            self.comboR.insert(Tix.END,'Deux clics')
            self.comboR.insert(Tix.END,'Trois clics')
     
        def clic(self,event=None):
             print "clic"
             self.after(1000)
     
     
    if __name__ == "__main__":
        FenRangement()
    On vois bien que command est stocké dans .
    Le blocage par after nous montre bien deux events: La sélection dans la Lisbox et l'insertion dans le Label. De même si le contenu de la Listbox ne change pas nous auront qu'un seul 'clic'.
    le deletecommand montre bien les deux events et un seul callback (la fonction 'clic') stocké.

    @+

  14. #34
    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
    Petit bonus:

    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
    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.insert(Tix.END,'Un clic')
            self.comboR.insert(Tix.END,'Deux clics')
            self.comboR.insert(Tix.END,'Trois clics')
     
        def clic(self,event=None):
             print "clic"
     
     
    if __name__ == "__main__":
        FenRangement()
    BINDINGS

    [1]
    If the -selectmode is "immediate", when the user enters a keystroke, clicks on an item or drags the mouse pointer in the listbox, the -value of the ComboBox will be immediately set to this item and the -command procedure will be called.

    [2]
    If the -selectmode is "browse", when the user enters a keystroke, clicks on an item or drags the mouse pointer in the listbox, the -selection of the ComboBox will be immediately set to the new content of the entry subwidget; also the -browsecmd procedure will be called. The -value option will be changed only when the user invokes the ComboBox (see [3] below). If the user presses the <Escape> key at any time, any new -selection will be ignored and the text inside the entry subwidget will be restored to the current -value of the ComboBox.

    [3]
    If the -dropdown option is true, the user can invoke the ComboBox by releasing the left mouse button over the desired item in the listbox. If the -dropdown option is false, the user can invoke the ComboBox by double-clicking over the desired item in the listbox. In both cases, the user can also invoke the listbox by pressing the <Return> or <Tab> key inside the entry subwidget, or switching the input focus to another widget inside the same toplevel widget

  15. #35
    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
    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()
    @+

  16. #36
    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
    Un autre fait que le bind ne fonctionne pas: Tix.Combobox hérite de TixWidget qui lui même hérite de Tkinter.Widget (et donc de Misc). Il a donc les options hérités mais pas d'"existence physique" à l'écran. Seuls les subwidgets sont des objets graphiques tcl/tk.
    Difficile de faire un clic sur quelque chose qui n'est pas à l'écran...
    (Annule le post plus haut )

  17. #37
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Bonjour tout le monde

    J'ai terminé le programme que je voulais faire, merci a ceux qui m'ont aidé dans le développement de celui ci, ça aurait été beaucoup plus compliqué (et très long!) sans votre aide

    Bien sur, il y a eu quelque surprise quand j'ai commencé a rentrer mon stock mais maintenant tout fonctionne très bien.

    Le prochain programme, je m'attaque a un port série virtuel ( Via USB )

    Sur ce, bonne journée

    PS : Merci PauseKawa pour ces nombreuses explications. J'ai corrigé pas mal de ligne

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