Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/activity_quiz/Application.py
blob: 3172741e6bc465e44fab0c1a47bdee1745f5e661 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
'''
Created on 11 Jan 2013

@author: cgueret
'''
from gi.repository import Gtk
import csv
import random

class Data(object):
	'''
	Class used to interface with the data
	'''
	def __init__(self):
		'''
		Constructor
		'''
		self._ranks = {}
		with open('ranks.csv', 'rb') as csvfile:
			reader = csv.reader(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
			for row in reader:
				self._ranks[row[0]] = int(row[1])

	def get_random_subset(self, size):
		'''
		Generate a random subset of pairs (country, rank)
		'''
		subset = {}
		while len(subset.keys()) != size:
			key = self._ranks.keys()[random.randint(0, len(self._ranks.keys())-1)]
			if key not in subset:
				subset[key] = self._ranks[key]
		return subset

	
class Main(object):
	def __init__(self):
		'''
		Constructor
		'''
		# Variable to count the number of points
		self._points = 0
		self._good_answer = -1
		self._data = Data()
		
		# Load the graphical user interface
		self._gui = Gtk.Builder()
		self._gui.add_from_file("GUI.glade")
		
		# Connect the buttons
		for number in range(1, 5):
			button = self._gui.get_object("button%d" % number)
			button.connect("clicked", self.on_button_clicked, number)
		
		# Create a new question
		self.make_new_question()
		
	def get_widget(self):
		'''
		Return the main widget of the application
		'''
		return self._gui.get_object("main_box")

	def get_score(self):
		return self._points
	
	def set_score(self, value):
		self._points = value
		self._gui.get_object("score_zone").set_label(str(self._points))
	
	def make_new_question(self):
		'''
		Prepare a new question: pick a set of cities and update the buttons
		'''
		subset = self._data.get_random_subset(4).items()
		self._good_answer = 1
		for i in range(1, 5):
			(country, rank) = subset[i - 1]
			if rank > subset[self._good_answer-1][1]:
				self._good_answer = i
			self._gui.get_object("button%d" % i).set_label(country)
	
	def on_button_clicked(self, button, number):
		'''
		Function called when one of the buttons is clicked
		'''
		# Check the answer picked
		if number == self._good_answer:
			self.set_score(self.get_score() + 1)
			
		# Create a new question
		self.make_new_question()