局部变量错误

时间:2015-05-27 17:02:03

标签: python tkinter

我对我编写的程序有疑问,我无法弄清楚为什么它会给我这个错误:

    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分钟,我只是不明白为什么会出现这个错误。

1 个答案:

答案 0 :(得分:0)

问题是您有一个名为strVar1的全局变量,而有一个名为strVar1的局部变量。

在函数r_bird中,您有以下代码行:

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

因为你没有将strVar1声明为全局,并且因为你在函数中设置了它,所以即使你以前创建了一个具有相同名称的全局变量,python也会将该变量视为局部变量。而且,因为在创建条目小部件之前,您没有按该名称使用本地变量,所以会出现错误。

解决方案是不对本地变量和全局变量使用相同的名称。将这些更改为其他内容,例如:

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