#!/usr/bin/env python3 # coding: iso-8859-15 # Importation pour creation Fenetre import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GLib, Pango from random import choice class FenetrePrincipale: # ******************************************************************************************** # ----------------- Initialisation Fenetre --------------------------------------------------- # ******************************************************************************************** nbr_questions = 0 bonnes_reponses = 0 question = [] chances_restantes = 2 def __init__(self): self.gladefile = "python_13.glade" self.builder = Gtk.Builder() self.builder.add_from_file(self.gladefile) self.builder.connect_signals(self) # Construction Fenetre Principale self.window = self.builder.get_object("Fenetre_Base") # Récupêration objets self.label_score = self.builder.get_object("label_score") self.label_intitule_question = self.builder.get_object("label_intitule_question") self.label_question = self.builder.get_object("label_question") self.entry_reponse = self.builder.get_object("entry_reponse") self.bouton_ok = self.builder.get_object("bouton_ok") self.bouton_solution = self.builder.get_object("bouton_solution") self.image_smiley = self.builder.get_object("image_smiley") self.dialogue_a_propos = self.builder.get_object("Dialogue_A_Propos") self.dialogue_solution = self.builder.get_object("Dialogue_Solution") self.dialogue_ouvrir_fichier = self.builder.get_object("Dialogue_Ouvrir") # Valeur au départ self.image_smiley.set_from_file("bof.png") self.bouton_solution.set_sensitive(False) # pour le pulse de l'Entry Recherche coté gauche self.timeout_id = None self.entry_reponse.set_progress_pulse_step(0.1) # Call self.do_pulse every 100 ms self.timeout_id = GLib.timeout_add(100, self.do_pulse, None) # chargement try: self.chargement("questions_auteurs.txt") self.nouvelle_question() except IOError: self.Destroy() # Permet de détruire la fenetre principale self.window.connect("delete-event", Gtk.main_quit) self.window.show() #self.dialogue_solution.destroy() # ******************************************************************************************** # -------------------- Definition Méthodes --------------------------------------------------- # ******************************************************************************************** def chargement(self, fichier): # Lecture du fichier des questions try: with open(fichier, 'r') as f: consigne = f.readline().strip('\n') # on remet les questions à zéro -- Ajout parceque menu chargement nouveau questionnaire_choisi # sinon les nouvelles questions se rajouteraient aux anciennes self.question[:] = [] for ligne in f: self.question.append(ligne.strip(' \n')) # Toujours a cause choix nouveelle question self.nbr_questions = 0 self.bonnes_reponses = 0 self.image_smiley.set_from_file("bof.png") #--------------------------- self.label_intitule_question.set_text(consigne) except IOError: # as (errno, strerror): #dialogue = wx.MessageDialog(self, 'Erreur de lecture fichier: ' + strerror, "Erreur!", wx.OK | wx.ICON_ERROR) #dialogue.ShowModal() # Permet d'afficher la boite Modale qui reste tant que l'on clique pas dessus #dialogue.Destroy() # Pour détruire la fenêtre après le clic raise IOError # relance l'exception # ******************************************************************************************** def nouvelle_question(self): self.chances_restantes = 2 self.bouton_solution.set_sensitive(False) #aller chercher nouvelle question self.question_reponse = choice(self.question) self.nbr_questions +=1 self.label_question.set_text(self.question_reponse.split(':')[0] + ' ?') # Efface la réponse précedante self.entry_reponse.set_text('') # Positionne ou l'on doit répondre self.entry_reponse.grab_focus() # ******************************************************************************************** # Fonction pour faire pulser l'Entry Recherche à gauche def do_pulse(self, user_data): self.entry_reponse.progress_pulse() return True # ******************************************************************************************** # Fonction pour le bouton OK - On vérifie la réponse def on_bouton_ok_clicked(self, button): self.chances_restantes -= 1 question_suivante = False reponse = self.entry_reponse.get_text().lower() reponse_ok = self.question_reponse.split(':')[1].lower() if reponse == reponse_ok: #reponse == unicode(reponse_ok): #print("ok") #------------------------------------------------------------- if self.chances_restantes == 1: self.bonnes_reponses += 1 self.image_smiley.set_from_file("super.png") else: self.bonnes_reponses += 0.5 self.image_smiley.set_from_file("bien.png") question_suivante = True else: #print("faux") #------------------------------------------------------------- self.image_smiley.set_from_file("rate.png") if self.chances_restantes == 1: #Autoriser la Solution self.bouton_solution.set_sensitive(True) else: #self.donner_solution(wx.MouseEvent()) #print("double Faux") self.on_bouton_solution_clicked(self) if question_suivante: # Affichage score self.label_score.set_text(str(self.bonnes_reponses) + "/" + str(self.nbr_questions)) # Nouvelle question self.nouvelle_question() else: # Efface la réponse précedante self.entry_reponse.set_text('') # Positionne ou l'on doit répondre self.entry_reponse.grab_focus() # ******************************************************************************************** # Fonction pour le bouton Solution def on_bouton_solution_clicked(self, button): print("solution") reponse_ok = self.question_reponse.split(':')[1].lower() # incsription rémonse dans label self.dialogue_solution.format_secondary_text(reponse_ok) self.dialogue_solution.run() self.image_smiley.set_from_file("bof.png") # Affichage score self.label_score.set_text(str(self.bonnes_reponses) + "/" + str(self.nbr_questions)) # Nouvelle question self.nouvelle_question() self.dialogue_solution.hide() # ******************************************************************************************** # ******************************************************************************************** # Fonction pour le menu Fichier -> Ouvrir def on_Menu_ouvrir_activate(self, menuitem, data=None): print("Ouverture") self.response = self.dialogue_ouvrir_fichier.run() print(self.response) # pour la fermeture avec la croix self.dialogue_ouvrir_fichier.hide() # ******************************************************************************************** # Fonction pour le bouton dialogue Ouvrir OK def on_Bouton_Ouvrir_OK_clicked(self, button): print("Bouton OK") # 2 set the current folder in the file chooser #self.response.set_current_folder(self.current_folder) """if os.path.isdir(os.getenv("HOME")+'/linuxcnc/configs'): self.fcd.add_shortcut_folder(os.getenv("HOME")+'/linuxcnc/configs') self.response = self.fcd.run() if self.response == gtk.RESPONSE_OK: print "Selected filepath: %s" % self.fcd.get_filename() print self.fcd.get_uri()""" self.dialogue_ouvrir_fichier.hide() # ******************************************************************************************** # Fonction pour le bouton dialogue Ouvrir ANNULER def on_Bouton_Ouvrir_Annuler_clicked(self, button): print("Bouton Annuler") self.dialogue_ouvrir_fichier.hide() # ******************************************************************************************** # Fonction pour le menu Fichier -> Quitter def on_Menu_quitter_activate(self, menuitem, data=None): Gtk.main_quit() # ******************************************************************************************** # Fonction pour le menu Aide -> A propos def on_Menu_A_Propos_activate(self, menuitem, data=None): self.response = self.dialogue_a_propos.run() self.dialogue_a_propos.hide() # ******************************************************************************************** # ----------------- Autres classes ----------------------------------------------------------- # ******************************************************************************************** # Si ceci est exécuté seul, exécutez ce qui suit après le 'si' # Si cette classe est importée dans un autre programme, le code après le 'if' # pas exécuté. Cela rend le code plus flexible. if __name__ == "__main__": main = FenetrePrincipale() Gtk.main()