2015-05-01 3 views
-4

Вначале я очень новичок в программировании Python 3.4.3, я пытаюсь вызвать 5 записей и помещать их в массив и отображать их, но im застрял в GPA1, но не определен, но он определен для приложения для входаПочему это не определено?

import sys 
from tkinter import * 

def save_data(): 

    fileD.write("GPA1:\n") 
    fileD.write("%s\n" % GPA1.get()) 
    fileD.write("GPA2:\n") 
    fileD.write("%s\n" % GPA2.get()) 
    fileD.write("GPA3:\n") 
    fileD.write("%s\n" % GPA3.get("1.0", END)) 

    app = Tk() 
    app.title('Student Grade Report') 

    gpa1=str(GPA1.get()) 
    gp1=float(gpa1) 
    gpa2=str(GPA2.get()) 
    gp2=float(gpa2) 
    gpa3=str(GPA3.get()) 
    gp3=float(gpa3) 
    gpa4=str(GPA4.get()) 
    gp4=float(gpa4) 
    gpa5=str(GPA5.get()) 
    gp5=float(gpa5) 
    gpas=gp1+gp2+gp3+gp4+gp5 
    avg=gpas/5 
    def DisplayMsg(): 
     DL=str("Dean's list") 
     AP=str("Academic Probation") 
     note=("No Message") 
     if (avg>3.5): 
     note=DL 
    else: 
     if (avg<2.0): 
      note=AP 
    return str(note) 




    classi = StringVar() 
    classi.set(None) 


    Label(app, text = "Classification:").pack() 
    Classification = StringVar() 
    Classification.set(None) 
    Radiobutton(app, variable = classi, text = "freshman", value = "freshman").pack() 
    Radiobutton(app, variable = classi, text = "sophmore", value = "sophmore").pack() 
    Radiobutton(app, variable = classi, text = "junior", value = "junior").pack() 
    Radiobutton(app, variable = classi, text = "senior", value = "senior").pack() 

    Label(app, text = "GPA1:").pack() 
    GPA1= StringVar() 
    GPA1.set(None) 
    GPA1= Entry(app,textvariable=Gpa1).pack() 
    Label(app, text = "GPA2:").pack() 
    GPA2= StringVar() 
    GPA2.set(None) 
    GPA2 = Entry(app) 
    Label(app, text = "GPA3:").pack() 
    GPA3= StringVar() 
    GPA3.set(None) 
    GPA3= Entry(app) 
    Label(app, text = "GPA4:").pack() 
    GPA4= StringVar() 
    GPA4.set(None) 
    GPA4= Entry(app) 
    Label(app, text = "GPA5:").pack() 
    GPA5= StringVar() 
    GPA5.set(None) 
    GPA5= Entry(app) 


    Button(app, text= "Message", command = DisplayMsg).pack() 

    Button(app, text = "Save", command = save_data).pack() 

    app.mainloop() 
+2

Является ли ваш отступ испорченным? Весь код после 'return str (note)' не должен быть отступом, потому что тогда он является частью функции. – Barmar

+0

Пожалуйста, вставьте фактическое исключение и трассировку, а не просто смутное описание. – abarnert

ответ

0

Программа, опубликованная выше, имеет некоторые проблемы с отступом, но я подозреваю, что это произошло при вставке в редактор.

Кроме того, я подозреваю, что ваша ошибка говорит о том, что Gpa1 не определен, а не GPA1. Это связано с тем, что вы назначаете текстовую переменную Entry, которая еще не инициализирована (т. Е. Она не существует).

Способ упаковки() виджетов, чтобы они отображались вертикально. Если вы хотите, чтобы они были в таблице, такой как таблица, вам нужно использовать упаковщик, такой как .grid(), и указать столбец и строку, в которой должен появиться виджет.

Вот код, немного очищен (Обратите внимание, что я должен был использовать Tkinter, чтобы найти модуль - не Tkinter):

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import sys 
from Tkinter import * 

def save_data(): 

    fileD.write("GPA1:\n") 
    fileD.write("%s\n" % GPA1.get()) 
    fileD.write("GPA2:\n") 
    fileD.write("%s\n" % GPA2.get()) 
    fileD.write("GPA3:\n") 
    fileD.write("%s\n" % GPA3.get("1.0", END)) 

    app = Tk() 
    app.title('Student Grade Report') 

    gpa1=str(GPA1.get()) 
    gp1=float(gpa1) 
    gpa2=str(GPA2.get()) 
    gp2=float(gpa2) 
    gpa3=str(GPA3.get()) 
    gp3=float(gpa3) 
    gpa4=str(GPA4.get()) 
    gp4=float(gpa4) 
    gpa5=str(GPA5.get()) 
    gp5=float(gpa5) 
    gpas=gp1+gp2+gp3+gp4+gp5 
    avg=gpas/5 

def DisplayMsg(): 
    DL=str("Dean's list") 
    AP=str("Academic Probation") 
    note=("No Message") 

    if (avg>3.5): 
     note=DL 
    elif (avg<2.0): 
      note=AP 

    return str(note) 



def main(): 
    app = Tk() 
    app.title('Student Grade Report') 

    classi = StringVar() 
    classi.set(None) 

    Label(app, text = "Classification:").pack() 
    Classification = StringVar() 
    Classification.set(None) 
    Radiobutton(app, variable = classi, text = "freshman", value = "freshman").pack() 
    Radiobutton(app, variable = classi, text = "sophmore", value = "sophmore").pack() 
    Radiobutton(app, variable = classi, text = "junior", value = "junior").pack() 
    Radiobutton(app, variable = classi, text = "senior", value = "senior").pack() 

    Gpa1 = None 

    Label(app, text = "GPA1:").pack() 
    GPA1= StringVar() 
    GPA1.set(None) 
    GPA1= Entry(app,textvariable = Gpa1).pack() 

    Label(app, text = "GPA2:").pack() 
    GPA2= StringVar() 
    GPA2.set(None) 
    GPA2 = Entry(app) 
    Label(app, text = "GPA3:").pack() 

    GPA3= StringVar() 
    GPA3.set(None) 
    GPA3= Entry(app) 
    Label(app, text = "GPA4:").pack() 
    GPA4= StringVar() 
    GPA4.set(None) 
    GPA4= Entry(app) 
    Label(app, text = "GPA5:").pack() 
    GPA5= StringVar() 
    GPA5.set(None) 
    GPA5= Entry(app) 


    Button(app, text= "Message", command = DisplayMsg).pack() 

    Button(app, text = "Save", command = save_data).pack() 

    app.mainloop() 

main() 

Примечание: К сожалению! Я добавил примечание к исходному сообщению вместо ответа. Вот правильная нота: вы еще не закончили! Есть еще проблемы, которые необходимо решить. Например. Файл file.write не будет работать, если вы не откроете файл первым.

+0

Да, есть другие вещи, которые мне нужно сделать, как сохранить все данные в конкретном документе .txt, но я еще не добавил, что еще –

+0

Traceback (последний последний звонок): Файл «C:/Users/jace/Documents/Test 4.py ", строка 18, в gpa1 = str (GPA1.get()) NameError: имя 'GPA1' не определено thats ошибка, которую я получаю, мне нужно добавить все это в функцию и затем вызовите их после ввода записи, @jcoppens –

+0

Попробуйте загрузить версию программы, которую я загрузил. Если вы сделали ошибки с отступом, это может привести к тому, что переменная GPA1 (и GPA2 ...) станет невидимой для функций. Строки из 'classi = StringVar()' on должны быть либо на левом поле (как отмечал Бармар), либо в функции (как и я). Иначе они считаются частью функции 'save_data', и это приведет к ошибке« undefined ». – jcoppens

0

Вы должны исправить все проблемы, описанные в jcoppens' very thorough answer, но реальная проблема, вы спрашиваете о том, другой один, что вы также нужно исправить. (Я предполагаю, что ваш фактический отступ и структура выглядят так, как он предположил в своем ответе. Если это не относится к вашему фактическому коду ... ну, это относится к коду в его ответе, который, надеюсь, будет много как только вы исправить все другие проблемы)


внутри save_data, вы делаете это:.

fileD.write("%s\n" % GPA1.get()) 

Но нет глобальной переменной с именем GPA1, и никакой локальной переменной внутри этой функции с именем GPA1.

: локальная переменная внутри main с этим именем, но это не помогает; вся точка локальных переменных состоит в том, что они локальны - единственная живая внутри одной функции.

Вы можете исправить это, сделав GPA1 глобальным, просто добавив global GPA1 в начало вашей функции main. Это самое быстрое решение, но обычно это не самое лучшее.

Лучшим решением является создание class и создание GPA1 атрибута этого класса. Какой бы ни был Tkinter docs или учебник, который вы используете, вероятно, есть много хороших примеров этого.

Вы также можете изменить save_data принять GPA1 в качестве параметра, а затем использовать functools.partial(save_data, GPA1) вместо просто save_data, как обратный вызов.

Или вы можете поместить все эти функции в другую функцию и сделать GPA1 a nonlocal переменной вместо global.(Я бы не рекомендовал этого, просто включив его в комплектность ...)

Конечно, что бы вы ни делали, вам нужно сделать то же самое для GPA2, иначе вы снова получите ту же ошибку еще две строки позже.


Излишне говорить, что нет гарантии, что это последняя ошибка в вашей программе.

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