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 :

problème avec un menu déroulant


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 2
    Points
    2
    Par défaut problème avec un menu déroulant
    Bonjour,

    je suis étudiante en prépa, et nous avons un projet informatique à mener à bien.
    Nous avons choisit de créer un logiciel d'identification floral,qui comprendrai une partie "création" pour ajouter une fleur à une base de données.
    Afin de rentrer certains critères de la fleurs, nous aimerions utiliser un menu déroulant.

    J'ai utiliser pour ça la fonction tix
    Mon menu déroulant marche bien lorsque je le créé seul
    Cependant, quand je l'intègre à notre fenêtre, le fait de sélectionner un choix dans le menu déroulant ne me renvoie plus la variable dans la fenêtre active de python, comme il est sensé le faire pour qu'on puisse la réutiliser plus tard....
    Je ne comprends pas pourquoi le simple fait de l'ajouter à la fenêtre entraîne le fait qu'il ne renvoi rien.


    Je vous joins un bout du programme, qui est à l'origine de mon problème... (il y a encore pas mal de truc à modifier dans le programme, on est au courant )
    En esperant que vous puissiez nous aider!! merci

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    liste_couleur = ['jaune','rouge','vert']
     
    from tkinter import *
    from tkinter import tix
     
     
     
     
     
    def ouvrir_fenetre_de_creation():
     
        fenetre_de_creation = tix.Tk()
        fenetre_de_creation.title('Création')
        fenetre_de_creation['bg'] = 'light blue'
        fenetre_de_creation.geometry('900x700+400+400')
     
        Nom_latin= Label(fenetre_de_creation, text = 'Nom latin')
        Nom_latin.grid(column = 1)
        Nom_latin.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Nom_vernaculaire= Label(fenetre_de_creation, text = 'Nom vernaculaire')
        Nom_vernaculaire.grid(column = 1)
        Nom_vernaculaire.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Couleur_petales= Label(fenetre_de_creation, text = 'Couleur des pétales')
        Couleur_petales.grid(column = 1)
        Couleur_petales.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
     
        Nombre_petales= Label(fenetre_de_creation, text = 'Nombre de pétales')
        Nombre_petales.grid(column = 1)
        Nombre_petales.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Petales= Label(fenetre_de_creation, text = 'Pétales')
        Petales.grid(column = 1)
        Petales.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Couleur_sepales= Label(fenetre_de_creation, text = 'Couleur des sépales')
        Couleur_sepales.grid(column = 1)
        Couleur_sepales.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Nombre_sepales= Label(fenetre_de_creation, text = 'Nombre de sépales')
        Nombre_sepales.grid(column = 1)
        Nombre_sepales.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Sepales= Label(fenetre_de_creation, text = 'Sépales')
        Sepales.grid(column = 1)
        Sepales.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Nombre_etamines= Label(fenetre_de_creation, text = "Nombre d'étamines")
        Nombre_etamines.grid(column = 1)
        Nombre_etamines.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Feuilles= Label(fenetre_de_creation, text = "Feuilles")
        Feuilles.grid(column = 1)
        Feuilles.config(height=2, width=20, bg='light blue',font=('andalus',15 , 'bold'))
     
        Vide=Label(fenetre_de_creation, text = "\t", width = 3)
        Vide.config(bg = 'light blue')
        Vide.grid(column = 2)
     
        Latin = Entry(fenetre_de_creation, bg ='white', fg='maroon', font=('andalus',15 , 'bold'))
        Latin.focus_set()
        Latin.grid(row = 0, column = 3)
     
        Vernaculaire = Entry(fenetre_de_creation, bg ='white', fg='maroon', font=('andalus',15 , 'bold'))
        Vernaculaire.focus_set()
        Vernaculaire.grid(row = 1, column = 3)
     
        def Affiche(evt):
            return (var.get())
        var= tix.StringVar() 
        comboBoxOption = tix.ComboBox(fenetre_de_creation, editable=0, dropdown=1, variable=var, command = Affiche)
        k = 0
        for x in liste_couleur :
            comboBoxOption.insert(k, x)
            k = k + 1
        comboBoxOption.grid(row=2, column=3)
     
        var= tix.StringVar() 
        comboBoxOption = tix.ComboBox(fenetre_de_creation, editable=0, dropdown=1, variable=var, command = Affiche)
        k = 0
        for x in liste_couleur :
            comboBoxOption.insert(k, x)
            k = k + 1
        comboBoxOption.grid(row=5, column=3)
     
    def ouvrir_fenetre_recherche():
     
        fenetre_recherche = tix.Tk()
        fenetre_recherche.title('Recherche')
        fenetre_recherche['bg'] = 'purple'
        fenetre_recherche.geometry('900x700+400+400')
     
    def ouvrir_fenetre_import():
     
        fenetre_import = tix.Tk()
        fenetre_import.title('Import')
        fenetre_import['bg'] = 'orange'
        fenetre_import.geometry('900x700+400+400') 
     
     
    Mafenetre = Tk()
    Mafenetre.title('identiflore')
    Mafenetre['bg'] = 'light green'
    Ouverture= Label(Mafenetre, text = "Bienvenue sur ce programme interactif \n d'identification florale !")
    Ouverture.config(height = 3, width = 800, bg='light green',font=('andalus',20 , 'bold'))
    Ouverture.pack()
     
    Mafenetre.geometry('800x600+400+400')
     
    BoutonCreation = Button(Mafenetre, text = 'CREATION', command = ouvrir_fenetre_de_creation)
    BoutonCreation.pack(side = LEFT, padx = 40, pady = 2)
    BoutonCreation.config(height=3, width=13, font=('comic sans ms',15 , 'bold'))

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

    Commencez par remplacer les appels à tix.Tk par des appels à tix.Toplevel. A chaque appel à *.Tk vous créez un nouvel interpréteur, ce qui n'a de sens que pour faire coexister des applications Tk différentes *et* va placer les variables Tk (xxxVar) dans des endroits inaccessibles.
    Il est tout à fait louable d'essayer de faire joli, mais vous devriez commencer par la maîtrise de l'enchaînement de vos boîtes de dialogues (ce qui se passe dans les différentes Toplevel et ce qui en sort): essayez de tirer profit du tutoriel d'effbot.
    Et revenez raler si vous ne vous en sortez pas.

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

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord, merci de votre réponse.

    Je ne sais pas si j'ai bien compris ce que vous m'avez conseillé, mais en remplace "tix.Tk()" par "tix.Toplevel()", j'obtiens un nouveau message d'erreur qui me dit :
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Python33\lib\idlelib\run.py", line 121, in main
    seq, request = rpc.request_queue.get(block=True, timeout=0.05)
    File "C:\Python33\lib\queue.py", line 175, in get
    raise Empty
    queue.Empty

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "C:\Python33\lib\tkinter\__init__.py", line 1475, in __call__
    return self.func(*args)
    File "C:/Users/drey/Documents/BCPST 2/projet info/pas toucher - Copie.py", line 73, in ouvrir_fenetre_de_creation
    comboBoxOption = tix.ComboBox(fenetre_de_creation, editable=0, dropdown=1, variable=var, command = Affiche)
    File "C:\Python33\lib\tkinter\tix.py", line 594, in __init__
    cnf, kw)
    File "C:\Python33\lib\tkinter\tix.py", line 322, in __init__
    self.tk.call(widgetName, self._w, *extra)
    _tkinter.TclError: invalid command name "tixComboBox"

    Je ne connais que très peu python du côté des interfaces, et j'apprends par moi même avec ce que je peux trouver sur internet....
    Je n'ai pas saisie toutes les subtilités du module "combobox", et comment l'utiliser...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par dreylb Voir le message
    Je ne sais pas si j'ai bien compris ce que vous m'avez conseillé, mais en remplace "tix.Tk()" par "tix.Toplevel()", j'obtiens un nouveau message d'erreur qui me dit "_tkinter.TclError: invalid command name "tixComboBox"".
    Il vous faut aussi remplacer (ligne 103) "Mafenetre = Tk()" par "Mafenetre = tix.Tk()"

    Citation Envoyé par dreylb Voir le message
    Je ne connais que très peu python du côté des interfaces, et j'apprends par moi même avec ce que je peux trouver sur internet.... Je n'ai pas saisie toutes les subtilités du module "combobox", et comment l'utiliser...
    Ah ben, il faut un peu connaître tkinter avant de se lancer dans Tix.
    Les bibliothèques sont là pour vous éviter d'avoir à ré-inventer la solution a des problèmes particuliers. Si vous débutez, vous ne connaissez pas bien le problème qu'on a cherché à résoudre, la solution proposée n'est pas facile à comprendre et on l'utilise de travers.


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

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    J'ai de nouveau un menu déroulant qui s'affiche, avec mes caractéristiques.
    Cependant, la sélection n'est toujours pas renvoyé sur la fenêtre active...

    J’espère être assez claire pour que vous compreniez mon problème.


    Nous n'avons pas eu de cours sur Tkinter, et c'est le moyen le plus simple que nous ayons trouvé pour réaliser notre interface. J’espère qu'on pourra s'en sortir quand même......

    En tout cas, merci de votre réactivité

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par dreylb Voir le message
    J'ai de nouveau un menu déroulant qui s'affiche, avec mes caractéristiques.
    Cependant, la sélection n'est toujours pas renvoyé sur la fenêtre active...
    Je ne comprends pas ce que vous voulez dire.
    Effacez tout et concentrez vous sur la combobox, ça se réduit à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import tkinter.tix as tix
     
    COLORS = ['jaune','rouge','vert']
     
    root = tix.Tk()
     
    def afficher(e):
        print ('afficher', e)
     
    combobox = tix.ComboBox(root, editable=0, dropdown=1, command=afficher)
    for k, s in enumerate(COLORS):
        combobox.insert(k, s)
    combobox.pack()
    tix.mainloop()
    Vous voudriez obtenir quoi?

    Citation Envoyé par dreylb Voir le message
    Nous n'avons pas eu de cours sur Tkinter, et c'est le moyen le plus simple que nous ayons trouvé pour réaliser notre interface. J’espère qu'on pourra s'en sortir quand même......
    Je ne puis que vous conseillez la lecture des chapitres correspondant du tuto de Swinnen. Programmez avec Tkinter n'est pas si intuitif et sans un minimum de repères vous allez vite être perdu.

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

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Quand je tape votre code seul, et que je sélectionne une couleur dans le menu déroulant, python renvoi "affiche rouge" (par exemple).

    Nom : capture.JPG
Affichages : 1293
Taille : 86,3 Ko




    Lorsque je sélectionne une couleur quand le programme est dans mon interface, python ne renvoi rien.

    Nom : capture2.JPG
Affichages : 1083
Taille : 78,6 Ko




    Est ce que c'est plus clair pour vous....?

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Salut,

    À qui (ou quoi) ton slot (fonction Affiche()) "retourne"-t-il ?

    À la combobox ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        def Affiche(evt):
            return (var.get())   ------------ retour à l appelant ? --------------------------------
                                                                                                    |
        var= tix.StringVar()                                                                        V
        comboBoxOption = tix.ComboBox(fenetre_de_creation, editable=0, dropdown=1, variable=var, command = Affiche)

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par dreylb Voir le message
    Quand je tape votre code seul, et que je sélectionne une couleur dans le menu déroulant, python renvoi "affiche rouge" (par exemple).
    ....
    Lorsque je sélectionne une couleur quand le programme est dans mon interface, python ne renvoi rien.
    ....
    En écrivant "print ('afficher', e)", on s'attend à ce que la console de l'interpréteur affiche un message lorsque la fonction "affiche" sera appelée. Ca ne fait rien de plus qu'indiquer que la fonction a bien été appelée par la combobox lorsqu'on change la sélection.
    Techniquement, cette fonction là s'appelle un "callback": elle est appelée lors d'une action de l'utilisateur sur le widget et non depuis votre code (sinon ce serait une fonction "normale" et impropre de l'appeler "callback").
    Et comme cette fonction là n'est pas appelée par votre code, impossible d'utiliser "return" pour récupérer quoi que ce soit.

    Et si ces notions là vous sont étrangères, je ne puis que ré-itérer:
    Citation Envoyé par wiztricks Voir le message
    Je ne puis que vous conseillez la lecture des chapitres correspondant du tuto de Swinnen. Programmez avec Tkinter n'est pas si intuitif et sans un minimum de repères vous allez vite être perdu.
    - W
    PS:
    Citation Envoyé par VinsS Voir le message
    Salut,

    À qui (ou quoi) ton slot (fonction Affiche()) "retourne"-t-il ?

    À la combobox ?
    Un "slot" n'est que l'emballage Qt d'un callback. Ici c'est un forum Tkinter.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Un "slot" n'est que l'emballage Qt d'un callback. Ici c'est un forum Tkinter.

    D'accord pour la terminologie, mais je suppose que cela ne change rien au problème du return, pareil avec TKinter, non ?

  11. #11
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    D'accord !
    C'est bon pour moi sur ce point!

    Merci beaucoup

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par VinsS Voir le message
    D'accord pour la terminologie, mais je suppose que cela ne change rien au problème du return, pareil avec TKinter, non ?
    Yes... mais je n'ai pu résister à vous chambrer un peu. Désolé.

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

Discussions similaires

  1. [PHP-JS] Problème avec un menu déroulant
    Par nsimon dans le forum Langage
    Réponses: 2
    Dernier message: 11/02/2007, 20h00
  2. [PHP-JS] Problème avec un menu déroulant
    Par grumly22 dans le forum Langage
    Réponses: 3
    Dernier message: 09/05/2006, 12h07
  3. problème avec un menu généré par MySQL
    Par GhostDady dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 30/03/2006, 11h45
  4. Problème avec un menu, sans utilisé de frame
    Par cyraile dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 19/01/2006, 18h57

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