添加多项选择分数

Posted

技术标签:

【中文标题】添加多项选择分数【英文标题】:Add multiple choice score 【发布时间】:2018-05-01 19:56:55 【问题描述】:

我需要将多项选择测验的分数相加。

这是我的代码:

from tkinter import *
import time, os, random

global questions

questions = []

questions = ['''
What does ? equal to:

43+(5x(6)**8)/8-8+8 = ?

1) 10356
2) 1049803
3) 202367
4) 12742130
5) 343321

''',
'''
Find the range, the median, the mode and the mean:

>>> 232, 4343, 434, 232.4, 43, 5453, 434, 232, 645, 23.3, 53453.3, 434 <<<

1) 53410.3, 2943.5, 434, 5496.58
2) 53410.3, 5956, 434, 5453.28
3) 232, 43, 3452, 421, 642
4) 232, 43, 43, 434
5) 232, 5453, 645, 53453.3

''',
'''
In 2004, the minimum wage in Ontario was $7.15.
In 2008, it was $8.15. What is the rate of change?

1) $0.90
2) $3.98
3) $1.54
4) $0.40
5) $1.80

''',
'''
Find the value of n:

--------------------------------------

    43n/2n  x (99.99/9)x7 = 99.99n  

--------------------------------------

1) n = 99.92
2) n = 12.43
3) n = 16.73
4) n = 104.4
5) n = 3.98

''',
'''
Which one is NOT a linear equation?

1) y = 54x*3
2) y = 23x*7
3) y = -x
4) All of the Above
5) None of the Above

''',
'''
What is the formula for finding the surface area for a sphere?

1) 4/3πr**3
2) πr**2
3) 2πrh + 2πr**2
4) πd
5) 4πr**2

''',
'''
Which variable represents the slope?
y = mx + c

1) y
2) m
3) x
4) c
5) None of the above
''',
'''
An isosceles triangle has the top angle of 6x
and a supplementary angle of a base angle is 21x. What are the
measures of the angles of isosceles triangle?

1) 22.5, 78.75, 78.75
2) 108.97, 35.52, 35.52
3) 76.8, 51.6, 51.6
4) 20, 20, 140
5) 43.6, 5.5, 98.53

''',
'''
A sphere fits inside a rectangular box of 6cm by 6cm by 7cm.
What is the greatest possible volume of the sphere? 

1) 113.04 cm*2
2) 110.46 cm*3
3) 113.04 cm*3
4) 110.46 cm*2
5) 142.9 cm*3

''',
'''
If the area of an isosceles triangle is 196 cm**2
and the height is 19.6 cm, what would it's perimeter be?

1) 53.9 cm
2) 64 cm
3) 76 cm
4) 32.43 cm
5) 32.32 cm

'''
]
global answers
global picked
global userans
global ansRandOrder
global score

answers = ['2', '1', '4', '3', '5', '5', '2', '1', '3', '2']
picked = []
userans = []
ansRandOrder = []
score = 0

def nexT():
    global userans
    userans.append(e1.get())
    print(userans)
    print(ansRandOrder)
    global score
    global i
    i = 0
    if userans[i] == ansRandOrder[i]:
        score += 1
    i += 1
    print(score)
    self.destroy()
    ques()

def ques():
    global self
    global e1
    global ansRandOrder
    global picked

    self = Tk()

    w = 500
    h = 375

    ws = self.winfo_screenwidth()
    hs = self.winfo_screenheight()

    x = (ws/2) - (w/2)
    y = (hs/2) - (h/2)

    self.geometry('%dx%d+%d+%d' % (w, h, x, y))

    x = random.randint(0, 9)
    while x in picked:
        x = random.randint(0, 9)

    picked.append(x)

    ansRandOrder.append(answers[x])

    Label(self, text = '\n').pack()

    Label(self, text = questions[x]).pack()

    e1 = Entry(self)

    e1.pack()

    Label(self, text = '\n').pack()

    nex = Button(self, text = 'Next Question', command = nexT).pack()

    self.mainloop()



ques()

结果总是score = 0

如何正确加分?

【问题讨论】:

【参考方案1】:

我已经对您的代码进行了一些试验,但问题似乎出在其他地方。出于某种原因,脚本总是比较 nexT 中 if 的错误答案。其他时候,在不清除旧变量的情况下重新启动脚本后,它总是认为答案是正确的。

我认为如果您稍微清理一下代码,这个问题可能会消失。我建议您将代码重写为一个类,这是 Tkinter 脚本的常用方法。您的主要优势是:

可读性更强(调试起来会更容易) 不再有全局变量,您只需将变量作为类的一部分引用 (self.variable) 当程序退出时(目前它似乎无法正常执行),您可以使用 del MyClass 之类的东西来完成,以消除变量混乱。这种混乱可能是这个错误的行为不时发生变化的原因。

查看此线程,了解有关构建基于 tkinter 类的应用程序的一些很好的示例和说明: Best way to structure a tkinter application

作为您的测验的示例,它可能看起来像这样:(非功能性)

class Quiz():

    def __init__(self):

        self.questions = []
        self.WriteQuestions()

        self.answers = ['2', '1', '4', '3', '5', '5', '2', '1', '3', '2']
        self.picked = []
        self.userans = []
        self.ansRandOrder = []
        self.score = 0
        #"self." instead of "global"
        # Any def inside this class can refer to self."variable" and use it or update it.

        self.Question()

    def WriteQuestions(self):
        # All your questions here, just so they're out of the way.


    def NextQuestion(self):

        self.userans.append(e1.get())
        self.i = 0
        if self.userans[i] == ansRandOrder[i]:
            self.score += 1
        i += 1
        print(self.score)
        root.destroy() # You'll need to pick a name other than "self" for your tk window
        self.Question() 
        # self is a reserved keyword for classes and shouldn't be used for anything other
        # than telling a class that you're referring to one of its own variables or functions.


    def Question(self):

        # etc...



if __name__ == 'main':

    # set up tkloop here
    # create an instance of the Quiz class, e.g.
    Qz = Quiz()

    # finally, after the loop finishes:

    del Qz # To get rid of the old variables

【讨论】:

以上是关于添加多项选择分数的主要内容,如果未能解决你的问题,请参考以下文章

Sonata Admin Bundle - 添加多步骤批处理操作

怎么把小数化成分数的方法

数组修改操作符的使用

如何使用poi在excel中添加多选下拉菜单

DataTable如何添加多选,全选

Magento 2 - 在管理表单中添加多选状态