2013-10-15 3 views
1

Я новичок в программировании и только что был назначен задание создать ролик для кубиков в Python, используя Tkinter. Я полностью потрясен этим сообщением об ошибке:Tkinter dice roller

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__ 
    return self.func(*args) 
    File "C:/Users/d/Desktop/Dice Simulator/Simulator.py", line 12, in roll 
    if y == 1: 
UnboundLocalError: local variable 'y' referenced before assignment 

Может ли кто-нибудь пролить свет на мою ошибку? Вот мой весь код:

y = 1 
print "Please wait for the GUI to load" 
from Tkinter import * 
DICE = dict(
    sixsided={'name': 'Six Sided Dice', 
       'side': 6}, 
    eightsided = {'name': 'Eight Sided Dice', 
        'side': 8} 
    ) 
names = ['Six Sided Dice', 'Eight Sided Dice'] 
import random 


def back_(): 
    diceroll.destroy() 

def roll(): 
    if y == 1: 
     blankanswer.pack_forget() 
     droll.set("You rolled a " + str(random.randrange(1,endnum,1))) 
     filledanswer.pack() 
     y = 2 
    if y == 2: 
     droll.set("You rolled a " + str(random.randrange(1,endnum,1))) 

def cont_(): 
    y = 1 
    if dice.get() == "Six Sided Dice": 
     selecteddice = "sixsided" 
    if dice.get() == "Eight Sided Dice": 
     selecteddice = "eightsided" 

    diceroll = Tk() 
    diceroll.title("Dice Simulator") 

    endnum = int(DICE[selecteddice]["side"]) 

    droll = StringVar() 
    droll.set("You rolled a " + str(random.randrange(1,endnum,1))) 

    reroll = Button(diceroll, text="Click to roll the " + dice.get() + ".",command=roll) 
    reroll.pack() 

    blankanswer = Label(diceroll, text="You rolled a ") 
    blankanswer.pack() 


    filledanswer = Label(diceroll, textvariable=droll) 

    back = Button(diceroll, text="Back", command=back_) 
    back.pack(side=BOTTOM) 

    diceroll.mainloop() 



diceselect = Tk() 
diceselect.title("Select your dice") 

Label(diceselect, text="Please select the dice you would like to roll").pack() 

dice = StringVar() 
dice.set("Six Sided Dice") 

entry = OptionMenu(diceselect, dice, *names) 
entry.configure(width=15) 
entry.pack(side=LEFT) 

cont = Button(diceselect, text="Continue", command=cont_) 
cont.configure(width=15) 
cont.pack(side=RIGHT) 

diceselect.mainloop() 

Заранее спасибо!

+0

Чтение сообщения 'UnboundLocalError: локальная переменная 'y', на которую ссылается перед присваиванием', что это значит для интерпретатора. –

ответ

2

В roll() использование global y, как вы есть оператор присваивания и хотел использовать глобальную y:

def roll(): 
    global y 
    if y == 1: 
    # other code 

Примечание: когда вы делаете назначение y = 2 вы создаете новый y в местных namesapce (которые запрещают использование глобальных y, потому что местные y scope - функция).