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 :

propriete pour Canvas._create()


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 17
    Points
    17
    Par défaut propriete pour Canvas._create()
    Bonjour,
    Dans un projet d'animation autour de la création d'image à l'aide de python, je souhaiterai faire coder à mes 'élèves' des fonctions générant des figures récursives tel que le triangle de Sierpiński, etc...
    Le but de cette animation n’étant pas dans faire des développeurs, mais de leur montrer ce qu'on peut faire avec un peu de code, je vais leur prémâcher le travail.
    J'ai donc crée une classe Point, qu'il n'auront plus qu'a manipuler, mais j’aimerais que l'on puisse faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zone_de_dessin.create_line(a,b,c, fill = couleur_trait , width = largeur_trait)
    Le truc c'est que Tkinter plante.

    Ma question est donc, quel(s) methode(s) implanter dans ma classe Point afin que cela ne plante pas.
    Je sens bien qu'il faut dire à tkinter que ma class Point est itérable, et j'ai donc essayer d’implémenter les méthodes __iter__ et __next__, ou alors la méthode __getitem__ mais cela ne change rien.
    Pourtant implémenter ces méthodes me permet bien de parcourir mon point avec une boucle for. Et je ne vois pas comment Tkinter utilise les arguments, et donc je ne vois pas non plus comment régler le problème.

    Merci de votre aide !

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    En faisant mes recherches dans les fichiers Tkinter, j'ai l'impression que lorsque l'on fait .create_line(..) on appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def create_line(self, *args, **kw):
            """Create line with coordinates x1,y1,...,xn,yn."""
            return self._create('line', args, kw)
    qui appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        def _create(self, itemType, args, kw): # Args: (val, val, ..., cnf={})
            """Internal function."""
            args = _flatten(args)
            cnf = args[-1]
            if isinstance(cnf, (dict, tuple)):
                args = args[:-1]
            else:
                cnf = {}
            return self.tk.getint(self.tk.call(
                self._w, 'create', itemType,
                *(args + self._options(cnf, kw))))
    or, c'est ici que cela plante, à la derniere ligne.
    En mettant des print(args) de part et d'autre de l'appel à la fonction _flatten j'obtient en lançant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> zone_de_dessin.create_line([[0,0],[1,1]], fill = couleur_trait , width = largeur_trait)
    ([[0, 0], [1, 1]],)
    (0,0,1,1)
    >>> zone_de_dessin.create_line(a,b, fill = couleur_trait , width = largeur_trait)
    (Point(0,0),Point(1,1))
    ()
    Du coup, je pense que c'est dans la fonction _flatten()
    Le truc, c'est que lorsque je met un print("coucou") dans la fonction _flatten(), le coucou ne s'affiche pas, donc je suis bloqué...

  3. #3
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Pourquoi pas faire un truc du genre :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    import tkinter as tk
     
    class Point:
        def __init__(self,x,y):
            self.x=x
            self.y=y
     
    pt1=Point(300,100) 
    pt2=Point(500,300) 
    pt3=Point(100,300)  
    listepts=[pt1,pt2,pt3,pt1]
    fen =tk.Tk()
     
     
    fen.geometry("600x600")
    cancan=tk.Canvas(fen, width=600, height=600, bg='ivory')
     
     
     
    def polygone(listepts,penw,col):
          L=[]
          for pt in  listepts:
              for i in [0,1]:
                 if i==0:
                    L+=[pt.x]
                 else:
                    L+=[pt.y]
          cancan.create_polygon(L,width=penw, outline=col,fill='')
     
    polygone(listepts,2,'black')
    cancan.pack() 
     
    fen.mainloop()

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 379
    Points : 36 923
    Points
    36 923
    Par défaut
    Salut,

    Citation Envoyé par ti.du.du39 Voir le message
    Ma question est donc, quel(s) methode(s) implanter dans ma classe Point afin que cela ne plante pas.
    .create_line accepte des paires de... i.e: .create_line ( (10, 10), (300, 300),...) est identique à .create_line (10, 10, 300, 300,...).

    C'est bien _flatten qui met à plat la liste de listes... mais çà ne le fait que pour des objets qui sont (ou héritent de) list ou tuple (explicitement).

    - W

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Ok, j'ai essayé de modifié ma classe Point pour qu'elle herite de list, mais cela ne change rien.
    Comme dit precedemment, j'ai l'impression que je ne passe pas dans la fonction _flatten().
    Lorsque, dans le fichier __init__.py je modifie toutes les occurences de _flatten() en _flatten_p(), cela marche (j'ai bien le coucou, et avec l'heritage de la liste, cela regle le probleme)
    Par contre, des que je remet _flatten_p() en _flatten(), je n'ai plus le coucou, et cela plante.
    J'ai l'impression que ._create() appelle une fonction _flatten() qui n'est pas celle du fichier (comme si il y en avait 2 défini avec le meme nom).

    j'ai l'impression que cela vient de ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try: _flatten = _tkinter._flatten
    except AttributeError: pass
    Le truc, c'est que je ne sais pas où trouver le code de _tkinter, je ne peux donc pas voir qu'est ce qui bloque dans le code (car si les 2 fonctions _flatten() etait les memes, cela devrai marcher)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 379
    Points : 36 923
    Points
    36 923
    Par défaut
    Salut,

    Citation Envoyé par ti.du.du39 Voir le message
    Ok, j'ai essayé de modifié ma classe Point pour qu'elle herite de list, mais cela ne change rien.
    A partir du moment ou .create_line ( [10, 10], [300, 300],...) fonctionne... on peut supposer que Point n'est pas une list et si vous ne montrez pas le contraire avec un peu de code... çà va être difficile à croire.

    - W

Discussions similaires

  1. Quelle proprietes pour ce champ ?
    Par JME222956 dans le forum Access
    Réponses: 4
    Dernier message: 21/06/2018, 12h11
  2. deux proprietés pour mes lignes? c'est possible
    Par sitws dans le forum Composants
    Réponses: 7
    Dernier message: 11/05/2011, 08h07
  3. Réponses: 1
    Dernier message: 19/05/2008, 14h44
  4. recherche d'un editeur de propriete pour Color
    Par pcouas dans le forum Général Java
    Réponses: 1
    Dernier message: 01/03/2008, 08h08
  5. [C#][XAML] bouton fermer pour canvas
    Par matb33 dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 18/07/2007, 13h57

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