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 :

Message reference before assignement mais je n'arrive pas à résoudre avec global


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    janvier 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : janvier 2022
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Message reference before assignement mais je n'arrive pas à résoudre avec global
    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
    def nbr_cat():
        def liste_creation():
            if temp == 0:
                print('t')
            else:
                valeur_temporaire = entry_1.get()
                liste_categorie.append(valeur_temporaire)
                entry_1.delete(0,END)
                print(liste_categorie)
                temp = temp-1
        global q
        q = entry_1.get()
        if q.isdigit():
            q = int(q)
            if q>0 and q<16:
                nbr_cat1 = q
                temp = q
                label1['text'] = "Choisissez le nom des catégories. "
                bouton_cat.pack_forget()
                entry_1.delete(0,END)
                bouton_cat2 = Button(frame1, text = '>', command = liste_creation)
                bouton_cat2.pack(side=RIGHT)
            else:
                y = showerror('r','ton nombre doit etre compris entre 1 et 15 compris')
                return nbr_cat
        else:
            y = showerror('r','seules les valeurs numérique sont accepter')
            return nbr_cat
     
    liste_categorie = []
    labels = []
    frame1 = Frame(main, bg = 'blue')
    frame1.pack()
    label1 = Label(frame1,text = "Choisir le nombre de catégories. ")
    label1.pack()
    entry_1 = Entry(frame1)
    entry_1.pack(side = LEFT)
    bouton_cat = Button(frame1, text = '>', command = nbr_cat)
    bouton_cat.pack(side=RIGHT)
    Ce que je ne comprends pas, c'est que sans la ligne temp = temp - 1, le programme fonctionne.

  2. #2
    Membre éclairé Avatar de LeNarvalo
    Homme Profil pro
    Amateur Python
    Inscrit en
    février 2014
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Amateur Python
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 382
    Points : 658
    Points
    658
    Par défaut
    Un "bonjour" serait le bienvenue !
    Un "merci d'avance" inespéré, donc...

    Je fais du code pourri, mais là tu me bats !

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    janvier 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : janvier 2022
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Pardon
    Bonjour,
    C'est dans quel sens que je fais du code pourri.
    Je le prends pas mal mais j'aimerais bien savoir ce qui fait que mon code est pourri.
    C'est la première fois que je fais une publication, j'ai pas l'habitude.
    Merci de ta compréhension

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    9 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 9 803
    Points : 26 738
    Points
    26 738
    Billets dans le blog
    1
    Par défaut
    Bonjour quand-même
    Citation Envoyé par Guillaume.59 Voir le message
    Ce que je ne comprends pas, c'est que sans la ligne temp = temp - 1, le programme fonctionne.
    La variable "temp" n'est pas globale au programme mais n'est pas non plus locale à la fonction (elle fait partie de la fonction "nbr_cat()") donc il faut l'indiquer dans la sous-fonction qui veut la modifier via nonlocal temp avant sa première utilisation. Accessoirement le global q lui ne sert absolument à rien.

    Citation Envoyé par Guillaume.59 Voir le message
    Je le prends pas mal mais j'aimerais bien savoir ce qui fait que mon code est pourri.
    On n'utilise pas les globales dans les langages. Ca rend le code illisible et ça génère 100 fois plus d'embêtements que ça ne résoud de problème. Exemple on lit la fonction qui modifie "liste_categorie" et "zut c'est quoi liste_categorie" et on met 10 ans à le trouver. Et ça casse l'indépendance des fonctions.

    Les fonctions possèdent des paramètres permettant de travailler de façon autonome. Si je veux calculer le carré d'un nombre, je peux écrire def carre(n): return n**2 et cette fonction me permettra de calculer le carré de n'importe quel nombre. Mais si j'écris def carre(): return liste_categorie**2 déjà donc il y a le "c'est quoi liste_categorie" et surtout si je veux calculer le carré de "truc" je l'ai dans l'os (ou alors je sauvegarde "liste_categorie", puis je copie "truc" dans "liste_categorie" etc bref ça devient... pourri).
    Plus donner à ses variables des noms identiques aux fonctions. Plus des commentaires indiquant ton idée. Attention, pas des commentaires "cons" style temp=temp-1 # Je décrémente temp ça ça ne sert absolument à rien. Plutôt des commentaires indiquant ce que va faire tel bloc d'actions.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 890
    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 : 18 890
    Points : 32 613
    Points
    32 613
    Par défaut
    Citation Envoyé par Guillaume.59 Voir le message
    Ce que je ne comprends pas, c'est que sans la ligne temp = temp - 1, le programme fonctionne.
    Sans cette ligne, le temp utilisé en ligne 3 pour évaluer temp == 0 n'est pas "local"... Si python trouve cette variable dans les espace de noms "englobants" (comment traduire outer scopes?)... ça marche.

    En ajoutant temp = temp - 1, on assigne un nouvel objet a temp en fonction de cette variable externe (à la fonction) mais c'est à vous de résoudre l’ambiguïté: assigner la valeur de temp à une variable locale ou déclarer votre intention de modifier la variable externe? A défaut, vous n'êtes pas clair et pan: message d'erreur.

    Pour le reste, relisez votre code! C'est un peu au petit bonheur la chance...

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

  6. #6
    Membre éclairé Avatar de LeNarvalo
    Homme Profil pro
    Amateur Python
    Inscrit en
    février 2014
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Amateur Python
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 382
    Points : 658
    Points
    658
    Par défaut
    Perso je ne comprends rien à votre script...
    Je me demande pourquoi créer une fonction imbriquée mais aussi pourquoi tester ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if temp == 0:
                print('t')
    Je me demande à quoi sert nbr_cat1, je me demande ce que fait return nbr_cat et pourquoi stocker un truc dans y = showerror('r','ton nombre doit etre compris entre 1 et 15 compris'), ...

    Sinon niveau esthétique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if q>0 and q<16:
                nbr_cat1 = q
                temp = q
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if 0<q<16:
                nbr_cat1 = temp = q
    Mais j'utiliserais plutôt ça à vrai dire pour faire ton test de validité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	try:
    		q = int(entry_1.get())
    		if q<1 or q>15:
    			showerror('r','ton nombre doit etre compris entre 1 et 15 compris')
    		#Reste du code ici...
    	except:
    		showerror('r','seules les valeurs numérique sont accepter')
    Après ça dépend des goûts de chacun...

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 890
    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 : 18 890
    Points : 32 613
    Points
    32 613
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Mais j'utiliserais plutôt ça à vrai dire pour faire ton test de validité
    On ne met pas de while True dans un callback.

    Citation Envoyé par LeNarvalo Voir le message
    Perso je ne comprends rien à votre script...
    Il faut essayer de deviner l'intention. A mon sens, l'utilisateur saisit un nombre N de catégories à saisir, puis on "boucle" N fois pour récupérer leur label et le stocker dans une liste.

    Il aurait été plus simple d'avoir une fenêtre de dialogue qui ajoute 2 Entry. Lorsqu'on en a saisie une et qu'on passe à la suivante on ajoute une 3ème Entry... jusqu'à ce que l'utilisateur clique sur le Button Valider. A ce moment, on récupère toutes les catégories saisies (et on n'a pas besoin de connaître leur nombre à l'avance (sauf si on veut le limiter à 15 auquel cas autant proposer 15 Entry.... et accepter que n'ombre d'entre elles soient vide lorsqu'on valide).

    Il y a certainement de meilleures idées d'inerface et d'interactions avec l'utilisateur... mais quand on débute on reste scotché à ce qu'on sait faire.

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

  8. #8
    Membre éclairé Avatar de LeNarvalo
    Homme Profil pro
    Amateur Python
    Inscrit en
    février 2014
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Amateur Python
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 382
    Points : 658
    Points
    658
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    On ne met pas de while True dans un callback.
    Pour éviter un freeze de la fenêtre ? Du coup pas de while q<1 or q>15 non plus ?

    PS : Avec un thread du coup ?

  9. #9
    Membre confirmé
    Avatar de Hominidé
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    juin 2018
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous

    Informations forums :
    Inscription : juin 2018
    Messages : 404
    Points : 603
    Points
    603
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Pour éviter un freeze de la fenêtre ? Du coup pas de while q<1 or q>15 non plus ?

    PS : Avec un thread du coup ?
    Bonjour,
    ... pour ne pas bloquer le mainloop()

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 890
    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 : 18 890
    Points : 32 613
    Points
    32 613
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Pour éviter un freeze de la fenêtre ? Du coup pas de while q<1 or q>15 non plus ?

    PS : Avec un thread du coup ?
    Dans un GUI, les threads ne sont pas fait pour çà. Pour le reste, si vous avez des difficultés à coder une solution, vous pourrez ouvrir une discussion (bien à vous) en postant le code que vous avez fait...

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

  11. #11
    Membre éclairé Avatar de LeNarvalo
    Homme Profil pro
    Amateur Python
    Inscrit en
    février 2014
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Amateur Python
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 382
    Points : 658
    Points
    658
    Par défaut
    Oui c'est vrai qu'on est pas face à un input(). My bad !

  12. #12
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    janvier 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : janvier 2022
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Remerciements
    Mon programme fonctionne même s'il ne sert à rien.
    Donc en dehors des critiques négatives, un grand merci à ceux qui m'ont aidé.

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    9 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 9 803
    Points : 26 738
    Points
    26 738
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guillaume.59 Voir le message
    Donc en dehors des critiques négatives, un grand merci à ceux qui m'ont aidé.
    Même négative, une critique est toujours bénéfique.

    Citation Envoyé par wiztricks Voir le message
    On ne met pas de while True dans un callback.
    En effet, vaut mieux y mettre while not False...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  14. #14
    Membre confirmé
    Avatar de Hominidé
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    juin 2018
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous

    Informations forums :
    Inscription : juin 2018
    Messages : 404
    Points : 603
    Points
    603
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guillaume.59 Voir le message
    Donc en dehors des critiques négatives,
    T'inquiète ! LeNarvalo c'est un peu le fou du roi* de ce forum... Il a le verbe bien perché, mais ce n'est pas un mauvais bougre.
    * devinez qui est le roi

  15. #15
    Membre éclairé Avatar de LeNarvalo
    Homme Profil pro
    Amateur Python
    Inscrit en
    février 2014
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Amateur Python
    Secteur : Santé

    Informations forums :
    Inscription : février 2014
    Messages : 382
    Points : 658
    Points
    658
    Par défaut
    Vu qu'il aimerait bien m'électrocuter chui pas sûr d'amuser beaucoup le roi.

  16. #16
    Membre confirmé
    Avatar de Hominidé
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    juin 2018
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous

    Informations forums :
    Inscription : juin 2018
    Messages : 404
    Points : 603
    Points
    603
    Billets dans le blog
    1
    Par défaut
    Je vois à quelle discussion tu fais allusion... J'étais d'ailleurs assez surpris que notre bon roi* sorte du domaine technique pour envoyer cette boutade. Ce qui me semble être une belle prouesse, vu le personnage.
    Au fond, derrière les pseudos, il y a de vrai personnes, avec des sensibilités distinctes. Et bien que l'on ne se connaisse pas, on partage la même passion. Et c'est ce qui nous réuni. Donc, longue vie à Python! Longue vie au roi! Longue vie à nous tous!

    *j'espère que l'on me tiendra pas rigueur de ce sobriquet. à ne surtout pas prendre au 1er degrés

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/10/2017, 09h22
  2. Réponses: 5
    Dernier message: 01/02/2010, 15h06
  3. Message d'erreur que je n'arrive pas à résoudre
    Par MAMIKA dans le forum MATLAB
    Réponses: 5
    Dernier message: 15/09/2008, 14h17
  4. c'est très simple mais je n'arrive pas
    Par info007 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/03/2008, 10h12
  5. [POO] Classe PHP super simple Mais j'y arrive pas
    Par mulbek dans le forum Langage
    Réponses: 10
    Dernier message: 17/03/2006, 16h33

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