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

Python Discussion :

Listbox non reconnue d'une fonction vers une autre [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Octobre 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2019
    Messages : 24
    Par défaut Listbox non reconnue d'une fonction vers une autre
    Bonjour à tous,

    Je rencontre une difficulté sur une listbox qui ne semble plus être reconnue quand je veux récupérer l'index ou l'utilisateur a cliqué.
    J'ai une première listbox qui contient des clients qui se trouve dans le corps principal du programme. Dés que l'utilisateur clique sur un client, je pars dans une fonction qui ouvre une nouvelle fenêtre ou s'affiche 2 nouvelles listbox l'une avec les noms et l'autre les ip des matériels actifs de ce clients. Dés que l'utilisateur clique sur une IP je pars sur une nouvelle fonction qui est chargée de récupérer cette ip pour aller se connecter à l'actif.
    Le souci, c'est qu'au clic sur l'ip, un message d'erreur dit que la liste n'est pas reconnue. Donc, je pense que la listbox ne passe pas d'une fonction vers une autre. J'essaie de comprendre pourquoi car ça fonctionne depuis le corps du programme.

    Je mets le code ci-dessous, épuré pour qu'il puisse fonctionner et reproduire le problème. Dans mon code de base mes clients et mes actifs sont dans des fichiers qui me permettent de remplir les listes.

    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
     
    from tkinter import *
     
    def selection_client(event):  #Fonction de selection du client et ouverture de son fichier materiel
         ###############################
         # ouverture fenetre materiel  #
         ###############################
         fenetre_materiel=Toplevel(master=fenetre)
         #########################################
         # recuperation de l'index dans la liste #
         #########################################
         choix = liste_clients.curselection()
         nom_client = liste_clients.get(choix)
         label_cli=Label(fenetre_materiel, text="Client "+nom_client, fg="blue",font="Helvetica 20 bold")
         label_cli.grid()
     
         #############################################
         # Mise en listbox des nom des materiels     #
         #############################################
         liste_nom_materiel=Listbox(fenetre_materiel)
         liste_nom_materiel.insert(0, "aaaa")
         liste_nom_materiel.insert(1, "bbbb")
         liste_nom_materiel.insert(2, "cccc")
         liste_nom_materiel.insert(3, "dddd")
         liste_nom_materiel.insert(4, "eeee")
         liste_nom_materiel.insert(5, "ffff")
         liste_nom_materiel.grid(row=1,column=0, sticky=W)
     
         ####################################################################################################################################################
         # Mise en listbox des IP des materiels parceque je n'ai pas encore compris comment faire tout dans une seule liste ou on peut extraire que l'ip    #
         ####################################################################################################################################################
         liste_ip_materiel=Listbox(fenetre_materiel)
         liste_ip_materiel.insert(0, "192.168.1.1")
         liste_ip_materiel.insert(1, "192.168.1.2")
         liste_ip_materiel.insert(2, "192.168.1.3")
         liste_ip_materiel.insert(3, "192.168.1.4")
         liste_ip_materiel.insert(4, "192.168.1.5")
         liste_ip_materiel.insert(5, "192.168.1.6")
         liste_ip_materiel.grid(row=1,column=2, sticky=W)
     
         ###################################
         # Clic sur le materiel choisis    #
         ###################################
         bouton_fermer = Button(fenetre_materiel, text = "Fermer", font="Helvetica 15", pady=10, command = fenetre.destroy)
         bouton_fermer.grid(row=24, column=3)
         liste_ip_materiel.bind('<ButtonRelease-1>', selection_materiel)
     
     
    def selection_materiel(event):  #Fonction de la selection de l'adresse IP du materiel
              choix = liste_ip_materiel.curselection()
              adresse_ip = liste_ip_clients.get(choix)
              print (adresse_ip)
     
     
    ##############################################
    #                                            #
    #    DEBUT PROGRAMME                         #
    #                                            #
    ##############################################
     
    #############################################
    #  Creation fenetre principale              #
    #############################################
    fenetre = Tk()
    label = Label(fenetre, text="Gestion clients")
    label.grid()
    bouton_quitter = Button(fenetre, text = "Quitter", command = fenetre.destroy)
    bouton_quitter.grid()
     
     
    ###################################
    # Mise en listbox des clients     #
    ###################################
    liste_clients = Listbox(fenetre)
    liste_clients.insert(0, "Toto")
    liste_clients.insert(1, "Titi")
    liste_clients.insert(2, "Tutu")
    liste_clients.insert(3, "Tata")
    liste_clients.grid()
     
     
    ###################################
    # Clic sur le client choisis      #
    ###################################
    liste_clients.bind('<ButtonRelease-1>', selection_client)
     
    fenetre.mainloop()
    Merci

  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,

    Citation Envoyé par cubanate Voir le message
    Donc, je pense que la listbox ne passe pas d'une fonction vers une autre. J'essaie de comprendre pourquoi car ça fonctionne depuis le corps du programme.
    Si vous comprenez pourquoi le code suivant ne fonctionne pas, vous pouvez facilement corriger votre problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def f():
         a = 1
     
    def g():
         print(a)
     
    f()
    g()
    Sinon, il va falloir reprendre votre tuto préféré et relire attentivement le chapitre qui parle de fonctions et de portée des variables.

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

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Octobre 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2019
    Messages : 24
    Par défaut
    wiztricks,

    Merci pour votre réponse.
    Je pense que j'ai assimilé le fait qu'une variable ne passe pas d'une fonction à une autre. Pour l'instant le seul cas ou j'ai eu besoin de "partager" une variable, j'ai utilisé le mode global. Pas très élégant je vous l'accorde, mais ça fonctionnait.
    Donc, là je pense qu'il faut passer la variable "a" en arguments quelque part. Mais j'avoue ne pas avoir encore compris, ou et comment. J'ai fait plusieurs tests, sans succès. Votre piste devrait me suffire pour comprendre. Je repotasse (re re re d'ailleurs) mon bouquin (Python 3 "Les fondamentaux du langage" chez ENI), je dors dessus et je vois demain si j'ai une lumière.
    Merci.

  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 cubanate Voir le message
    Donc, là je pense qu'il faut passer la variable "a" en arguments quelque part. Mais j'avoue ne pas avoir encore compris, ou et comment.
    Passer la variable créée par la fonction f à la fonction g donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def f():
         a = 1
         return a
     
    def g(a):
         print(a)
     
    a = f()
    g(a)
    Mais vos fonctions n'en sont pas: ce sont des "callbacks" appelés par tkinter lors d'un event et dont il n'a souvent que faire du retour.
    Et si vous ne pouvez pas récupérer l'objet créé par f pour le passer à g, il va falloir fabriquer une variable dont la durée de vie soit plus grande que celle des fonctions.
    Pour çà vous avez 2 solutions: les variables globales... puis quand vous en aurez un peu trop, vous apprendrez à les pousser/ranger dans des classes, histoire de partitionner l'espace "global" et mieux savoir qui modifie, dépend de quoi.

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

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Octobre 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2019
    Messages : 24
    Par défaut
    Bonjour wiztricks,

    Désolé pour ma réponse tardive.
    Merci pour votre retour et votre explication sur les passages d'arguments.
    Effectivement, je n'avais pas pigé le a = f().
    C'est un peu plus clair maintenant.
    Concernant les variables globales, c'est vrai que c'est bien pratique mais peu élégant.
    Cela dit, avant de me lancer sur le forum j'avais passé la seconde listbox sans trop y croire en mode global. Mais ça n'a pas fonctionné. J'en ai déduit (peut être à tord), que la listbox ne se comporte pas comme une variable.
    Je vais étudier la piste des classes.

    Merci encore.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Octobre 2019
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2019
    Messages : 24
    Par défaut
    Bonjour,

    J'ai tout revu en PyQT5 et j'ai bien avancé.
    Je clos donc ce sujet.

    Merci à tous pour votre aide.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 11/08/2011, 19h29
  2. copie d'une variable non reconnue dans une fonction
    Par paragoge dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 27/10/2009, 13h30
  3. Réponses: 7
    Dernier message: 15/05/2009, 23h13
  4. variable non reconnue dans une requête sql
    Par sanatou dans le forum C++
    Réponses: 3
    Dernier message: 13/12/2006, 17h43

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