Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / [debutant] probleme fenetre tkinter

[debutant] probleme fenetre tkinter

Remonter à Forum général Python
  • [debutant] probleme fenetre tkinter

    Envoyé par pepito le 14 Mai 2010 à 23:40
    Bonjour tout le monde!
    Je suis débutant et mon problème est surement trivial pour vous mas bon, faut bien commencer!
    Donc voilà, j'ai fait un code en programmation orienté objet pour un jeu que l'on m'as demandé de faire.
    Mon jeu marche trés bien mais je voudrais pouvoir faire rentrer par l'utilisateur ,avant le début du jeu, un paramétre avec une interface tkinter.
    J'ai essayé de passer par une classe que j'appele dans le main() qui me renverrait vers ma classe de jeu une fois que j'aurais cliquer sur un bouton "jouer". Mais ça ne marche pas, mes anciennes classes ne marche plus... je sais plus quoi faire!!
    Je mets une partie simplifié de mon code avant mes tentatives d'ajout de fenêtre.
    # -*- coding: cp1252 -*-
    # ==============================================================================
    # Sl
    # ==============================================================================
    """ """
    __author__ = " "
    __version__ = "1.0"
    __date__ = "14/05/2010"
    # ------------------------------------------------------------------------------
    from Tkinter import *


    class TextGrid(Frame):
    """grille rectangulaire de widget avec la possibilité d'ajouter un texte"""

    config = {'border':1, 'widget':Label, 'text':'' , 'size':(2,2), 'command':''}

    def __init__(self, master, **keys):
    """initialise la grille de widget"""
    for key in self.config:
    if key not in keys: keys[key] = self.config[key]
    self.grid, self.size, self.init = {}, keys['size'], keys['text']
    widget, command, (cols,rows) = keys['widget'], keys['command'], keys['size']
    del keys['widget'], keys['command'], keys['size']
    Frame.__init__(self, master, border=keys['border'], relief=SOLID)
    for col in range(cols):
    for row in range(rows):
    if command:
    keys['command'] = lambda cell=(col,row): command(cell)
    self.grid[col,row] = widget(self, keys)
    self.grid[col,row].grid(column=col, row=row, sticky=N+S+W+E)
    for n in range(cols): self.columnconfigure(n, weight=1)
    for n in range(rows): self.rowconfigure(n, weight=1)


    def __getitem__(self, key):
    if isinstance(key, str):
    return Frame.__getitem__(self, key)
    col, row = key[:2]; prop = key[2] if len(key) == 3 else 'text'
    return self.grid[col,row][prop]


    def __setitem__(self, key, val):
    if isinstance(key, str):
    Frame.__setitem__(self, key, val); return
    col, row = key[:2]; prop = key[2] if len(key) == 3 else 'text'
    self.grid[col,row][prop] = val


    class Initiation(Tk):
    """initialise le jeu"""

    def __init__(self,parent):
    """initialise les différentes variables et crée les widgets"""
    Tk.__init__(self,parent)
    self.parent = parent
    self.size, self.fnt = (7,7), "Arial 14" #initialise les variables de taille et d'écriture
    self.colors = ('RED','RED','RED','RED','RED','RED','RED') #texte pour initialiser gridB
    self.color1 = 'RED' #définie une couleur associée à un joueur
    self.color2 = 'BLUE'
    self.joueur1 = 0 #initialise le nombre de combinaisons gagnantes à 0
    self.joueur2 = 0
    self.gridB = TextGrid(self, widget=Button, size=(7,1), font=self.fnt, width=9,
    command=Calcul().paint) # création des boutons permettant de commander où
    for p, color in enumerate(self.colors): # placer une pièce et quelle couleur doit jouer
    self.gridB[p,0] = 'RED'
    self.gridB[p,0,'bg'] = 'GREY'
    self.gridB.pack(side=TOP, fill=BOTH, padx=5, pady=5)

    self.gridA = TextGrid(self, size=self.size, font=self.fnt, width=4, height=2, relief=SOLID) # création de la grille de jeu
    for p in range(7): # cette grille est de taille 7x7
    for k in range(7): # comme le puissance 4 "classique"
    self.gridA[p,k,'bg'] = 'GREY'
    self.gridA.pack(side=TOP, fill=BOTH, expand=YES, padx=5, pady=5)


    class Calcul():
    """'coeur' du jeu où sont disposées les méthodes permettant le bon fonctionnement"""

    def paint(self, button):
    """vérifie si le joueur peut jouer dans une colonne"""
    temp,root.temp_gridB=[],[] #initialise des listes
    val = button[0]
    if root.gridB[val,0] == 'Stop': #si sur le bouton de gridB il est écrit 'Stop', on ne peut pas jouer dans cette colonne
    p = [7]
    for v in range(7):
    if root.gridB[v,0] != 'Stop': #si on peut jouer ( bouton différent de 'Stop')
    root.temp_gridB.append(root.gridB[v,0]) #on enregistre la couleur courante ds temp_gridB
    if len(root.temp_gridB) != 0: #cette condition permet de jouer si toutes les boutons de gridB n'affiche pas 'Stop'
    self.color = root.temp_gridB[0] #on définit la couleur courante permettant de connaitre la couleur pour toutes les méthodes
    if len(temp) == 0:
    if root.temp_gridB[0] == root.color1: #on définit le joueur courant permettant de connaitre le joueur pour toutes les méthodes
    self.joueur=root.joueur1
    else:
    self.joueur=root.joueur2
    self.remplir(button) #on appelle les méthodes remplir et gagner


    def remplir(self, button):
    """place une pièce dans la grille de jeu en respectant la gravité"""
    val = button[0]
    k = 6
    while k:
    if root.gridA[val,k,'bg'] == 'GREY': #on vérifie si on peut placer une pièce dans une colonne
    root.gridA[val,k,'bg'] = self.color #et si on peut, on l'ajoute avec la couleur courante
    self.change()
    break
    else:
    k -= 1
    if (k == 0) and (root.gridA[val,k,'bg'] == 'GREY'):
    root.gridA[val,k,'bg'] = self.color #si la pièce ajoutée est la dernière de la colonne
    root.gridB[val,0,'bg'] = 'yellow' #alors on bloque la colonne pour la suite du jeu
    root.gridB[val,0] = 'Stop' #en la colorant en jaune et en écrivant 'Stop'
    self.change() #et on change de joueur

    def change(self):
    """permet de passer d'un joueur à l'autre après une action de jeu"""
    if root.temp_gridB[0] == root.color1: #on regarde la couleur courante et
    self.color='BLUE' #on la change pour le joueur suivant
    else:
    self.color='RED'
    cols, rows = root.size
    for p in range(rows): #on applique le changement sur gridB
    if root.gridB[p,0] != 'Stop': #en modifiant le texte des boutons
    root.gridB[p,0] = self.color #mais on vérifie avant que les boutons ne soient pas des 'Stop'



    # ==============================================================================
    if __name__ == "__main__": #on crée notre root

    root=Initiation(None)
    root.withdraw()
    root.title("Sliding Rows")
    root.minsize(root.winfo_width(), root.winfo_height())
    root.resizable(1,1)
    root.deiconify()
    root.mainloop()



    • Re: [debutant] probleme fenetre tkinter

      Envoyé par jice le 17 Mai 2010 à 08:10
      Il y a un problème dans ton code...
      Ce serait bien de regarder d'où ça vient (probablement d'un tableau au niveau de la ligne "if key not in keys: keys= self.config").
      Mets un espace après les crochets partout (interférences avec le BBCodes et reposte ton code) car pour l'instant, on ne comprend rien vu qu'il manque plein d'infos dont l'indentation... Ce sera plus simple pour faire des tests et t'aider.
      De plus, dire ça marche pas n'est pas très clair.
      Y a-t-il une erreur ?
Rendu par Ploneboard