Programme avec Tkinter

bouffffi Messages postés 2 Date d'inscription vendredi 15 janvier 2010 Statut Membre Dernière intervention 16 janvier 2010 - 16 janv. 2010 à 17:10
nyko77 Messages postés 6 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 29 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.

Merci beaucoup à tous.

B.

1 réponse

nyko77 Messages postés 6 Date d'inscription vendredi 8 septembre 2006 Statut Membre Dernière intervention 29 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.
0
Rejoignez-nous