Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de boucle avec un bouton valider tkinter

    20 septembre 2019 à 13:07:10

    Bonjour,

    je suis en train d'essayer de réaliser un QCM.

    Je fait appel à un fichier csv qui contient plus de trois cent question , dès lors, je fait un random sample pour n'avoir que 15 questions

    jusque là, pas de soucis...

    Ensuite, pour poser les question une à une, je fais appel à une boucle où je reconfigure à chaque fois mon groupe de bouton radio. mais là où ça foire, c'est lorsque je veux valider, je ne parviens pas à inscrire une commande correcte sur ce bouton 

    	def branche_1(self):
    	#Exemple de chemin :    'C:\\Users\\user\\Desktop\\TIPE\\tableau\\Frequence1_bis.csv'
    	# /!\ Bien mettre les double slash et les guillemets. /!\
    
    
    	    #Tableau sera une liste de listes [[t1, acc1], [t2,acc2] ,... , [tn,accn]]
    	    #variable propres
    		Tableau = []
    		question = []
    		reponseA = []
    		reponseB = []
    		reponseC = []
    		solution = []
    		image = []
    		fileName=("./Data/branche_1.csv")
    
    		#on efface les labels inutiles
    		self.Bouton_yes.destroy()
    		self.Bouton_no.destroy()
    		self.Label1.destroy()
    		self.Label2.destroy()
    		self.Label3.destroy()
    
    		#on modifie le titre
    		self.Titre.config(text= "BRANCHE I - Connaissance de la réglementation sur la chasse et \n"\
    							"la conservation de la nature (questions n° 1 à 15)")
    
    		#boutons radio
    		self.svRadio = StringVar()
    		self.svRadio.set('0') #set à 0 pour tout décocher, sinon la value du bouton qu'on veut voir coché
    		self.case1 = Radiobutton(self.Mafenetre, text="", font = self.font12, variable=self.svRadio, value='1', height = 5, width = 35, relief = 'raised', wraplength = 300, anchor = W, justify = LEFT)
    		self.case1.grid(sticky = W, row = 2, column = 0, padx = 15, pady = 5)
    		self.case2 = Radiobutton(self.Mafenetre, text="", font = self.font12, variable=self.svRadio, value='2', height = 5, width = 35, anchor = W, wraplength = 300, relief = 'raised', justify = LEFT)
    		self.case2.grid(sticky = W, row = 3, column = 0, padx = 15, pady = 5)
    		self.case3 = Radiobutton(self.Mafenetre, text="", font = self.font12, variable=self.svRadio, value='3', height = 5, width = 35, anchor = W, wraplength = 300, relief = 'raised', justify = LEFT)
    		self.case3.grid(sticky = W, row = 4, column = 0, padx = 15, pady = 5)
    
    		#bouton vérif
    		self.Bouton_verif = Button(self.Mafenetre, text ='Valider', command = self.get_rep)
    		self.Bouton_verif.configure (font=self.font10b)
    		self.Bouton_verif.grid(sticky = SE, row = 4, column = 4, padx = 15, pady = 15)
    
    	    #ouverture et lecture du fichier csv
    		f = open(fileName)
    		csv_f = csv.reader(f, delimiter = ";")
    	    #on va melanger la liste et ne prendre que 15 question au hasard
    		Tableau = sample(list(csv_f), k=17)
    	    # row = ligne ==> ça met le tableur dans le tableau sous forme de liste de listes
    		for row in csv_f:
    			Tableau.append(row)
    	    #print (Tableau)
    		f.close
    
    	    #on récupère les "sous listes" du Tableau
    		n = len(Tableau)
    		for i in range(n-1):
    			question.append(Tableau[i][0])
    			reponseA.append(Tableau[i][1])
    			reponseB.append(Tableau[i][2])
    			reponseC.append(Tableau[i][3])
    			solution.append(Tableau[i][4])
    			image.append(Tableau[i][5])
    
    		i=0
    		d = len(question)
    		print (str(d))
    		d-=1
    		print (str(d))
    		for i in range (d):
    			i +=1
    			self.poseQuestion.config(text="question " + str(i) +" : " +question [i])
    			#image...
    			self.image = PhotoImage(file="Img/"+image [i])
    			self.Img.config(image = self.image)
    			self.case1.config(text=reponseA [i], value=reponseA [i])
    			self.case2.config(text=reponseB [i], value=reponseB [i])
    			self.case3.config(text=reponseC [i], value=reponseC [i])
    			print ( "question " + str(i) +" : " +question [i] +":\n"+ "a: "+ reponseA [i] +"\nb: "+ reponseB [i] +"\nc: "+ reponseC [i] + "\nS: " + solution [1] + "\nPhoto: " + image [i])
    
    			#break
    		#return (question, reponseA, reponseB, reponseC, solution, image)
    
    
    	def get_rep(self):
    
    
    		self.Q=self.svRadio.get()
    		print("self.q:" + str(self.Q), (type(self.Q)))
    		self.branche_1()

    Quand je fais appel à la commande get-rept(), la boucle se remet à zéro...

    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2019 à 18:02:33

      Euh, tu as fait une boucle en pensant que ça allait permettre présenter les questions une à une dans l'interface graphique ?

      J'ai un peu de mal à comprendre le code et je vois beaucoup d'erreurs sur des choses basiques, des trucs que je suis surpris de voir chez quelqu'un qui aborde les interfaces graphiques.

      Par exemple la boucle for ligne 69, le principe de la boucle for c'est qu'elle gère elle-même l'indice et son incrémentation, pas besoin de le faire explicitement (initialiser i et l'incrémenter comme tu le fais ligne 64 et 70).

      Tu suis un cours en particulier ? On peut avoir le lien pour jauger de sa qualité ?

      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        20 septembre 2019 à 18:53:53

        L'incrémentation ligne 70 me permet d'obtenir "1" la la ligne 71 dans la première boucle lorsque je fait

        self.poseQuestion.config(text="question " + str(i) +" : " +question [i])


        si je ne le fais pas, mon questionnaire commence à "0".

        ET oui , la boucle est destinée à poser les question une à une, après validation via le 

        Bouton_verif

        Je ne suis pas de cours, je suis autodidacte...

        -
        Edité par pierre3401 20 septembre 2019 à 19:01:49

        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2019 à 20:22:17

          pierre3401 a écrit:

          Je ne suis pas de cours, je suis autodidacte...

          Tu te documentes forcément quelque part... C'est ça qui m'intéresse, parce qu'on trouve des bons cours/tutos, et d'autres nettement moins bons.

          Le cours de G. Swinnen est plutôt bon : https://inforef.be/swi/python.htm (lien direct vers le pdf : https://inforef.be/swi/download/apprendre_python3_5.pdf ).

          pierre3401 a écrit:

          si je ne le fais pas, mon questionnaire commence à "0".

          Ça fait bizarre parce que tu initialise i = 0 avant la boucle (alors que ça ne sert à rien), ça fait penser que tu ne sais pas comment les boucles for marchent.

          Tu peux simplement écrire ça :

          for i in range(x):
              j = i+1
              self.poseQuestion.config(text="question " + str(j) +" : " +question [j])

          pierre3401 a écrit:

          ET oui , la boucle est destinée à poser les question une à une, après validation via le

          Bouton_verif

          Je pense qu'il faudra pas faire de boucle, mais stocker la liste des questions dans la classe (ou une des classes si tu en as plusieurs) avec l'indice de la question actuelle, et à chaque fois que tu veux passer à la question suivante, incrémenter l'indice et afficher la question au nouvel indice.

          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

          problème de boucle avec un bouton valider tkinter

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown