2014-11-21 209 views
-2

當我將代碼移入函數時,計算現在不起作用。抱怨: NameError:未定義全局名稱'feet' 如何解決此問題,以便方法正確地看到變量?python函數抱怨全局變量未定義

from tkinter import * # Import tkinter 
from tkinter import ttk 

def calculate(*args): 
    try: 
     value = float(feet.get()) 
     meters.set((0.3048 * value * 10000.0 + 0.5)/ 10000.0) 
    except ValueError: 
     pass 

def frame(): 
    mainframe = ttk.Frame(root, padding = "3 3 12 12") 
    mainframe.grid(column = 0, row = 0, sticky = (N, W, E, S)) 
    mainframe.columnconfigure(0, weight = 1) 
    mainframe.rowconfigure(0, weight = 1) 

    feet = StringVar() 
    meters = StringVar() 
    feet_entry = ttk.Entry(mainframe, width = 7, justify = CENTER, textvariable = feet) 
    feet_entry.grid(column = 2, row = 1, sticky = (W, E)) 
    ttk.Label(mainframe, textvariable = meters).grid(column = 2, row = 2, sticky = (W, E)) 
    ttk.Button(mainframe, text = "Calculate", command = calculate).grid(column = 3, row = 3, sticky = (W)) 

    ttk.Label(mainframe, text = "feet").grid(column = 3, row = 1, sticky = (W)) 
    ttk.Label(mainframe, text = "is equivalent to:").grid(column = 1, row = 2, sticky = (E)) 
    ttk.Label(mainframe, text = "meters").grid(column = 3, row = 2, sticky = (W)) 

    for child in mainframe.winfo_children(): child.grid_configure(padx = 5, pady = 5) 
    feet_entry.focus() 
    root.bind('<Return>', calculate) 

# create a Tkinter window 
root = Tk() 
root.title("Menu Bar") 
frame() 

# start the event loop 
root.mainloop() 
+0

的上是錯誤報道什麼線? – brycem 2014-11-21 23:31:51

+1

看起來你已經在frame()中定義了你的腳和米變量,但是在calculate()中使用它們。嘗試在frame()之外定義兩個變量,以使它們對兩個函數都可見。 – MirekE 2014-11-22 00:02:37

回答

0

feetmeters例如由self.feetself.meters到處替換它們的屬性,讓

 value = float(self.feet.get()) 
     self.meters.set((0.3048 * value * 10000.0 + 0.5)/ 10000.0) 
    ... 
    self.feet = StringVar() 
    self.meters = StringVar() 
    feet_entry = ttk.Entry(mainframe, width = 7, justify = CENTER, 
          textvariable = self.feet) 
    feet_entry.grid(column = 2, row = 1, sticky = (W, E)) 
    ttk.Label(mainframe, textvariable = self.meters 
      ).grid(column = 2, row = 2, sticky = (W, E)) 
+0

當我用self.feet和self.meters替換腳和米時,我得到:self.feet = StringVar() NameError:全局名稱'self'未定義 – vonbraun 2014-11-22 01:58:50

+0

對不起兄弟,但您的答案無效。也許你可以下來檢查你的答案,並現在檢查我的問題。 – vonbraun 2014-11-22 02:05:48

+0

如果應用程序處於'class'類中,那麼這就行得通了。只需在任何功能之外定義'feet'和'meters',在調用'frame()'之前,就像MirekE在他對這個問題的評論中所建議的那樣。或者將應用程序重寫爲一個類,然後可以使用self來傳遞變量。 – fhdrsdg 2014-11-22 07:42:28