Python Turtle: курсор не двигается - PullRequest
0 голосов
/ 24 мая 2018

У меня проблема с кодом моего уни-проекта, особенно в разделе модуля turtle.Эта программа отображает оценки студентов, и мы должны показать гистограмму, используя модуль черепахи.Проблема, с которой я сталкиваюсь, заключается в том, что, хотя рабочая область черепахи появляется, курсор не двигается, чтобы нарисовать гистограмму.

Это код:

def menu():

    allStudentsMarks = {}

    while True:
        userinput = input("Enter 1 to store student details \n"+
                  "Enter 2 to display student report \n"+
                  "Enter 3 to exit \n")
        if userinput == "1":
            enterMarks(allStudentsMarks)
        elif userinput == "2":
            displayReports(allStudentsMarks)
        elif userinput == "3":
            print("You have left the program. Thank you.")
            break

def enterMarks(allStudentsMarks):
    studentName = input("Please enter the student's name: ")

    while True:
        DFMarks = input("Please enter the marks from 0-20: ")
        DFMarks = float(DFMarks)
        if DFMarks >= 0 and DFMarks <= 20:
            break

    while True:
        ProjectMarks = input("Please enter the marks from 0-30: ")
        ProjectMarks = float(ProjectMarks)
        if ProjectMarks >= 0 and ProjectMarks <= 30:
            break

    while True:
        FinalMarks = input("Please enter the marks from 0-50: ")
        FinalMarks = float(FinalMarks)
        if FinalMarks >= 0 and FinalMarks <= 50:
            break

    marksList = [DFMarks, ProjectMarks, FinalMarks]
    allStudentsMarks[studentName] = marksList
    studentDetails = sum(marksList)

def getBelowAvgDFMarks(studentDetails):
    marks = list(studentDetails.values())
    dfTot = 0
    dfLen = 0
    for marksList in marks:
        dfTot += marksList[0]
        dfLen += 1
    dfAvg = dfTot / dfLen
    print("Displaying the student(s) whose DF marks are below the average of", dfAvg)

    belowAvgDF = {}
    for student in studentDetails:
        if studentDetails[student][0] < dfAvg:
                belowAvgDF[student] = studentDetails[student][0]
    print(belowAvgDF)
    return

def getBelowAvgProjectMarks(studentDetails):
    marks = list(studentDetails.values())
    projectTot = 0
    projectLen = 0
    for marksList in marks:
        projectTot = projectTot + marksList[1]
        projectLen = projectLen + 1
    projectAvg = projectTot / projectLen
    print("Displaying the student(s) whose project marks are below the average of", projectAvg)

    belowAvgProject = {}
    for student in studentDetails:
        if studentDetails[student][1] < projectAvg:
            belowAvgProject[student] = studentDetails[student][1]
    print(belowAvgProject)
    return

def getBelowAvgFinalExamMarks(studentDetails):
    marks = list(studentDetails.values())
    finalTot = 0
    finalLen = 0
    for marksList in marks:
        finalTot = finalTot + marksList[2]
        finalLen = finalLen + 1
    finalAvg = finalTot / finalLen
    print("Displaying the student(s) whose final marks are below the average of", finalAvg)

    belowAvgFinal = {}
    for student in studentDetails:
        if studentDetails[student][2] < finalAvg:
            belowAvgFinal[student] = studentDetails[student][2]
    print(belowAvgFinal)
    return

def getBelowAvgOverallMarks(studentDetails):
    marks = list(studentDetails.values())
    overall = 0
    overallLen = len(marks)
    for marksList in marks:
        for num in marksList:
            overall += num
    overallAvg = overall / overallLen
    print(overallAvg)
    print("Displaying the student(s) whose overall marks are below the average of", overallAvg)

    belowAvgOverall = {}
    for student in studentDetails:
        if sum(studentDetails[student]) < overallAvg:
            belowAvgOverall[student] = sum(studentDetails[student])
    print(belowAvgOverall)
    return

def getTotalMarks(studentDetails):
    total = []
    marks = list(studentDetails.values())
    total = 0
    for i in marks:
        for num in i:
            total = total + num
        print(total)
        total = 0

    import turtle
    wn = turtle.Screen()
    turtle = turtle.Turtle()
    turtle.color("blue", "lightblue")
    for marks in range(total):
        turtle.begin_fill()
        turtle.forward(10)
        turtle.left(90)
        turtle.forward(marks)
        turtle.left(90)
        turtle.forward(10)
        turtle.left(90)
        turtle.forward(marks)
        turtle.left(90)
        turtle.end_fill()
        turtle.forward(20)

    wn.exitonclick()


def displayReports(allStudentsDetails): 
    userinput = input("Enter 1 to get the average DF report marks \n"+
                   "Enter 2 to get the average project report marks \n"+
                   "Enter 3 to get the average final exam marks \n"+
                   "Enter 4 to get the overall marks \n"+
                   "Enter 5 to get the selected student marks \n"+
                  "Enter 6 to get the bar chart of the total marks \n")
    if userinput == "1":
        getBelowAvgDFMarks(allStudentsDetails)
    elif userinput == "2":
        getBelowAvgProjectMarks(allStudentsDetails)
    elif userinput == "3":
        getBelowAvgFinalExamMarks(allStudentsDetails)
    elif userinput == "4":
        getBelowAvgOverallMarks(allStudentsDetails)
    elif userinput == "5":
        displaySelectedStudentsMarks(allStudentsDetails)
    elif userinput == "6":
        getTotalMarks(allStudentsDetails)
        return

def displaySelectedStudentsMarks(selectedStudentsDetails):
    for studentNameKey in selectedStudentsDetails:
        displayAStudentsDetail(studentNameKey, selectedStudentsDetails[studentNameKey])

def displayAStudentsDetail(studentName, studentMarkList):
    print("Student name: ", studentName)
    print("DF marks: ", studentMarkList[0], "\tProject marks: ", studentMarkList[1], "\tFinal exam: ", studentMarkList[2], "\tTotal marks: ", sum(studentMarkList))


menu()

Когда вы вводитезначение «6» («получить гистограмму итоговых оценок»), в меню «Отображение отчета о студентах» второго уровня должна быть показана гистограмма со значением итогового экзамена для каждого учащегося.

Спасибо.

1 Ответ

0 голосов
/ 25 мая 2018

Я считаю, что ваш getTotalMarks() - полный беспорядок.Не столько по черепахе, сколько по питону.Одна подсказка в том, что у вас есть две разные переменные с одинаковыми именами:

total = []
marks = list(studentDetails.values())
total = 0

Я собираюсь предложить три изменения.Во-первых, импортируйте черепаху следующим образом:

from turtle import Turtle, Screen

Во-вторых, запустите вашу menu() процедуру следующим образом:

wn = Screen()

menu()

wn.exitonclick()

Т.е. не помещайте exitonclick() внутри функции, сделайтеэто последнее, что делает ваш код.Наконец, замените getTotalMarks() следующим текстом:

def getTotalMarks(studentDetails):
    totals = [sum(scores) for scores in studentDetails.values()]

    turtle = Turtle()
    turtle.color("blue", "lightblue")

    for total in totals:
        turtle.begin_fill()
        turtle.forward(10)
        turtle.left(90)
        turtle.forward(total)
        turtle.left(90)
        turtle.forward(10)
        turtle.left(90)
        turtle.forward(total)
        turtle.left(90)
        turtle.end_fill()

        turtle.forward(20)

Ничего особенного, но это должно заставить вас двигаться вперед.

...