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 :

Fonction & canvas


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut Fonction & canvas
    Bonsoir à tous,
    je suis actuellement en train de réaliser un petit jeu avec interface graphique sur Tkinter mais j'ai un peu de mal à manipuler les "canvas".Je m'explique: est-il possible de concevoir une fonction agissant sur un canvas, l'affichant et renvoyant le canvas modifié ?
    D'après mes recherches ce n'est faisable qu'en définissant des classes mais je ne connais pas vraiment cette notion. En corrigeant ma solution, pourrais-je arriver au résultat?

    ________________________________________________________________
    Mon bout de code:


    Dans mon module chemin:
    def CreationChemin(nomFichier,fond):
    chemin={}
    case2=case.CreerCase()

    for i in range(case.lireNombreCases('entree.txt')):

    case2['centrex'],case2['centrey'],case2['rayon']=case.lireCoordonneesCase(nomFichier,i+1)
    chemin['case',i+1]=case2
    x,y,z=case2['centrex'],case2['centrey'],case2['rayon']
    ellipse=fond.create_oval(x-z/2,y-z/2,x+z/2,y+z/2, fill='orange', outline='red', width=5)
    return fond
    Dans le module principal:
    def creerFenetre():

    plateau=Tkinter.Tk()
    plateau.geometry("1000x800")

    fond=CreerCanvas(plateau)
    fond=chemin.CreationChemin('entree.txt',fond)
    fond.place(relx=0,rely=0)
    plateau.mainloop()
    return
    _______________________________________________________________

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par Débutant2 Voir le message
    est-il possible de concevoir une fonction agissant sur un canvas, l'affichant et renvoyant le canvas modifié ?
    Pas compris
    C'est ce que vous faites avec fond=chemin.CreationChemin('entree.txt', fond) mais vous pourriez tout au si bien écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        fond = CreerCanvas(plateau)
        chemin.CreationChemin('entree.txt', fond)
    car le Canvas reste le même...
    Pourriez vous expliquer ?

    @+

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Ceci dit si vous cherchez a savoir si le contenu d'un Canvas a été modifier vous n'avez qu'a regardez l'index des items.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> root = Tk()
    >>> canvas = Canvas(root)
    >>> canvas.pack()
    >>> canvas.create_text(0, 0)
    1
    >>> canvas.delete('ALL')
    >>> canvas.create_text(0, 0)
    2
    Il est unique pour le Canvas.

    @+

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Bonjour PauseKawa,
    merci pour ton aide, finalement ma fonction semble fonctionner
    correctement(pas d'erreur de syntaxe/message d'erreur), cependant impossible d'afficher le canvas après modification.. une solution à me proposer ?
    Il est donc possible de 'modifier un canevas' en utilisant une fonction prenant en entrée le canvas comme je l'ai fait ?

  5. #5
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Il est pourtant là puisque vous travaillez avec. Ce n'est sans doute qu'une question de géométrie.
    Il faudrait voir ce qui se trouve dans CreerCanvas et/ou remplacer le fond.place par un fond.pack().

    @+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Dans ma fonction creerCanvas, je retourne un canevas:
    def CreerCanvas(nomFenetre):
    """
    """
    can=Tkinter.Canvas(nomFenetre, width=1000, height=600, background='darkgray')

    return can
    Malheureusement, il ne veut toujours pas s'afficher malgré le changement du .place à .pack()

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Et dans case.CreerCase() il y a quoi ?

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Dans case.creerCase(), j'ai ça:
    def CreerCase():
    return {}
    je ne fais que créer un dico pour stocker les infos relatives à la case: cotes geometriques, question associée,temps de réponse etc ...
    D'ailleurs je viens de me rendre compte que j'aurais du la placer à l'intérieur de la boucle for de ma fonction CreationChemin.

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Il n'y a, dans le code donné, aucune raison que le Canvas n'apparaisse pas.
    Pas d'autre instance Tk() dans le code ?
    Un autre Widget qui serait positionné au dessus du Canvas ?
    Si vous commentez chemin.CreationChemin cela change quelque chose ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fond=CreerCanvas(plateau)
    #fond=chemin.CreationChemin('entree.txt',fond)
    fond.place(relx=0,rely=0)

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par Débutant2 Voir le message
    D'ailleurs je viens de me rendre compte que j'aurais du la placer à l'intérieur de la boucle for de ma fonction CreationChemin.
    Vous devriez carrément mettre tout le code à plat, style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    plateau=Tkinter.Tk()
    plateau.geometry("1000x800")
    fond = Tkinter.Canvas(plateau, width=1000, height=600, background='darkgray')
    chemin = {}
    case2 = {}
    for i in range(case.lireNombreCases('entree.txt')):
        case2['centrex'], case2['centrey'], case2['rayon'] = case.lireCoordonneesCase(nomFichier,i+1)
        chemin['case', i+1] = case2
        x, y, z = case2['centrex'], case2['centrey'], case2['rayon']
        ellipse=fond.create_oval(x-z/2,y-z/2,x+z/2,y+z/2, fill='orange', outline='red', width=5)
    fond.place(relx=0,rely=0)
    plateau.mainloop()
    Toutes ses fonctions ne font que vous enbroyer.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Ok merci du conseil
    Je n'aurais pas trop de mal plus tard à faire évoluer la position d'un personnage
    sur cette carte en mettant uniquement le code à plat ?

Discussions similaires

  1. Canvas et la fonction scale
    Par sylsi38 dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 28/03/2013, 14h49
  2. recuperer un objet d'un canvas dans une fonction
    Par Torx26 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 23/05/2012, 19h02
  3. Fonction canvas toDataUrl et IE
    Par Dark Ryus dans le forum jQuery
    Réponses: 1
    Dernier message: 15/12/2011, 19h55
  4. largeur canvas en fonction du contenu
    Par junix dans le forum Silverlight
    Réponses: 4
    Dernier message: 11/11/2008, 08h47
  5. Fonction Canvas.TextOut sous Vista
    Par dim07 dans le forum Langage
    Réponses: 7
    Dernier message: 22/07/2008, 16h10

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