python - 如何让 tkinter 不断更新值
问题描述
我正在尝试编写一个程序来计算一个班级的成绩。我的结构方式是用户可以添加考试、项目、实验室或其他任何内容,并且每个都有一定的权重。现在我只是想让它只适用于考试。问题是我的最终成绩卡在 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
解决方案
当您将标签设置为 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)
我还可以提出一种将标记 fp 映射到等级的更 Pythonic 的方法 - 您的方法虽然有效,但不使用 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])
推荐阅读
- flutter - 颤振中带有多选芯片的警报框
- maven - gradle 不是像 Maven 有 m2 那样有自己的仓库吗?
- python - Python:屏蔽电子邮件文本中的命名实体
- javascript - 如果尚未下载脚本,则跳过同步脚本执行
- reactjs - react-native:如何隐藏底部标签栏 onPress
- python - Python:单击图像后捕获 x,y 坐标并关闭图像
- android - Webview Xamarin Forms中的Websocket不起作用
- node.js - 使用 Mongoose 分组
- python - Pandas 将一系列值分配给特定位置的最有效方法
- android - Android 8 System App 更新仅在重启后生效