如何连续更新tkinter值

问题描述 投票:0回答:1

我正在尝试编写一个程序来计算一个班级的成绩。我的结构方式是用户可以添加考试,项目,实验室等等,每个都有一定的权重。现在我只是试图让它只与考试一起工作。问题是我的最终成绩是0,因为它将成绩记录为默认值零。如何让它记录新值或者甚至更好的方法是只取一个tkinter中某列的值?

def ShowFinalGrade(self):


    Label(self, text= "Final Grade").grid(row=10, column=0, columnspan=3)
    Label(self, text= self.Calculate()).grid(row=10, column=4)
    finalpercent=87
    fp = finalpercent
    grading_scale = self.CreateGradeScale()

    self.class_score = Button(self, text="Calculate Grade", command=self.Calculate)
    self.class_score.grid(row=10, column=5, padx=50)



    if fp>= grading_scale[0]:
        self.finalgrade= "A"
    elif fp>= grading_scale[1]:
        self.finalgrade= "A-"
    elif fp>= grading_scale[2]:
        self.finalgrade= "B+"
    elif fp>= grading_scale[3]:
        self.finalgrade= "B"
    elif fp>= grading_scale[4]:
        self.finalgrade= "B-"
    elif fp>= grading_scale[5]:
        self.finalgrade= "C+"
    elif fp>= grading_scale[6]:
        self.finalgrade= "C"
    elif fp>= grading_scale[7]:
        self.finalgrade= "C-"
    elif fp>= grading_scale[8]:
        self.finalgrade= "D+"
    elif fp>= grading_scale[9]:
        self.finalgrade= "D"
    else:
        self.finalgrade= "F"

    Label(self, text = self.finalgrade).grid(row=10, column=3, columnspan=3)



def AddExam(self):
    examnumber = self.examnumber
    examname = Entry(self)
    examname.grid(row=examnumber+1, column=0)
    examname.insert(0, "Exam "+str(examnumber))
    examgrade = Entry(self)
    examgrade.grid(row=examnumber+1, column=1)
    examgrade.insert(0,0)
    # self.examtotal += float(examgrade.get())
    self.examscores.append(float(examgrade.get()))
    print(examgrade) # Troubleshooting
    self.examnumber+=1


def Calculate(self):
    examsum = 0
    if len(self.examscores)!=0:
        for i in range(len(self.examscores)):
            examsum+= self.examscores[i]
        examavg = examsum / len(self.examscores)
    else:
        examavg = 0
    return examavg
python tkinter
1个回答
1
投票

当您将标签设置为text = self.Calculate()时,Python仅在该点执行函数Calculate并将其返回的结果用作标签文本。

如果您希望tkinter在每次执行新计算时自动更新标签,那么最简单的方法是使用StringVar:

self.examAverage = tk.StringVar()
Label(self, textvariable=self.examAverage).grid(row=10, column=4)

然后在计算中,而不是

return examavg

self.eaxmAverage.set(examavg)

我还可以提出一种更加Pythonic的方法,将标记fp映射到一个等级 - 你的方法虽然有效,但不使用Python成语。例如,您可以尝试:

def getGrade(self, fp):

    #example grading scale
    gradeBoundaries = [(95, 'A'), (85, 'A-'), (75, 'B+'),
                       (65, 'B'), (60, 'B-'), (55, 'C+'),
                       (50, 'C'), (45, 'C-'), (40, 'D+'),
                       (35, 'D'), (0, 'F')]

    return next((grade for mark,grade in gradeBoundaries if fp>=mark),'Error')

或者,如果您希望将评分等级与成绩分开(因为它可能会从考试变为考试),您可以尝试:

def getGrade(self, fp, grading_scale):
    grades = 'A A- B+ B B- C+ C C- D+ D F'.split(' ')

    return next((grade for mark, grade in zip(grading_scale, grades) if fp >= mark), 'Error')

然后提供评分量表作为实例变量或作为参数:

getGrade(70,[95,85,75,65,60,55,50,45,40,35,0])
© www.soinside.com 2019 - 2024. All rights reserved.