2014-11-21 41 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