2015-05-02 49 views
0

所以我正在寫一個程序,轉換貨幣爲學校項目。我嘗試使用盡可能多的循環和引用來使程序儘可能短。但我不斷收到錯誤本地變量引用之前,但我已經分配了它的值

"UnboundLocalError: local variable 'v3' referenced before assignment".

這是代碼(注:我修剪它,所以它只是必要的部分)。

from tkinter import * 
root = Tk() 
btn1 = StringVar() 
btn2 = StringVar() 
VALUTE = [ #besedilo v gumbu, oznaka, tečaj 
    ("Evro", "evrov", 1), 
    ("Dolar", "dolarjev", 1.12005), 
    ("Funt", "funtov", 0.739868547), 
] 
v = v2 = v3 = v4 = 1 
def funkcija(): 
    n = int(entry1.get()) 
    X = btn1.get() 
    Y = btn2.get() 
    for text, mark, convert in VALUTE: 
     if v3 == X: 
      o = convert 
      E = mark 
     v3 = v3 + 1 
     if v4 == Y: 
      p = convert 
      F = mark 
     v4 = v4 + 1 
    m = pretvorba(o,p) 
    print("%s %s je %s %s." % (n, E, m, F)) 

def pretvorba(a,b): 
    Q = n/a*b 
    return Q 

for text, mark, convert in VALUTE: 
    gumb = Radiobutton(root, text=text, value = v, variable = btn1).grid(row = v+1, column=1, sticky=W) 
    v=v+1 

for text, mark, convert in VALUTE: 
    gumb = Radiobutton(root, text=text, value = v2, variable = btn2).grid(row = v2+6, column=1, sticky=W) 
    v2=v2+1 

entry1 = Entry(root) 
entry1.grid(row=1, column=1, sticky=W) 

go = Button(root, text="Izračun", fg="white", bg="black", command=funkcija) 
go.grid(row=10, columnspan=3) 

root.mainloop() 
+2

你的函數'funkcija'創建自己的'v3'變量,你讀它設置前。你可以告訴python不要在'funkcija'的開頭添加'global v3'語句來創建一個本地的v3' – FabienAndre

+0

[Python中的UnboundLocalError]的可能的重複(http://stackoverflow.com/questions/9264763/unboundlocalerror-in-python ) – FabienAndre

回答

0

看起來你叫v3 == X你在函數初始化funkcija() v3之前。你需要V3傳遞給函數funkcija(v3)或者將其定義爲一個全局變量global v3當你分配一個值來訪問該功能

+0

是的,它會,我在編輯之前寫過它,所以錯過了那一行。更新我的回答 – Matthew

1

在Python內部變量的函數,編譯器假定,除非另有規定,該變量是本地的。例如:

x = 42 
y = "this is a test" 

def foo(): 
    x = 1  # this is local, unrelated to the external defined one 
    print(y) # this is global 

如果你想改變一個全球性的,你需要明確告知的編譯器與global功能:

def bar(): 
    global x 
    x = 1  # this changes the global variable x 
0

行,所以我想通了。我在函數def funkcija()內定義了v3v4。然後,我將XY轉換爲整數,並將其作爲n全局。事實證明,if循環沒有運行,因爲XY不是整數。

這裏的固定代碼:

v = v2 = 1 
def funkcija(): 
    v3 = v4 = 1 
    n = float(entry1.get()) 
    global n 
    X = int(btn1.get()) 
    Y = int(btn2.get()) 
    for text, mark, convert in VALUTE: 
     if v3 == X: 
      o = convert 
      E = mark 
     v3+=1 
     if v4 == Y: 
      p = convert 
      F = mark 
     v4+=1 
    m = pretvorba(o,p) 
    print("%s %s je %s %s." % (n, E, m, F)) 

def pretvorba(a,b): 
    Q = n/a*b 
    return Q 
+0

你好Zoxx(並歡迎在stackoverflow)。很高興看到你解決了你的問題。這個網站不僅僅是一個互聯網論壇,你可能會考慮在答案部分發布與你提出的確切問題相關的東西(你的'UnboundLocalError'和本地vs全球問題)。如果答案對你有幫助,你可以考慮接受它(綠色勾號)。一旦你達到15點的聲譽,你也可以upvote(任何答案,不僅僅是你的問題,以及任何問題)。你可以閱讀StackOverflow的這個[presentation page](http://stackoverflow.com/tour)。 – FabienAndre

相關問題