2015-05-27 7 views
-1

У меня возникли проблемы с программой, которую я написал, и я не могу понять, почему это дает мне эту ошибку:Локальная переменная ошибка

2015-05-27 18:49:49.723 Python[9471:500868] ApplePersistenceIgnoreState:         Existing state will not be touched. New state will be written to       /var/folders/rw/9nk7c7216bl3_68qcx9sjr9m0000gn/T/org.python.python.savedState 
    Exception in Tkinter callback 
    Traceback (most recent call last): 
     File   "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.  py", line 1487, in __call__ 
     return self.func(*args) 
     File "/Users/robin-andredueherrmann/Documents/ECLIPSE/Heldags/Heldags/Heldagss/oppgave_2/FUGLEQUIZ.py", line 78, in pr_bird 
r_bird("svartmeis.mp3", "svartmeis1.gif", "svartmeis") 
     File "/Users/robin-andredueherrmann/Documents/ECLIPSE/Heldags/Heldags/Heldagss/oppgave_2/FUGLEQUIZ.py", line 58, in r_bird 
e=Entry(root1, text=strVar1).pack() 
    UnboundLocalError: local variable 'strVar1' referenced before assignment 

Вот код:

#encoding=utf8 
''' 
Created on May 26, 2015 

@author: robin-andredueherrmann 
''' 

import tkinter 
import PIL 
import subprocess 
from tkinter import * 
from PIL import Image, ImageTk 
from random import randrange 
import time 


root=Tk() 
root.minsize() 
root.title("Fugleinformasjon") 

rett = [] #oppretter 3 tomme lister jeg skal bruke senere til quizen. 
galt = [] 
birds= [] 


strVar1=StringVar() 

    #Oppretter en funksjon som heter i(nformation)_birds, med 3 parametere   som skal forkorte og forenkle koden. 
def i_birds(AUDIO, PIC): 
    subprocess.call(["afplay", AUDIO]) #Parameteret AUDIO byttes ut med navn på lydfilen som skal spilles av. 
    im = Image.open(PIC) #Åpner bilde i din pc sin bildefremvisningsprogram, parameteret PIC benyttes for å kunne gjenbruke funksjonen med forskjellige bilder. 
    im.show() 



def quiz(): 
    root1=Tk() 
    root1.minsize(500,500) 
    root1.title("Quiz") 
    birds.append(str("blåmeis")) 
    birds.append(str("svartmeis")) 
    birds.append(str("flaggspett")) 
    birds.append(str("pilfink")) 
    birds.append(str("gråspurv")) 
    birds.append(str("dompap hunn")) 
    birds.append(str("dompap hann")) 
    birds.append(str("kjøttmeis")) 
    birds.append(str("gulspurv")) 


    def r_bird(AUDIO, PIC, BIRD): #denn funksjonen er ganske lik i_birds men denne inneholder en if test og entry boks hvor jeg sjekker om bruker har skrevet inn riktig eller feil navn på fugl. 
     subprocess.call(["afplay", AUDIO]) 
     logo=PhotoImage(file=PIC) 
     label=Label(image=logo) 
     label.photo=logo 
     label.pack() 
     l=Label(root1, text="Skriv in navn på fugl du tror du så og hørte").pack(fill=X) 
     e=Entry(root1, text=strVar1).pack() 
     strVar1=strVar1.get() 
     strVar1=strVar1.lower() 
     if (strVar1 == BIRD): 
      l=Label(root, text="Riktig svar!").pack() 
      rett.append(1) 
     else: 
      l=Label(root, text="Feil svar!").pack() 
      galt.append(1) 

    x=randrange(1,9) #definerer x som en variabel hvor det blir valgt et tilfeldig tall mellom 1 og 9 
    #b=str() #definerer b som en variabel hvor jeg konverterer et av navnene fra "birds" listen, og hvor jeg bruker variabel x til å trekke et tilfeldig navn. 



    def pr_bird(): #her legger vi til slik at den fuglen fra liste birds som blir trukket, spiller av riktig lyd, viser riktig bilde og legger riktig navn til navn-testen. 

     if (birds[x]=="blåmeis"): 
      r_bird("blåmeis.mp3", "blameis1.gif", "blåmeis") 
     elif (birds[x]=="svartmeis"): 
      r_bird("svartmeis.mp3", "svartmeis1.gif", "svartmeis") 
     elif (birds[x]=="flaggspett"): 
      r_bird("flaggspett.mp3", "flaggspett1.gif", "flaggspett") 
     elif (birds[x]=="pilfink"): 
      r_bird("pilfink.mp3", "pilfink1.gif", "pilfink") 
     elif (birds[x]=="gråspurv"): 
      r_bird("gråspurv.mp3", "graspurv1.gif", "gråspurv") 
     elif (birds[x]=="dompap hann"): 
      r_bird("dompap.mp3", "dompap_hunn1.gif", "drompap hunn") 
     elif (birds[x]=="dompap hann"): 
      r_bird("dompap.mp3", "dompap_hann1.gif", "dompap hann") 
     elif (birds[x]=="gulspurv"): 
      r_bird("gulspurv.mp3", "gulspurv1.gif", "gulspurv") 

    b=Button(root1, text="Neste", command=pr_bird).pack(side=LEFT) 

    def avslutt(): 
     root1.destroy() 
     root2=Tk() 
     root2.minsize(500, 500) 
     root2.title("Resultater") 
     r=0 
     g=0 
     for row in rett: 
      logo=PhotoImage(file="lysfjær.gif") 
      label=Label(image=logo) 
      label.photo=logo 
      label.grid(row=r, column=0) 
      r+=1 
     for row in galt: 
      logo=PhotoImage(file="mørkfjær.gif") 
      label=Label(image=logo) 
      label.photo=logo 
      label.grid(row=g, column=1) 
      g+=1 


    b=Button(root1, text="Avslutt", command=avslutt).pack(side=LEFT) 

Я искал около 15 минут, и я просто не понимаю, почему я получаю эту ошибку.

+2

Проблема заключается в последующей строке 'strVar1 = strVar1.get()'; что вы хотите, чтобы это сделать? – jonrsharpe

ответ

0

Проблема заключается в том, что у вас есть глобальная переменная с именем strVar1, а у вас также есть локальная переменная с именем strVar1.

В функции r_bird у вас есть следующие строки кода:

strVar1=strVar1.get() 
strVar1=strVar1.lower() 

Потому что вы не декларировать strVar1 как глобальные, а потому, что вы устанавливаете его в функции, Python рассматривает переменную как локальный переменной, даже если вы создали глобальную переменную с тем же именем. И, поскольку у вас нет локальной переменной этим именем, прежде чем создавать виджет ввода, вы получите сообщение об ошибке.

Решение не должно использовать одно и то же имя для локальной и глобальной переменных. Измените их на строки на что-то еще, например:

strVar1Value=strVar1.get() 
strVar1Value=strVar1.lower() 
+0

Спасибо, я все еще новичок в python, так что это было очень полезно! –

Смежные вопросы