bouffffi
Messages postés2Date d'inscriptionvendredi 15 janvier 2010StatutMembreDernière intervention16 janvier 2010
-
16 janv. 2010 à 17:10
nyko77
Messages postés6Date d'inscriptionvendredi 8 septembre 2006StatutMembreDernière intervention29 janvier 2010
-
18 janv. 2010 à 15:53
Bonjour à tous,
Je suis débutant et j'ai fait un programme pour calculer la probabilité d'un nombre, puis j'ai voulu le faire avec une interface graphique, grace à Tkinter. Seulement voila, sa ne marche pas, je n'arrive pas à faire un bon script.
Voici le script "normal" :
Running = True #variable principale
RunningNombreDeJete = True #variables pour les boucles d'exceptions.
RunningDeChoisi = True
RunningNombreChoisi = True
RunningRejouer = True
while Running:
while RunningNombreDeJete: #boucles d'exceptions
try: #exception
print ""
NombreDeJete = int(raw_input ("Entrer le nombre de fois que sera jeté le dé : "))
break
RunningNombreDeJete = False
except ValueError:
print ""
print "veuillez entrer un nombre entier valide"
RunningNombreDeJete = True
while RunningDeChoisi:
try:
print ""
print "Choisisser le dé que vous voulez dans la liste : "
print "1- Pièce de monnaie"
print "2- Dé à 4 faces"
print "3- Dé à 6 faces"
print "4- Dé à 8 faces"
print "5- Dé à 10 faces"
print "6- Dé à 12 faces"
print "7- Dé à 20 faces"
print "8- Dé à 100 faces"
DeChoisi = int(raw_input ("Entrer le n° du dé : "))
break
RunningDeChoisi = False
except ValueError:
print ""
print "Veuillez entrer un nombre entier valide"
RunningDeChoisi = True
NombreMaxi = 0 #choix du nombre du dé maxi
if DeChoisi == 1:
NombreMaxi = 2
elif DeChoisi == 2:
NombreMaxi = 4
elif DeChoisi == 3:
NombreMaxi = 6
elif DeChoisi == 4:
NombreMaxi = 8
elif DeChoisi == 5:
NombreMaxi = 10
elif DeChoisi == 6:
NombreMaxi = 12
elif DeChoisi == 7:
NombreMaxi = 20
elif DeChoisi == 8:
NombreMaxi = 100
print ""
print "Choisisser maintenant un nombres dont vous voulez calculer la probabilité, allant de 1 à",NombreMaxi," : "
while RunningNombreChoisi:
try:
print ""
NombreChoisi = int(raw_input (""))
break
RunningNombreChoisi = False
except ValueError:
print ""
print "Veuillez entrer un nombre entier valide"
RunningNombreChoisi = True
i = 0
Resultat = 0
while i < NombreDeJete: #calcul de la probabilité
import random
De = random.randint (1,NombreMaxi)
i += 1
if De == NombreChoisi:
Resultat = Resultat + 1
print "Le nombre",NombreChoisi,"est apparu",Resultat,"fois en",NombreDeJete,"jet de dé à",NombreMaxi,"faces ."
print "" #inscription du resultat
while RunningRejouer: #boucle qui demande à l'utilisateur s'il veut recommencer
try:
print ""
Rejouer = int(raw_input ("rejouer? 1 pour oui et 0 pour non : "))
break
RunningRejouer = False
except ValueError:
print ""
print "Veuillez entrer un nombre entier valide"
RunningRejouer = True
if Rejouer == 1:
Running = True
print ""
print "________________________________________________________________________________"
print ""
elif Rejouer == 0:
Running = False
Et avec Tkinter :
from Tkinter import *
def Calculs():
i=0
Resultat = 0
while i<NombreDeJete:
import random
De = random.randint (1,NombreMaxi)
i +=1
if De == NombreChoisi:
Resultat += 1
fen3 = Tk()
Resultat=Label(fen3, fg="red")
Resulat.pack()
def NombreMaxi1():
NombreMaxi = 2
def NombreMaxi2():
NombreMaxi = 4
def NombreMaxi3():
NombreMaxi = 6
def NombreMaxi4():
NombreMaxi = 8
def NombreMaxi5():
NombreMaxi = 10
def NombreMaxi6():
NombreMaxi = 12
def NombreMaxi7():
NombreMaxi = 20
def NombreMaxi8():
NombreMaxi = 100
def NombreDeJete():
fen2 = Tk()
text2=Label(fen2, text = "Entrer le nombre de fois que sera jeté le dé : ",fg = "black")
BoutonQuitter2 = Button(fen2, text="Quitter",fg = "black", command = fen.quit)
NombreDeJete = Entry(fen2)
text3=Label(fen2, text = "choisissez maintenant le dé voulu : ",fg = "black")
BoutonDe1 = Button(fen2, text="Pièce de monnaie", command = NombreMaxi1 = 2)
BoutonDe2 = Button(fen2, text="Dé à 4 faces", command = NombreMaxi2)
BoutonDe3 = Button(fen2, text="Dé à 6 faces", command = NombreMaxi3)
BoutonDe4 = Button(fen2, text="Dé à 8 faces", command = NombreMaxi4)
BoutonDe5 = Button(fen2, text="Dé à 10 faces", command = NombreMaxi5)
BoutonDe6 = Button(fen2, text="Dé à 12 faces", command = NombreMaxi6)
BoutonDe7 = Button(fen2, text="Dé à 20 faces", command = NombreMaxi7)
BoutonDe8 = Button(fen2, text="Dé à 100 faces", command = NombreMaxi8)
text4=Label(fen2, text="quel nombre, compris entre 1 et le maximum voulez vous connaitre la probabilité?", fg = "black")
NombreChoisi = Entry(fen2)
BoutonCalculer = Button(fen2, text="Calculer!", command = Calculs)
text2.pack()
NombreDeJete.pack()
text3.pack()
BoutonDe1.pack()
BoutonDe2.pack()
BoutonDe3.pack()
BoutonDe4.pack()
BoutonDe5.pack()
BoutonDe6.pack()
BoutonDe7.pack()
BoutonDe8.pack()
text4.pack()
NombreChoisi.pack()
BoutonCalculer.pack()
BoutonQuitter2.pack()
fen = Tk()
text=Label(fen, text="Bonjour. Vous allez pouvoir calculer la probabilité d'un nombre.",fg = "black")
BoutonQuitter = Button(fen, text="Quitter",fg = "black", command = fen.quit)
BoutonCommencer = Button(fen, text="Commencer",fg = "black", command = NombreDeJete)
text.pack()
BoutonCommencer.pack()
BoutonQuitter.pack()
fen.mainloop()
Je sais, je me suis compliqué la vie dans mes scripts, mais je ne connait pas assez de balises pour faire mieux. Si quelqu'un pouvait m'aider à trouver un bon script pour Tkinter, en s'aidant de ce que j'ai fait, je suis preneur.
nyko77
Messages postés6Date d'inscriptionvendredi 8 septembre 2006StatutMembreDernière intervention29 janvier 2010 18 janv. 2010 à 15:53
Bonjour,
Il y a beaucoup d'erreur dans ton code. voila quelques idées en vrac:
Tout d'abord tu as un problème avec les variables globales et locales. Par exemple la variable NombreMax est défini dans tes fonctions NombreMaxix() mais n'est plus accessible dans ta fonction Calculs(). C'est le cas pour d'autres variables que tu utilises.
Ensuite NombreDeJete = Entry(fen2) ne retourne pas la valeur qui se trouve dans l'entry, mais l'instance d'un widget Tkinter, il faut utliser NombreDeJete.get() pour récupérer la valeur. A noter que le nom de l'entry est le même que celui de la fonction, ça risque de poser des problèmes. Pareil avec la variable Resultat, elle se transforme en label à la fin de ta fonction Calcul().
Il vaut mieux utiliser des fenêtre TopLevel au lieu de recréer une instance Tk() pour chaque fenêtre.
Ne met pas de majuscule à tes noms de variable, par convention, on l'utilise pour les nom de classe.
En python on utilise très rarement le while, utilise plutôt les for: for i in range(NombreDeJete): au lieu de while i<NombreDeJete:, ça évite d'incrémenter une variable.
Voilà comment j'aurai fais (sans utiliser la POO):
# -*- coding: utf-8 -*-
import Tkinter as tk
import random
#calcul le nombre de dé
def onCalcul():
#si l'utilisateur à saisi des nombre erronés
try:
nombreDe = int(spinboxNombreDe.get())
nombreChoisi = int(spinboxNombreChoisi.get())
except:
reponse.set("Veuillez entrer un nombre entier valide")
return
#si le nombre choisi est supérieur au nombre de face
if nombreChoisi > nombreFace.get():
reponse.set("Le nombre choisi est trop grand")
return
resultat = 0
for i in range(nombreDe):
de = random.randint (1,nombreFace.get())
if de == nombreChoisi:
resultat += 1
reponse.set(str(resultat))
fen = tk.Tk()
listFace = (2, 4, 6, 8, 10, 12, 20, 100)
tk.Label(fen, text="Nombre de dé lancé: ").grid(row=0, column=0, sticky=tk.E)
spinboxNombreDe = tk.Spinbox(fen, from_=1, to=10000, width=5)
spinboxNombreDe.grid(row=0, column=1, sticky=tk.W)
tk.Label(fen, text="Nombre de face sur le dé: ").grid(row=1, column=0, sticky=tk.E)
nombreFace = tk.IntVar()
frameFace = tk.Frame(fen)
for i, face in enumerate(listFace):
radio = tk.Radiobutton(frameFace, text=str(face), variable=nombreFace, value=face)
radio.pack(side=tk.LEFT)
if not i:
radio.select()
frameFace.grid(row=1, column=1)
tk.Label(fen, text="nombre choisi: ").grid(row=2, column=0, sticky=tk.E)
spinboxNombreChoisi = tk.Spinbox(fen, from_=1, to=100, width=5)
spinboxNombreChoisi.grid(row=2, column=1, sticky=tk.W)
tk.Button(fen, text="Calculer", command=onCalcul).grid(row=3, column=0, columnspan=2, pady=10)
tk.Label(fen, text="Réponse: ").grid(row=4, column=0, sticky=tk.E)
reponse = tk.StringVar()
tk.Label(fen, textvariable=reponse, fg="red").grid(row=4, column=1, sticky=tk.W, pady=10)
fen.mainloop()
n'hésite pas à aller voir la documention de Tkinter.