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

+1

Похоже, что у вас есть перемены ножек и метров, определенные в frame(), но используйте их в функции calculate(). Попробуйте определить две переменные вне рамки(), чтобы они были видны для обеих функций. – MirekE

ответ

0

Сделать feet и meters экземпляра атрибутов, заменяя их повсюду self.feet и self.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

+0

извините, но ваш ответ не сработал. возможно, вы можете проверить свой ответ и опробовать мой вопрос сейчас. – vonbraun

+0

Это будет работать, если приложение находится в «классе», а это не так. Просто определите 'feet' и' meters' вне любого fuction, поэтому перед тем, как вы назовете 'frame()', как это было предложено MirekE в его комментарии к вопросу. Или перепишите приложение, чтобы быть в классе, тогда вы можете использовать self для передачи переменных. – fhdrsdg

Смежные вопросы