添加多项选择分数

时间:2017-11-17 23:34:44

标签: python tkinter

我需要在多项选择测验中加分。

这是我的代码:

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 个答案:

答案 0 :(得分:0)

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

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

  • 它的可读性更高(它更易于调试)
  • 不再有全局变量,而只是将变量作为类的一部分引用(self.variable)
  • 当程序退出时(此刻它似乎没有正常运行)你可以完成像del MyClass这样的东西来摆脱变量的混乱。这种混乱可能是这个bug的行为不时发生变化的原因。

看看这个帖子,了解一些关于构建基于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
相关问题