如何随机化pyq中单选按钮的顺序

2024-04-23 20:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个小测验,我希望单选按钮处于不同的位置。我让它在一定程度上发挥了作用,因为它在第一个问题中是随机的,但是在接下来的测验中它会保持这个顺序。我希望每次都随机。在

class MultipleChoice(QtGui.QWidget):
showTopicsSignal = pyqtSignal()

def __init__(self,parent=None):
    super(MultipleChoice, self).__init__(parent)

    self.initUI()


def initUI(self):
    self.Questions=[]
    self.Questionum = QLabel()
    self.Questioninfo = QLabel()
    self.Correctanswer = QRadioButton()
    self.Incorrectans1 = QRadioButton()
    self.Incorrectans2 = QRadioButton()
    self.Incorrectans3 = QRadioButton()
    self.Correctanswer.setAutoExclusive(True)
    self.Incorrectans1.setAutoExclusive(True)
    self.Incorrectans2.setAutoExclusive(True)
    self.Incorrectans3.setAutoExclusive(True)
    layout = QVBoxLayout(self)
    layout.addWidget(self.Questionum)
    layout.addWidget(self.Questioninfo)
    randomnumber = randint(0,3)
    if randomnumber == 0:
        layout.addWidget(self.Correctanswer)
        layout.addWidget(self.Incorrectans1)
        layout.addWidget(self.Incorrectans2)
        layout.addWidget(self.Incorrectans3)
    elif randomnumber == 1:
        layout.addWidget(self.Incorrectans1)
        layout.addWidget(self.Correctanswer)
        layout.addWidget(self.Incorrectans2)
        layout.addWidget(self.Incorrectans3)
    elif randomnumber == 2:
        layout.addWidget(self.Incorrectans1)         
        layout.addWidget(self.Incorrectans2)
        layout.addWidget(self.Correctanswer)
        layout.addWidget(self.Incorrectans3)
    elif randomnumber == 3:
        layout.addWidget(self.Incorrectans1)         
        layout.addWidget(self.Incorrectans2)
        layout.addWidget(self.Incorrectans3)
        layout.addWidget(self.Correctanswer) 

Tags: selftrueinitdeflayoutelifaddwidgetqradiobutton
2条回答

如果将答案选项加载到容器中,则可以将Python的randomlink)库与以下一个或两个工具一起使用:

  • random.choice(seq)link),它随机选择seq中提供的可能项
  • random.sample(pop, k)link)哪个选项kpop中提供的可能选择中唯一的元素,而不替换,我认为这在您的情况下很关键,因为您不希望在同一个问题上显示相同的答案两次。在

这将简化当前if语句块,从

if randomnumber == 0:
    layout.addWidget(self.Correctanswer)
    layout.addWidget(self.Incorrectans1)
    layout.addWidget(self.Incorrectans2)
    layout.addWidget(self.Incorrectans3)

^{pr2}$

又想到了另一个很酷的主意。如果你有一个很大的“池”可能的错误答案,你可以定义一个函数来提供随机选择的错误答案。比如:

def provideWrongAnswers(self, number):
    return random.sample(self.allWrongAnswersPool, number)

这将为您提供number个不正确的答案,并将其添加到布局中。在

In [7]: choices = range(1,11)
In [9]: random.sample(choices, 3)  # returns a different order of choices each time
Out[9]: [1, 7, 3]
In [10]: random.sample(choices, 3)
Out[10]: [6, 9, 3]
In [11]: random.sample(choices, 3)
Out[11]: [5, 4, 2]
In [12]: random.sample(choices, 3)
Out[12]: [3, 6, 1]
In [13]: random.sample(choices, 3)
Out[13]: [10, 8, 3]
In [14]: random.sample(choices, 3)
Out[14]: [1, 7, 2]
In [15]: random.sample(choices, 3)
Out[15]: [9, 7, 3]

最后,random.shuffle(x)link)是另一种方法,因为它采用序列x并将它们混合在一起。所以你可以把random.sample(wrongChoices, 3)的想法结合起来,随机给出三个不正确的答案,然后加上正确的答案,确保正确的答案并不总是在底部,用random.shuffle(allAnswerChoices)给他们最后一次搅拌

你现在的结构似乎太复杂了。随机化问题选择要简单得多,而不是小部件本身。在

下面是一个简单的演示,演示如何做到:

import sys, random
from PyQt4 import QtGui

class MultipleChoice(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MultipleChoice, self).__init__(parent)
        self.Questions = [
            ['What is the capital of Bhutan?',
             'Thimphu', 'Bujumbura', 'Suva', 'Kigali'],
            ['What is the capital of Yemen?',
             'Sana\'a', 'Malabo', 'Riyadh', 'Muscat'],
            ['What is the capital of Togo?',
             'Lomé', 'Dakar', 'Abuja', 'Nouakchott'],
            ]
        self.Questionum = QtGui.QLabel(self)
        self.Questioninfo = QtGui.QLabel(self)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.Questionum)
        layout.addWidget(self.Questioninfo)
        self.buttonGroup = QtGui.QButtonGroup(self)
        self.buttonGroup.buttonClicked.connect(self.handleChoice)
        for index in range(4):
            button = QtGui.QRadioButton(self)
            self.buttonGroup.addButton(button, index)
            layout.addWidget(button)
        self.buttonNext = QtGui.QPushButton('Next', self)
        self.buttonNext.clicked.connect(self.handleNext)
        layout.addWidget(self.buttonNext)
        self.index = -1
        self.handleNext()

    def handleNext(self):
        self.index += 1
        if self.index >= len(self.Questions):
            self.index = 0
        question = self.Questions[self.index]
        self.Questionum.setText('Question %d:' % (self.index + 1))
        self.Questioninfo.setText(question[0])
        choices = question[1:]
        random.shuffle(choices)
        self.buttonGroup.setExclusive(False)
        for index, choice in enumerate(choices):
            button = self.buttonGroup.button(index)
            button.setChecked(False)
            button.setText(choice)
        self.buttonGroup.setExclusive(True)

    def handleChoice(self, button):
        answer = self.Questions[self.index][1]
        if button.text() == answer:
            print('Right!')
        else:
            print('Wrong...')

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = MultipleChoice()
    window.show()
    sys.exit(app.exec_())

相关问题 更多 >