IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

comment appeler un widget depuis une fonction


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut comment appeler un widget depuis une fonction
    Bonjour (et meilleurs voeux!)
    Voilà un bon moment que je sèche sur un problème technique, et il me semble que le moment est venu de demander un peu d'aide.
    Voilà mon problème:
    le bout code ci-dessous cree une grille de Morpion, contenant 9 widget représantant 9 cases
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from Tkinter import *
    morpion = Tk() # le widget maitre
    morpion.title('MORPION')
    grille = Frame(morpion)# une instance de Frame pour contenir les instances de Canvas.
    Cell.R et Cell.C donne à chacune un numéro de ligne et de colonne.

    Comment faire, sans passer par les événements (donc en programation pure) pour sélectionner telle ou telle case, et dessiner quelque chose dedans?
    J'ai essayé les Cell(x, y), Cell [x][y], Cell.grid(x, y), Cell(row=1, column=1).focus_set(), rien ne marche. Faut-il nommer spécifiquement chacune des 9 cases pour les appeler ensuite?
    Je n'ai pas non plus trouvé l'info sur internet, car à chaque fois, les cellules sont désignées par la source d'un événement (clic).

    Merci d'avance!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from Tkinter import *
    morpion = Tk() # le widget maitre
    morpion.title('MORPION')
    grille = Frame(morpion)# une instance de Frame pour contenir les instances de Canvas
    for R in range(T) :
       for C in range(T) :
          Cell = Canvas(grille, bg='light grey', width=H, height=H)
          Cell.bind("<Button-1>", joue)
          Cell.grid(row=R, column=C)# mais kess
          Cell.R, Cell.C = R, C                           # localisation de chaque cellule
    #===============================================================================
    # ci dessus: chaque instance de Canvas se souvient de sa position dans la grille,
    #en termes de rangee et de colonne, en definissant dans
    # chaque objet les attributs appropries. Comment faire appel telle ou telle #instance?
    #===============================================================================
    grille.pack()
    morpion.mainloop()

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Bonjour et meilleurs voeux également

    alors je débute en python mais j'ai déjà rencontré un problème similaire. pour m'en sortir, je suis passé par une liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    from Tkinter import *
    morpion = Tk() # le widget maitre
    morpion.title('MORPION')
    grille = Frame(morpion)# une instance de Frame pour contenir les instances de Canvas
    Cell=["","","","","","","","",""]
    k=0
    for R in range(3) :
       for C in range(3) :
          Cell[k]=Canvas(grille, bg='light grey', width=100, height=100)
          #Cell.bind("<Button-1>", joue)
          Cell[k].grid(row=R, column=C)# mais kess
          Cell[k].R, Cell[k].C = R, C                           # localisation de chaque cellule
          k=k+1
    #===============================================================================
    # ci dessus: chaque instance de Canvas se souvient de sa position dans la grille,
    #en termes de rangee et de colonne, en definissant dans
    # chaque objet les attributs appropries. Comment faire appel telle ou telle #instance?
    #===============================================================================
     
    Cell[3].configure(bg='black')
     
    grille.pack()
    morpion.mainloop()
    comme ça Cell[0] correspond à ta case en haut à gauche et Cell[8] à ta case en bas à droite.

    C'est pas propre du tout comme codage mais j'ai pas trouvé mieux

    Je reste attentif aux autres réponses

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 32
    Points : 37
    Points
    37
    Par défaut
    pour pouvoir identifier la case ou l'on clique, c'est pas trés compliquer, encore faut il prendre le problème dans le bon sens.

    J'explique une manière de faire le morpion (enfin c'est comme ca que je ferais, de facon trés simple)
    1 ° je compose ma grille avec 9 rectangles dans un Canvas. (blanc avec contour noir par exemple)
    il ont donc tous une ID attribué automatiquement par Tkinter
    2° je défini une méthode (voir méthode associé au canvas) qui récupère l'id de la figure se trouvant sous la clic de souris
    3° je défini une méthode qui calcul le centre de la figure dont l'Id a été récupéré par la méthode ci haut
    4° je defini une méthode dessinnant sur ma case une autre figure dont le centre correspond au centre calculé ci dessus.

    on peut faire bien plus simple, et plus performant mais le principe de départ pour moi c'est la construction de la grille.

    bon courage

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Merci !
    Merci les amis!
    Je n'ai qu'un mot: superbe!
    Avec le truc de Kango, je garde toutes les possibilités de réagir aux événements comme des clics du joueur humain, mais aussi appeler les widgets par leur petit nom pour que mon programme y glisse des ronds.
    Je n'ai pas encore testé l'approche de mon_pierre, car elle me ferait partir sur des bases bien différentes. En tout cas merci beaucoup pour votre aide.
    Grace a vous, je vais poursuivre la réalisation de cejeu passionnant, captivant, et complètement novateur.
    A bientôt!
    {-|-o Thierry o-|-}
    _______________________________________________________________________
    Maison à louer au bord de la mer: http://www.location.vacances.gavres....net/index.html

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'un widget depuis une fonction
    Par eliaslao dans le forum Débuter
    Réponses: 1
    Dernier message: 29/04/2014, 16h44
  2. appeler des methodes depuis une fonction :-(
    Par membreComplexe12 dans le forum C++
    Réponses: 11
    Dernier message: 19/01/2011, 14h05
  3. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    Réponses: 9
    Dernier message: 22/05/2007, 17h36
  4. Réponses: 1
    Dernier message: 02/02/2007, 06h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo