我对我编写的程序有疑问,我无法弄清楚为什么它会给我这个错误:
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分钟,我只是不明白为什么会出现这个错误。
答案 0 :(得分:0)
问题是您有一个名为strVar1
的全局变量,而还有一个名为strVar1
的局部变量。
在函数r_bird
中,您有以下代码行:
strVar1=strVar1.get()
strVar1=strVar1.lower()
因为你没有将strVar1声明为全局,并且因为你在函数中设置了它,所以即使你以前创建了一个具有相同名称的全局变量,python也会将该变量视为局部变量。而且,因为在创建条目小部件之前,您没有按该名称使用本地变量,所以会出现错误。
解决方案是不对本地变量和全局变量使用相同的名称。将这些更改为其他内容,例如:
strVar1Value=strVar1.get()
strVar1Value=strVar1.lower()