How To Randomize The Order Of Radio Buttons In Pyqt
Solution 1:
If you load your answer choices into a container, you can use Python's random
(link) library with one or both of the following tools:
random.choice(seq)
(link) which makes a random choice of the possible items provided inseq
random.sample(pop, k)
(link) which choicek
unique elements from the possible choices provided inpop
, without replacing, which I think is key in your situation because you don't want to have the same answer displayed twice on the same question.
This would simplify your current if-statement block, from
if randomnumber == 0:
layout.addWidget(self.Correctanswer)
layout.addWidget(self.Incorrectans1)
layout.addWidget(self.Incorrectans2)
layout.addWidget(self.Incorrectans3)
to
choices = [self.Correctanswer, self.Incorrectans1, self.Incorrectans2, self.Incorrectans3]
for q in range(4):
layout.addWidget(random.sample(choices, 1))
Also just thought of another cool idea. If you have a large "pool" of possible incorrect answers, you can define a function specifically to provide a random selection of wrong answers. Something like:
defprovideWrongAnswers(self, number):
return random.sample(self.allWrongAnswersPool, number)
which would provide you with number
incorrect answers to add to the layout along with the correct.
In [7]: choices =range(1,11)
In [9]: random.sample(choices, 3) # returns a different orderof choices eachtimeOut[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]
Finally, random.shuffle(x)
(link) be another method, as it takes the sequence x
and mixes them up in place. So you could combine the random.sample(wrongChoices, 3)
idea which gives you three random incorrect answers, then add in the correct answer and to make sure the correct answer isn't always at the bottom, give em a final stir with random.shuffle(allAnswerChoices)
Solution 2:
The current structure of your seems over-complicated. It would be much simpler to randomize the question choices, rather than the widgets themselves.
Here's a simple demo that shows how that could be done:
import sys, random
from PyQt4 import QtGui
classMultipleChoice(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 inrange(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()
defhandleNext(self):
self.index += 1if 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 inenumerate(choices):
button = self.buttonGroup.button(index)
button.setChecked(False)
button.setText(choice)
self.buttonGroup.setExclusive(True)
defhandleChoice(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_())
Post a Comment for "How To Randomize The Order Of Radio Buttons In Pyqt"