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 :

Aide sur erreur variable referenced before assignment


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 145
    Par défaut Aide sur erreur variable referenced before assignment
    Bonjour,

    J'ai un petit souci.

    J'ai crée un script qui permet de générer des horaires d'utilisations pour un pc, grâce a os.system et la commande dos : net user /times.

    Le script fonctionne à partir du moment ou il y a une heure d'entrée mais malgré le if qui qui dit que 's'il n'y a pas d'horaire il doit tout ouvrir', cette commande ne fonctionne pas et me met l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
        return self.func(*args)
      File "C:/Documents and Settings/s.pillot/Mes documents/Pyton prog/horairesfinaux.py", line 50, in nom
        a=os.system(commande)
    UnboundLocalError: local variable 'commande' referenced before assignment
    Je pense comprendre que la variable dysfonctionne mais ce qui est bizarre c'est que pour les autres if, ca ne pose pas de problème.

    De plus, je dois avoir les yeux bouchés car ca fait une heure que je regarde et que je ne vois pas ce qui cloche. Je fais donc appel à vous avec un regard neuf pour m'aider à debbuger.

    Voici mon code :
    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    # -*- coding: cp1252 -*-
    from Tkinter import *
    import os
    from ScrolledText import *
    
    #definition du traitement
    def nom():
        global b
        nom=ent1.get()
        lundi=ent2.get()
        mardi=ent3.get()
        mercredi=ent4.get()
        jeudi=ent5.get()
        vendredi=ent6.get()
        samedi=ent7.get()
        dimanche=ent8.get()
    
        # seulement le lundi
        if lundi:
            commande="net user "+nom+" /times:L," +lundi+" 2>rep.txt"
            #print commande
        # seulement mardi
        if mardi:
            commande="net user "+nom+" /times:Ma,"+mardi+" 2>rep.txt"
            #print commande
        # seulement mercredi
        if mercredi:
            commande="net user "+nom+" /times:Me,"+mercredi+" 2>rep.txt"
            #print commande
        # seulement jeudi
        if jeudi:
            commande="net user "+nom+" /times:j,"+jeudi+" 2>rep.txt"
            #print commande
        # seulement vendredi
        if vendredi:
            commande="net user "+nom+" /times:v,"+vendredi+" 2>rep.txt"
            #print commande
        # seulement samedi
        if samedi:
            commande="net user "+nom+" /times:s,"+samedi+" 2>rep.txt"
            #print commande
        # seulement dimanche
        if dimanche:
            commande="net user "+nom+" /times:d,"+dimanche+" 2>rep.txt"
            #print commande
        # si pas de données
        if not lundi and not mardi and mercredi and jeudi and vendredi and samedi and dimanche:
            commande="net user "+nom+" /times:all 2>rep.txt"
            print commande
        a=os.system(commande)
        b=open('rep.txt','r')
        result()
    
    #définition reinitialiser
    def reinitialiser():
        global b
        nom=ent1.get()
        commandere="net user "+nom+" /times:all 2>rep.txt"
        #print commandere
        a=os.system(commandere)
        b=open('rep.txt','r')
        result()
    
    def result():
        fen1=Toplevel()
        fen1.title("Résultat")
        texte = ScrolledText(fen1, width = 75, height = 5, font = "Arial 10",
        relief = "groove")
        texte.pack()
        #Ecriture des données
        texte.config(state = NORMAL)    #Permettre l'écriture
        texte.insert("1.0", b.readlines())          #Gestion de l'insertin des lignes
                                        #1 = 1ere ligne  0 = 1er caractere de la ligne
        texte.config(state = DISABLED)  #Interdire les modifications
        #Remettre à zero les entrées
        ent1.delete(0,END)
        ent2.delete(0,END)
        ent3.delete(0,END)
        ent4.delete(0,END)
        ent5.delete(0,END)
        ent6.delete(0,END)
        ent7.delete(0,END)
        ent8.delete(0,END)
        b.close()
        bou4=Button(fen1,text='Fermer',command=fen1.destroy)
        bou4.pack()
    
    #Fenêtre principal
    fen=Tk()
    fen.title('Horaires V1.0 par S.Pillot')
    text1=Label(fen,text='Entrer le nom de la session a limiter : ',fg='red')
    text1.grid(column=0,row=0)
    ent1=Entry(fen)
    ent1.grid(column=1,row=0)
    text2=Label(fen,text='Entrer les heures permises selon le modèle suivant : 13:00-20:00')
    text2.grid()
    text3=Label(fen,text='Lundi',fg='red')
    text3.grid(column=0,row=3)
    ent2=Entry(fen)
    ent2.grid(column=1,row=3)
    text4=Label(fen,text='Mardi',fg='red')
    text4.grid(column=0,row=4)
    ent3=Entry(fen)
    ent3.grid(column=1,row=4)
    text5=Label(fen,text='Mercredi',fg='red')
    text5.grid(column=0,row=5)
    ent4=Entry(fen)
    ent4.grid(column=1,row=5)
    text6=Label(fen,text='Jeudi',fg='red')
    text6.grid(column=0,row=6)
    ent5=Entry(fen)
    ent5.grid(column=1,row=6)
    text7=Label(fen,text='Vendredi',fg='red')
    text7.grid(column=0,row=7)
    ent6=Entry(fen)
    ent6.grid(column=1,row=7)
    text8=Label(fen,text='Samedi',fg='red')
    text8.grid(column=0,row=8)
    ent7=Entry(fen)
    ent7.grid(column=1,row=8)
    text9=Label(fen,text='Dimanche',fg='red')
    text9.grid(column=0,row=9)
    ent8=Entry(fen)
    ent8.grid(column=1,row=9)
    bou1=Button(fen,text='Envoyer',command=nom)
    bou1.grid(column=2,row=10)
    bou3=Button(fen,text='Reinitialiser',command=reinitialiser)
    bou3.grid(column=0,row=10)
    bou2=Button(fen,text=' Quitter ',command=fen.destroy)
    bou2.grid(column=2,row=12)
    fen.mainloop()
    Merci a tous
    Amicalement
    Steph70

  2. #2
    Membre Expert 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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try:
        a=os.system(commande)
        b=open('rep.txt','r')
    except: print "commande n'existe pas"
    result()
    @+

    (Edit : Avec la balise code c'est mieux)

  3. #3
    Membre Expert 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
    Par défaut
    Ou si préfère :
    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
     
    #definition du traitement
    def nom():
        nom=ent1.get()
        lundi=ent2.get()
        mardi=ent3.get()
        mercredi=ent4.get()
        jeudi=ent5.get()
        vendredi=ent6.get()
        samedi=ent7.get()
        dimanche=ent8.get()
     
        # seulement le lundi
        if lundi:
            commande="net user "+nom+" /times:L," +lundi+" 2>rep.txt"
            #print commande
        # seulement mardi
        elif mardi:
            commande="net user "+nom+" /times:Ma,"+mardi+" 2>rep.txt"
            #print commande
        # seulement mercredi
        elif mercredi:
            commande="net user "+nom+" /times:Me,"+mercredi+" 2>rep.txt"
            #print commande
        # seulement jeudi
        elif jeudi:
            commande="net user "+nom+" /times:j,"+jeudi+" 2>rep.txt"
            #print commande
        # seulement vendredi
        elif vendredi:
            commande="net user "+nom+" /times:v,"+vendredi+" 2>rep.txt"
            #print commande
        # seulement samedi
        elif samedi:
            commande="net user "+nom+" /times:s,"+samedi+" 2>rep.txt"
            #print commande
        # seulement dimanche
        elif dimanche:
            commande="net user "+nom+" /times:d,"+dimanche+" 2>rep.txt"
            #print commande
        # si pas de données
        else:
            commande="net user "+nom+" /times:all 2>rep.txt"
        a=os.system(commande)
        result()
     
    #définition reinitialiser
    def reinitialiser():
        nom=ent1.get()
        commandere="net user "+nom+" /times:all 2>rep.txt"
        #print commandere
        a=os.system(commandere)
        result()
     
    def result():
        fen1=Toplevel()
        fen1.title("Résultat")
        texte = ScrolledText(fen1, width = 75, height = 5, font = "Arial 10", relief = "groove")
        texte.pack()
        #Ecriture des données
        texte.config(state = NORMAL)    #Permettre l'écriture
        b=open('rep.txt','r')
        texte.insert("1.0", b.readlines())          #Gestion de l'insertin des lignes
                                        #1 = 1ere ligne  0 = 1er caractere de la ligne
        texte.config(state = DISABLED)  #Interdire les modifications
        b.close()
        #Remettre à zero les entrées
        ent1.delete(0,END)
        ent2.delete(0,END)
        ent3.delete(0,END)
        ent4.delete(0,END)
        ent5.delete(0,END)
        ent6.delete(0,END)
        ent7.delete(0,END)
        ent8.delete(0,END)
        Button(fen1,text='Fermer',command=fen1.destroy).pack()

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai déjà rencontré quelque chose comme ça. Comme si Python n'aimait pas qu'on crée une variable (ici: commande) uniquement derrière des if. Et même quand on est sûr que l'ensemble des if est tel que commande sera toujours créé.

    Si c'est ça, la solution est simple: initialise commande au début (avant les if) pour créer le nom. Même commande=None devrait convenir.

    Tyrtamos

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    J'ai déjà rencontré quelque chose comme ça. Comme si Python n'aimait pas qu'on crée une variable (ici: commande) uniquement derrière des if. Et même quand on est sûr que l'ensemble des if est tel que commande sera toujours créé.

    Si c'est ça, la solution est simple: initialise commande au début (avant les if) pour créer le nom. Même commande=None devrait convenir.

    Tyrtamos
    ? La logique dit que (1) l'entrée doit appartenir à un ensemble de valeurs prédéfinies pour que commande soit initialisé proprement.
    commande = None peut être
    mais surtout tester qu'il est != None avant de l'utiliser si on se sert de cela comme effet de bord pour détecter la condition (1)

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

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 145
    Par défaut
    Bonjour et merci a tous pour vos réponses éclairées.

    La solution adoptée est celle proposé par PauseKawa.

    Voici le script final :
    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    # -*- coding: cp1252 -*-
    from Tkinter import *
    import os
    from ScrolledText import *
     
    #definition du traitement
    def nom():
        global b
        nom=ent1.get()
        lundi=ent2.get()
        mardi=ent3.get()
        mercredi=ent4.get()
        jeudi=ent5.get()
        vendredi=ent6.get()
        samedi=ent7.get()
        dimanche=ent8.get()
     
        # seulement le lundi
        if lundi:
            commande="net user "+nom+" /times:L," +lundi+" 2>rep.txt"
            #print commande
        # seulement mardi
        if mardi:
            commande="net user "+nom+" /times:Ma,"+mardi+" 2>rep.txt"
            #print commande
        # seulement mercredi
        if mercredi:
            commande="net user "+nom+" /times:Me,"+mercredi+" 2>rep.txt"
            #print commande
        # seulement jeudi
        if jeudi:
            commande="net user "+nom+" /times:j,"+jeudi+" 2>rep.txt"
            #print commande
        # seulement vendredi
        if vendredi:
            commande="net user "+nom+" /times:v,"+vendredi+" 2>rep.txt"
            #print commande
        # seulement samedi
        if samedi:
            commande="net user "+nom+" /times:s,"+samedi+" 2>rep.txt"
            #print commande
        # seulement dimanche
        if dimanche:
            commande="net user "+nom+" /times:d,"+dimanche+" 2>rep.txt"
            #print commande
        # si pas de données
        try:
            a=os.system(commande)
            b=open('rep.txt','r')
        except:
            a=os.system("echo Entrez au moins une valeur !!>rep.txt")
            b=open('rep.txt','r')
        result()
     
    #définition reinitialiser
    def reinitialiser():
        global b
        nom=ent1.get()
        if nom:
            commandere="net user "+nom+" /times:all 2>rep.txt"
            #print commandere
            a=os.system(commandere)
        else:
            commandere="echo Entrez le nom de la session !!>rep.txt"
            a=os.system(commandere)
        b=open('rep.txt','r')
        result()
     
    def result():
        fen1=Toplevel()
        fen1.title("Résultat")
        texte = ScrolledText(fen1, width = 75, height = 5, font = "Arial 10",
        relief = "groove")
        texte.pack()
        #Ecriture des données
        texte.config(state = NORMAL)    #Permettre l'écriture
        texte.insert("1.0", b.readlines())          #Gestion de l'insertin des lignes
                                        #1 = 1ere ligne  0 = 1er caractere de la ligne
        texte.config(state = DISABLED)  #Interdire les modifications
        #Remettre à zero les entrées
        ent1.delete(0,END)
        ent2.delete(0,END)
        ent3.delete(0,END)
        ent4.delete(0,END)
        ent5.delete(0,END)
        ent6.delete(0,END)
        ent7.delete(0,END)
        ent8.delete(0,END)
        b.close()
        bou4=Button(fen1,text='Fermer',command=fen1.destroy)
        bou4.pack()
     
    #Fenêtre principal
    fen=Tk()
    fen.title('Horaires V1.0 par S.Pillot')
    text1=Label(fen,text='Entrer le nom de la session a limiter : ',fg='red')
    text1.grid(column=0,row=0)
    ent1=Entry(fen)
    ent1.grid(column=1,row=0)
    text2=Label(fen,text='Entrer les heures permises selon le modèle suivant : 13:00-20:00')
    text2.grid()
    text3=Label(fen,text='Lundi',fg='red')
    text3.grid(column=0,row=3)
    ent2=Entry(fen)
    ent2.grid(column=1,row=3)
    text4=Label(fen,text='Mardi',fg='red')
    text4.grid(column=0,row=4)
    ent3=Entry(fen)
    ent3.grid(column=1,row=4)
    text5=Label(fen,text='Mercredi',fg='red')
    text5.grid(column=0,row=5)
    ent4=Entry(fen)
    ent4.grid(column=1,row=5)
    text6=Label(fen,text='Jeudi',fg='red')
    text6.grid(column=0,row=6)
    ent5=Entry(fen)
    ent5.grid(column=1,row=6)
    text7=Label(fen,text='Vendredi',fg='red')
    text7.grid(column=0,row=7)
    ent6=Entry(fen)
    ent6.grid(column=1,row=7)
    text8=Label(fen,text='Samedi',fg='red')
    text8.grid(column=0,row=8)
    ent7=Entry(fen)
    ent7.grid(column=1,row=8)
    text9=Label(fen,text='Dimanche',fg='red')
    text9.grid(column=0,row=9)
    ent8=Entry(fen)
    ent8.grid(column=1,row=9)
    bou1=Button(fen,text='Envoyer',command=nom)
    bou1.grid(column=2,row=10)
    bou3=Button(fen,text='Reinitialiser',command=reinitialiser)
    bou3.grid(column=0,row=10)
    bou2=Button(fen,text=' Quitter ',command=fen.destroy)
    bou2.grid(column=2,row=12)
    fen.mainloop()
    Merci a tous
    Amicalement
    Steph70

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

Discussions similaires

  1. local variable 'z' referenced before assignment
    Par djidji22 dans le forum Tkinter
    Réponses: 1
    Dernier message: 08/06/2012, 11h50
  2. Réponses: 6
    Dernier message: 10/08/2008, 16h42
  3. [ASA 9.0.1] Aide sur Erreurs fichier transaction
    Par init dans le forum SQL Anywhere
    Réponses: 0
    Dernier message: 05/01/2008, 18h31
  4. Besoin d'aide sur erreur sql
    Par stagos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/11/2007, 11h47
  5. Réponses: 6
    Dernier message: 25/05/2007, 15h18

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