Posté le 14/02/2016 18:23
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 226 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 01/04/2016 17:52 | #
Oui, j'ai modifié le programme en local pour le rendre plus souple (je l'ai bien amélioré aussi), et j'avais le même problème.
Citer : Posté le 01/04/2016 17:56 | #
Ajouté le 01/04/2016 à 18:00 :
J'ai trouver la solution :
Ajouté le 01/04/2016 à 18:08 :
Mais si quelqu’un sait pourquoi mon programme ne marchait pas, ça m’intéresse quand même.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 01/04/2016 18:14 | #
J'ai mis des paramètres pour la taille de la grille, j'ai simplifié des fonctions, adapté la fenêtre (et pour info tes grid à 30 lignes/colonnes ne servent à rien, le canvas à (0, 0) et le bouton à (1, 0) fonctionnent très bien), évité le dimensionnement automatique qui coupait le bouton sur mon écran, intégré les manips avec deux grilles dans la classe Grille, tout nommé en anglais ( ), etc.
En fait pour ton programme j'ai compris tout à l'heure : ton callback (la fonction de gestion de l'évènement du bouton, jeu()), ne se terminait jamais. Hors l'actualisation de l'affichage à l'écran ne peut se faire que lorsqu'on revient à la boucle d'évènements (celle lancée avec mainloop()), donc il fallait que jeu() se termine (et dans mon cas time() se termine en effet ).
Citer : Posté le 01/04/2016 18:19 | #
Ok je vais faire tout ça merci beaucoup
Ajouté le 01/04/2016 à 18:44 :
Il faut utiliser les tabulations ou les espaces ?
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 01/04/2016 19:29 | #
Ben, l'indentation tu la fais comme tu veux... Enfin je conseille toujours les tabulations.
Citer : Posté le 01/04/2016 19:53 | #
Je n'ai pas du tout terminé mais j'ai fait un "éditeur" et à vrai dire je suis plutôt content de moi
Voici le code :
import tkinter
class Grille :
def __init__ (self) :
global taille
self.grille = []
for ligne in range(taille+2) :
self.grille.append([])
for colonne in range(taille+2) :
self.grille[ligne].append(0)
def generation (self, grille_2) :
global taille
for ligne in range(2,taille-1) :
for colonne in range(2,taille-1) :
i = 0
for X in [-1, 0, 1] :
for Y in [-1, 0, 1] :
if grille_2.grille[ligne+X][colonne+Y] == 1 :
i += 1
if i == 3 or (grille_2.grille[ligne][colonne] == 1 and i == 4) :
self.grille[ligne][colonne] = 1
class Interface :
def __init__ (self) :
global taille
self.fenetre = tkinter.Tk()
self.fenetre.title("Labyrinthe")
self.fenetre.geometry("790x695+1+1")
self.fenetre["bg"] = "blue"
self.canevas = tkinter.Canvas(self.fenetre, width =taille*6, height =taille*6, bg ='white')
self.canevas.grid(row =0, column =0, rowspan =30, padx =5, pady =5)
self.canevas.focus_set()
self.canevas.bind('<Key>',clavier)
self.boutton_valider = tkinter.Button(self.fenetre, text="Valider", fg="blue", width=10, command =time)
self.boutton_valider.grid(row =10, column =1, padx =5, pady =5)
self.boutton_quitter = tkinter.Button(self.fenetre, text="Quitter", fg="red", width=10, command =self.fenetre.destroy)
self.boutton_quitter.grid(row =29, column =1, padx =5, pady =5)
def afficher (self, grille) :
global taille
self.canevas.delete("all")
interface.canevas.create_rectangle(2+6*position[1], 2+6*position[0], 6+6*position[1], 6+6*position[0])
for ligne in range(1, taille-1) :
for collone in range(1, taille-1) :
if grille.grille[ligne][collone] == 1 :
self.canevas.create_rectangle(2+6*collone, 2+6*ligne, 6+6*collone, 6+6*ligne, fill="black")
def time ():
global grille
g = Grille()
g.generation(grille)
grille = g
interface.afficher(grille)
def clavier (event) :
global grille, position, interface
touche = event.keysym
print(touche)
print(position)
if touche == "Up":
position[0] -= 1
if touche == "Down":
position[0] += 1
if touche == "Right":
position[1] += 1
if touche == "Left":
position[1] -= 1
if touche == "Return" :
if grille.grille[position[0]][position[1]] == 1 :
grille.grille[position[0]][position[1]] = 0
else :
grille.grille[position[0]][position[1]] = 1
print(grille.grille[position[0]][position[1]])
interface.afficher(grille)
taille = 114
position = [int(taille/2), int(taille/2)]
global grille
grille = Grille()
interface = Interface()
interface.afficher(grille)
interface.fenetre.mainloop()
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 01/04/2016 20:00 | #
Des global taille ? Oh ben non, il faut que tu en fasses un attribut de la classe Grille...
Citer : Posté le 01/04/2016 20:43 | #
Ah oui désolé
Ajouté le 01/04/2016 à 22:52 :
Bizarre, je fais :
Pourquoi ???
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 01/04/2016 22:59 | #
le point virgule?
Citer : Posté le 01/04/2016 23:01 | #
Quel point virgule ?
Par contre, je me suis trompé en tapant, c'est :
Ajouté le 01/04/2016 à 23:33 :
J'ai un gros problème avec IntVar mais je ne vois pas du tout comment y remédier, voici le code :
import tkinter
class Grille :
def __init__ (self) :
self.taille = [tkinter.IntVar(),tkinter.IntVar()]
self.grille = []
for ligne in range(self.taille[0]+2) :
self.grille.append([])
for colonne in range(self.taille[1]+2) :
self.grille[ligne].append(0)
def generation (self, grille_2) :
for ligne in range(1,self.taille[0].get()-1) :
for colonne in range(1,self.taille[1].get()-1) :
i = 0
for X in [-1, 0, 1] :
for Y in [-1, 0, 1] :
if grille_2.grille[ligne+X][colonne+Y] == 1 :
i += 1
if i == 3 or (grille_2.grille[ligne][colonne] == 1 and i == 4) :
self.grille[ligne][colonne] = 1
class Interface :
def __init__ (self) :
global grille
self.fenetre = tkinter.Tk()
self.fenetre.title("Labyrinthe")
self.fenetre.geometry("1350x689+1+1")
self.fenetre["bg"] = "blue"
self.canevas = tkinter.Canvas(self.fenetre, width =1250, height =676, bg ='white')
self.canevas.grid(row =0, column =0, rowspan =30, padx =5, pady =5)
self.canevas.focus_set()
self.canevas.bind('<Key>',clavier)
self.hauteur_label = tkinter.Label(self.fenetre, text="Hauteur :", width=10, height =1, justify="left")
self.hauteur_label.grid(row =0, column =1, padx =2, pady =2)
self.largeur_label = tkinter.Label(self.fenetre, text="Largeur :", width=10, height =1, justify="left")
self.largeur_label.grid(row =2, column =1, padx =2, pady =2)
grille.taille[0].set(100)
grille.taille[1].set(100)
self.hauteur_spin = tkinter.Spinbox(self.fenetre,from_=1,to=114,increment=1,
textvariable=grille.taille[0],width=10)
self.hauteur_spin.grid(row =1, column =1, padx =2, pady =2)
self.largeur_spin = tkinter.Spinbox(self.fenetre,from_=1,to=200,increment=1,
textvariable=grille.taille[1],width=10)
self.largeur_spin.grid(row =3, column =1, padx =2, pady =2)
self.boutton_effacer = tkinter.Button(self.fenetre, text="Effacer", fg="blue", width=10, height =1, command =effacer)
self.boutton_effacer.grid(row =5, column =1, padx =2, pady =2)
self.boutton_valider = tkinter.Button(self.fenetre, text="Génération", fg="blue", width=10, height =1, command =time)
self.boutton_valider.grid(row =10, column =1, padx =2, pady =2)
self.boutton_quitter = tkinter.Button(self.fenetre, text="Quitter", fg="red", width=10, height =1, command =self.fenetre.destroy)
self.boutton_quitter.grid(row =29, column =1, padx =2, pady =2)
def afficher (self, grille) :
self.canevas.delete("all")
interface.canevas.create_rectangle(4+6*(position[1]-1), 4+6*(position[0]-1), 8+6*(position[1]-1), 8+6*(position[0]-1))
for ligne in range(grille.taille[0].get()-1) :
for collone in range(grille.taille[1].get()-1) :
if grille.grille[ligne+1][collone+1] == 1 :
self.canevas.create_rectangle(4+6*collone, 4+6*ligne, 8+6*collone, 8+6*ligne, fill="black")
def time ():
global grille
g = Grille()
g.generation(grille)
grille = g
interface.afficher(grille)
def clavier (event) :
global grille, position, interface
touche = event.keysym
if touche == "Up":
if position[0] > 1 :
position[0] -= 1
if touche == "Down":
if position[0] < grille.taille.get()-2 :
position[0] += 1
if touche == "Right":
if position[1] < grille.taille.get()-2 :
position[1] += 1
if touche == "Left":
if position[1] > 1 :
position[1] -= 1
if touche == "Return" :
if grille.grille[position[0]][position[1]] == 1 :
grille.grille[position[0]][position[1]] = 0
else :
grille.grille[position[0]][position[1]] = 1
interface.afficher(grille)
def effacer () :
global grille
grille = Grille()
interface.afficher(grille)
global grille
grille = Grille()
position = [int(grille.taille[0].get()/2), int(grille.taille[1].get()/2)]
interface = Interface()
interface.afficher(grille)
interface.fenetre.mainloop()
Ajouté le 02/04/2016 à 12:27 :
J'ai laissé tomber IntVar ça ne sert à rien ici.
Ajouté le 02/04/2016 à 13:49 :
Je fais :
self.menufigure.add_command(label="Planeur",command=planeur)
self.menufigure.add_command(label="Vaisseau",command=vaisseau)
self.menufigure.add_command(label="Clown(111)",command=clown)
self.menufigure.grid(row =1, column =1, padx =1, pady =1)
File "C:\...\jeudelavie Leph.py", line 134, in <module>
interface = Interface()
File "C:\...\jeudelavie Leph.py", line 57, in __init__
self.menufigure.grid(row =1, column =1, padx =1, pady =1)
File "C:\...\lib\tkinter\__init__.py", line 2073, in grid_configure
+ self._options(cnf, kw))
_tkinter.TclError: can't manage ".49138896": it's a top-level window
Cela veut-t'il dire que je ne peux pas afficher mon widget menu n'importe où dans mon interface.
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 02/04/2016 14:59 | #
Mais tu utilises un menu, c'est un top-level, tu ne peux pas le placer avec grid(). La méthode grid() permet d'arranger des éléments dans la fenêtre, mais si tu prends ton navigateur web et que tu cliques droit en bas à droite (en supposant que la fenêtre est suffisamment petite), tu vois bien que le menu peut dépasser de la fenêtre : il ne peut donc pas être dedans.
Citer : Posté le 02/04/2016 17:20 | # | Fichier joint
Mais alors, comment dois je faire pour mettre mon menu déroulant à cet endroit (fichier joint).
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 02/04/2016 17:28 | #
Mais le menu que tu utilises dans ton code c'est un menu type clic droit ou barre de menus (fichier, édition, etc.). Il n'a pas vocation a être affiché en permanence.
Citer : Posté le 03/04/2016 11:13 | # | Fichier joint
Mais alors comment je dois faire pour avoir un truc comme ceci : fichier joint
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 03/04/2016 11:18 | #
Ben tu prends le premier lien pour « tkinter Menu » sur ton moteur de recherche préféré...
http://effbot.org/tkinterbook/menu.htm
Citer : Posté le 03/04/2016 11:31 | #
Oui mais je voudrai pouvoir placer mon menu n'import où, est possible ?
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 03/04/2016 11:32 | #
Ben la barre de menus ça se met en haut à gauche... et le menu sous son nom dans la barre de menus. Que veux-tu faire d'autre ? ><
Citer : Posté le 03/04/2016 11:35 | #
Oui c'est pas faux
Ajouté le 03/04/2016 à 11:58 :
Je voudrais faire une commande qui lance la fonction "time" en boucle.
J'ai pensé à utiliser un bouton radio ou une case a coché (si je la coche ça appelle la fonction time puis je reviens d'en me boucle mais c'est toujours coché alors ça rappelle la fonction time et ainsi de suite jusqu’à ce qu'on décoche la case)
Mais sa ne marche pas
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 03/04/2016 12:00 | #
Utilise un timer. Regarde peut-être ça :
http://stackoverflow.com/questions/2400262/how-to-create-a-timer-using-tkinter
Citer : Posté le 03/04/2016 13:44 | #
Heu, j'ai du mal à comprendre le fonctionnement d'un timer ?
Labyrinthe : un jeu de réflexe unique, élu Jeu Du Mois !!!
Citer : Posté le 03/04/2016 13:54 | #
Un timer va te permettre d'appeler régulièrement une fonction. Par exemple une fois par seconde, tu vas appeler la fonction time() pour mettre à jour ton plateau.
Faut bien imaginer que si tu le laissais tourner sans le réguler temporellement ça pourrait passer des centaines de génération en une seconde.