python, tkinter, gestion d'événements
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

python, tkinter, gestion d'événements



  1. #1
    Jack
    Modérateur

    python, tkinter, gestion d'événements


    ------

    Bonjour,

    j'ai besoin d'écrire une petite interface graphique en python avec le module tkinter (ce sont mes 1ères lignes en python, alors soyez indulgents). J'ai écrit un bout de code pour mettre en évidence un problème que je n'arrive pas à résoudre:
    Code:
    from tkinter import *
    from tkinter import tix
    
    def choix(evt):
        print(varcombo.get())
    
    mainWindow = tix.Tk()
    varcombo = tix.StringVar()
    comboBoxOption = tix.ComboBox(mainWindow, label="Choix:",editable=1, dropdown=1, variable=varcombo, command = choix)
    comboBoxOption.insert(0, "Option1")
    comboBoxOption.insert(1, "Option2")
    comboBoxOption.grid(row=1, column=1)
    
    
    mainWindow.mainloop()
    Lorsque je sélectionne un item dans la comboBox, l'événement est lancé 2 fois. Pourquoi?

    Merci pour votre attention

    -----

  2. #2
    invitecba2e9e4

    Re : python, tkinter, gestion d'événements

    slt Jack,

    dans l'API
    Command-Line Name: -command
    Database Name: command
    Database Class: Command
    Specifies the command to be called when the ComboBox is invoked or when the -value of the ComboBox is changed.
    Assez déroutant..

  3. #3
    Jack
    Modérateur

    Re : python, tkinter, gestion d'événements

    Merci pour ta réponse, mais pourrais-tu préciser ce qui est déroutant?

    Dans le programme, la fonction choix doit être appelée lorsque je sélectionne un item dans la liste, ce qui correspond à
    the -value of the ComboBox is changed
    C'est exactement ce que je veux pourtant.

  4. #4
    bisou10

    Re : python, tkinter, gestion d'événements

    Je le comprends comme ça (je ne connais pas python désolé):

    - se déclenche 1 fois sur le changement graphique (clic combo box)
    - se déclenche 1 fois sur la mise à jour de la valeur (sélection de ta nouvelle valeur)

    Sur certains RAD, je me souviens, précisement dans ce genre de cas, avoir dû:

    - soit mettre un flag updated pour éviter de rentrer plusieurs fois dans une méthode
    - soit changer l'évènement nécessaire (OnUpdate plutot que OnChange par exemple)

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : python, tkinter, gestion d'événements

    Citation Envoyé par bisou10 Voir le message
    (je ne connais pas python désolé):
    je me demande si le problème viens de python ou de tcl/tk ...

    se déclenche 1 fois sur le changement graphique (clic combo box)
    Ca ne semble pas être le cas car lorsque je clique sur la flèche qui fait apparaître le contenu de la comboBox, celui-ci apparaît normalement et aucun événement n'est généré. Il n'y a que lorsque je sélectionne l'item qu'un événement est lancé
    Dernière modification par Jack ; 28/10/2013 à 13h48.

  7. #6
    invitef35ebd48

    Re : python, tkinter, gestion d'événements

    Bonjour,

    (moi aussi je connais pas les lib graphique de python et j'ai une sainte horreur de ce langage...mais voici ce que j'ai trouvé)


    On dirait que l'option command te rattache à beaucoup (trop) d'évènements, chez moi je rentre dans la fonction choix lorsque :

    - j'ouvre la fenetre (instanciation ??? ,prise de focus de la combobox ????)
    - je clic-gauche sur une valeur (teste en maintenant le clic...tu vas voir qu'il y a un évènement à ce moment là)
    - je lâche le clic gauche ( si je lâche en dehors de la liste déroulante j'ai pas d'évènement et ma valeur est correctement changée)

    J'ai tenté d'enlever l'option command et de binder la combo sur l'évènement <<ComboboxSelected>>....mais il ne se passe rien.

    La raison doit être ailleurs ( et sacrément mal documentée)...bonne chance en tout cas

    ps : si tu mets les options dropdown=0 et selectionmode="immediate", tu auras bien un seul appel de "choix"...mais plus vraiment une combobox.

  8. #7
    Jack
    Modérateur

    Re : python, tkinter, gestion d'événements

    La doc n'est pas terrible en effet. J'ai galéré pour que le 1er item s'affiche dans la combo dès le départ (et encore je ne suis pas sûr que ce soit la bonne méthode).

    ps : si tu mets les options dropdown=0 et selectionmode="immediate", tu auras bien un seul appel de "choix"...mais plus vraiment une combobox.
    j'ai déja essayé de ce côté-là, mais sans résultat non plus.
    Moi qui avait l'habitude de faire des ihm avec C++ builder ou Qt, j'avoue que je suis un peu déçu. Mais je ne laisse pas abattre.

  9. #8
    invitecba2e9e4

    Re : python, tkinter, gestion d'événements

    slt,

    déroutant, ca veut pas dire mal documenté.
    Specifies the command to be called when the ComboBox is invoked or when the -value of the ComboBox is changed.
    ca veut dire:
    tu vas appeler ton callback choix, lorsque tu vas sélectionner un item de ta liste (donc en cliquant sur n'importe lequel des elements)
    +
    tu vas appeler ton callback choix, lorsque la valeur que tu as sélectionnée a changé (donc si elle valait Option 1 et que tu as cliqué sur Option2 par exemple)

    Il existe très probablement une API pour gérer ca, genre un inhibiteur de l'un des deux éléments.
    Mais au pire, tu peux t'en sortir en mémorisant la valeur sélectionnée, et en la comparant avec la nouvelle.

  10. #9
    invitecba2e9e4

    Re : python, tkinter, gestion d'événements

    si ca peut aider, j'ai un peu tripatouillé (je suis totalement novice en python)

    pompé depuis stack
    Dans le callback de onSelect, on a ev, mais je sais pas comment s'en servir ni ce que ca contient .
    import inspect est inutile.

    Et je passe pas par Tix mais par ttk. (sinon bind <<ComboboxSelected>> est pas détecté)
    http://docs.python.org/dev/library/tkinter.ttk.html

    Code:
    from Tkinter import Tk, StringVar
    import ttk
    import inspect
    
    class Application:
    
        def __init__(self, parent):
            self.parent = parent
            self.combo()
    
        def combo(self):
            self.box_value = StringVar()
            self.box = ttk.Combobox(self.parent, textvariable=self.box_value, 
                                    state='readonly')
            self.box['values'] = ('A', 'B', 'C')
            self.box.current(0)
            self.box.grid(column=0, row=0)
            self.box.bind('<<ComboboxSelected>>', self.onSelect)
        def onSelect(self, ev):
            print self.box.get()
    
    if __name__ == '__main__':
        root = Tk()
        app = Application(root)
        root.mainloop()

  11. #10
    invitecba2e9e4

    Re : python, tkinter, gestion d'événements

    Pendant que jy suis, avec Tix
    Code:
    from Tkinter import *
    import Tix as tix
    
    def selected(evt):
        print comboBoxOption.entry.get()
    mainWindow = tix.Tk()
    varcombo = tix.StringVar()
    comboBoxOption = tix.ComboBox(mainWindow, label="Choix:",editable=1, dropdown=1, variable=varcombo)
    comboBoxOption.insert(0, "Option1")
    comboBoxOption.insert(1, "Option2")
    comboBoxOption.grid(row=1, column=1)
    comboBoxOption.slistbox.listbox.bind('<ButtonRelease-1>', selected)
    
    mainWindow.mainloop()
    voir http://www.daniweb.com/software-deve...mbobox-problem
    keywords: Tix Combobox

  12. #11
    Jack
    Modérateur

    Re : python, tkinter, gestion d'événements

    Merci beaucoup, ça fonctionne.

    Je me demande si tkinter est la bonne solution...
    Je vais jeter un coup d’œil sur wxpython pour voir si c'est un peu mieux documenté.

  13. #12
    invite805ff73c

    Re : python, tkinter, gestion d'événements

    Malheureusement l'absence de doc ou la présence de doc incomplète ou pas claire semble être un problème récurrent dans le domaine OpenSource... C'est un peu compréhensible (qui a envie d'écrire tout ça?) mais c'est dommage car au niveau code source / logiciel il y a des trucs vraiment bien. Personnellement je me souviens avoir beaucoup ralé et passé du temps sur un problème avec GTK ou une des couches sousjacentes que je n'ai finalement pas pu résoudre.

Discussions similaires

  1. Python : pas moyen d'importer tkinter
    Par invitea7d2625c dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 10/09/2012, 14h26
  2. Evénements indépendants
    Par invite560f5def dans le forum Mathématiques du collège et du lycée
    Réponses: 5
    Dernier message: 29/12/2009, 18h18
  3. Réponses: 2
    Dernier message: 24/11/2009, 22h23
  4. Evènements indépendants
    Par invitef7f4347f dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 29/11/2007, 09h09
  5. Des Sciences de Gestion, ou de la Science appliquée aux Arts de gestion ?²
    Par invite5ecc4617 dans le forum [ARCHIVE] Psychologie / Sociologie
    Réponses: 3
    Dernier message: 06/01/2005, 19h42