Существует два варианта операций с поперечными потоками.
Control.InvokeRequired Property
, а второй - использовать
SynchronizationContext Post Method
Control.InvokeRequired полезен только при работе с элементами управления, унаследованными от Control класс, в то время как SynchronizationContext можно использовать в любом месте. Некоторая полезная информация относится к следующим ссылкам:
Пользовательский интерфейс Cross Thread Update | .Net
Пользовательский интерфейс Cross Thread Update с использованием SynchronizationContext | .Net
Вместо создания цикла if else просто используйте словарь. Здесь я суммировал оценку, соответствующую буквенной оценке, а затем разделил ее на число предметов. В результате вы получите взвешенный средний балл.
In [3]: def get_grade(grade_list):
grade_dict = dict(zip(['A', 'A-', 'B+', 'B-', 'C+', 'C-'],
[4, 3.7, 3.3, 3, 2.7, 2.3, 2, 1.7]))
return sum([grade_dict[i] for i in grade_list])/(len(grade_list))
In [4]: get_grade(['A', 'A', 'A', 'B+'])
Out[4]: 3.825
Вы пытаетесь добавить grades
, поэтому после 6 итераций это будет список из 6 значений. Поскольку вы добавляете gtotal
для каждой итерации, ваш код будет работать, когда вы удалите функцию append
.
Код:
print ("GPA Calculator")
gtotal = 0
ctotal = 0
grades = []
for i in (range(6)):
grades = input("Enter Grades in Order Here: ")
if grades == "A":
gtotal += 4
elif grades == "A-":
gtotal += 3.7
elif grades == "B+":
gtotal += 3.3
elif grades == "B":
gtotal += 3
elif grades == "B-":
gtotal += 2.7
elif grades == "C+":
gtotal += 2.3
elif grades == "C":
gtotal += 2
elif grades == "C-":
gtotal += 1.7
print(gtotal)
Выход:
GPA Calculator
24
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A
Enter Grades in Order Here: A