为什么说没有定义?

2024-04-19 09:46:55 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我对Python3.4.3编程非常陌生,我尝试调用5个入口,并将它们放入数组并显示出来,但我坚持GPA1没有定义,但它是为entry应用程序定义的

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() 

Tags: textnoneappgetlabelpackwriteset
2条回答

您需要修复jcoppens' very thorough answer中描述的所有问题,但您所问的实际问题是另一个需要修复的问题。(我假设你的实际压痕和结构和他在回答中猜测的一样。如果这不适用于您的实际代码……那么,它适用于他的答案中的代码,一旦您解决了所有其他问题,您的代码很可能会很像。)


save_data内,您可以执行以下操作:

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

但是没有名为GPA1的全局变量,也没有名为GPA1的函数内的局部变量。在

有一个名为main的局部变量,但这并没有帮助;局部变量的全部意义在于它们是唯一存在于一个函数中的局部变量。在

您可以通过使GPA1全局化来解决这个问题,只需将global GPA1添加到main函数的顶部。这是最快的解决办法,但通常不是最好的。在

一个更好的解决方案是创建一个class,并使GPA1成为该类的一个属性。无论您使用的是哪个Tkinter文档或教程,都可能有很多很好的例子。在

您还可以将save_data更改为将GPA1作为参数,然后使用functools.partial(save_data, GPA1)而不仅仅是{}作为回调函数。在

或者您可以将所有这些函数放入另一个函数中,并使GPA1成为nonlocal变量,而不是global变量。(我不建议这样做,只是为了完整起见…)

当然,无论您做什么,您都需要对GPA2执行相同的操作,否则您将在两行之后再次遇到相同的错误。在


不用说,不能保证这是程序中的最后一个bug。在

上面发布的程序在缩进方面确实有一些问题,但是我怀疑这是在插入编辑器时发生的。在

另外,我怀疑你的错误是Gpa1未定义,而不是Gpa1。这是因为您将一个文本变量分配给尚未初始化的条目(即它不存在)。在

打包()小部件的方法是使它们垂直显示。如果希望它们出现在类似电子表格的表中,则必须使用.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()

注意:对不起!我在原来的帖子上加了一个注释,而不是我的答案。这里有一个正确的注释:你还没有完成!还有一些问题需要解决。例如归档.写入如果你不先打开文件,就不起作用了。在

相关问题 更多 >