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

Python Discussion :

Problème de condition et de boucle Tkinter - create_line


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 67
    Par défaut Problème de condition et de boucle Tkinter - create_line
    Bonjour à tous,

    Je me tourne à nouveau vers vous pour avoir des conseils.

    J'essaie de faire un programme qui automatise un dessin, peu importe les postions de départ de x,y.

    Je m'explique, je récupère des coordonnées dans un fichier.txt de cette façon:

    165, 125
    165, 265
    365, 265
    365, 345
    525, 345
    525, 265
    625, 265
    625, 165
    525, 165
    525, 125
    185, 125

    Je dessine la première forme complète avec ma boucle while ( qui fonctionne bien ). Après, il faut que je reparte de cette forme pour faire quelque chose de similaire au dessin ci dessous, avec un décalage de 20 pixels.

    Nom : dessin1.jpg
Affichages : 191
Taille : 27,3 Ko

    Le dessin ci dessus étant relativement simple et sans contrainte.

    Ci dessous un dessin plus compliqué ( exemple du programme )

    Nom : dessin2.png
Affichages : 197
Taille : 5,9 Ko

    Plus compliqué car dans la zone en vert, elle n’apparaît plus dans la forme suivante car l'écart de 20 pixels n'est pas respecté. Donc on ne dessine pas les trois lignes.

    Voici le code actuellement de la partie du programme concerné. ( et encore il me manque le petit retour à chaque ligne, entouré en vert ).

    Nom : Dessin4.png
Affichages : 196
Taille : 6,1 Ko

    Code:

    Code python : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
    from tkinter import *
     
    # Fenêtre
    root = Tk()
    Largeur = 1200
    Hauteur = 800
     
    canvas = Canvas(root, width=Largeur, height=Hauteur, background="white")
    canvas.pack(side=LEFT, padx=5, pady=5)
    root.resizable(width=False, height=False)
    root.title('Heating Draw')
     
    with open("valeur_x_y.txt", "r+") as file:
        liste_complet = file.readlines()
        liste_complet = ", ".join(liste_complet)
        liste_complet = liste_complet.replace("\n", "")
        liste_complet = liste_complet.split(", ")
        liste_complet = list(map(int, liste_complet))
        file.close()
     
    i = 0
     
    while(i <= len(liste_complet)-3):
        canvas.create_line(liste_complet[i], liste_complet[i+1], liste_complet[i+2], liste_complet[i+3], fill="red", width=3) # adding 1 to i for the next position
        i += 2
     
    canvas.create_line(liste_complet[0] + 20, liste_complet[1] + 20, liste_complet[2] + 20, liste_complet[3] - 20, fill="red", width=3)
    canvas.create_line(liste_complet[2] + 20, liste_complet[3] - 20, liste_complet[4] + 20, liste_complet[5] - 20, fill="red", width=3)
    canvas.create_line(liste_complet[4] + 20, liste_complet[5] - 20, liste_complet[6] + 20, liste_complet[7] - 20, fill="red", width=3)
    canvas.create_line(liste_complet[6] + 20, liste_complet[7] - 20, liste_complet[8] - 20, liste_complet[9] - 20, fill="red", width=3)
    canvas.create_line(liste_complet[8] - 20, liste_complet[9] - 20, liste_complet[10] - 20, liste_complet[11] - 20, fill="red", width=3)
    canvas.create_line(liste_complet[10] - 20, liste_complet[11] - 20, liste_complet[12] - 20, liste_complet[13] - 20, fill="red", width=3)
    canvas.create_line(liste_complet[12] - 20, liste_complet[13] - 20, liste_complet[14] - 20, liste_complet[15] + 20, fill="red", width=3)
    canvas.create_line(liste_complet[14] - 20, liste_complet[15] + 20, liste_complet[16] - 20, liste_complet[17] + 20, fill="red", width=3)
    canvas.create_line(liste_complet[16] - 20, liste_complet[17] + 20, liste_complet[18] - 20, liste_complet[19] + 20, fill="red", width=3)
    canvas.create_line(liste_complet[18] - 20, liste_complet[19] + 20, liste_complet[20] + 20, liste_complet[21] + 20, fill="red", width=3)
     
    canvas.create_line(liste_complet[0] + 40, liste_complet[1] + 40, liste_complet[2] + 40, liste_complet[3] - 40, fill="red", width=3)
    canvas.create_line(liste_complet[2] + 40, liste_complet[3] - 40, liste_complet[4] + 40, liste_complet[5] - 40, fill="red", width=3)
    canvas.create_line(liste_complet[4] + 40, liste_complet[5] - 40, liste_complet[6] + 40, liste_complet[7] - 40, fill="red", width=3)
    canvas.create_line(liste_complet[6] + 40, liste_complet[7] - 40, liste_complet[8] - 40, liste_complet[9] - 40, fill="red", width=3)
    canvas.create_line(liste_complet[8] - 40, liste_complet[9] - 40, liste_complet[10] - 40, liste_complet[11] - 40, fill="red", width=3)
    canvas.create_line(liste_complet[10] - 40, liste_complet[11] - 40, liste_complet[12] - 40, liste_complet[13] - 40, fill="red", width=3)
    canvas.create_line(liste_complet[12] - 40, liste_complet[13] - 40, liste_complet[14] - 40, liste_complet[15] + 40, fill="red", width=3)
    canvas.create_line(liste_complet[14] - 40, liste_complet[15] + 40, liste_complet[16] - 40, liste_complet[17] + 40, fill="red", width=3)
    canvas.create_line(liste_complet[16] - 40, liste_complet[17] + 40, liste_complet[18] - 40, liste_complet[19] + 40, fill="red", width=3)
    canvas.create_line(liste_complet[18] - 40, liste_complet[19] + 40, liste_complet[20] + 40, liste_complet[21] + 40, fill="red", width=3)
     
    canvas.create_line(liste_complet[0] + 60, liste_complet[1] + 60, liste_complet[2] + 60, liste_complet[3] - 60, fill="red", width=3)
    canvas.create_line(liste_complet[2] + 60, liste_complet[3] - 60, liste_complet[4] + 60, liste_complet[5] - 60, fill="red", width=3)
    canvas.create_line(liste_complet[4] + 60, liste_complet[5] - 60, liste_complet[6] + 60, liste_complet[7] - 60, fill="red", width=3)
    canvas.create_line(liste_complet[6] + 60, liste_complet[7] - 60, liste_complet[8] - 60, liste_complet[9] - 60, fill="red", width=3)
    canvas.create_line(liste_complet[8] - 60, liste_complet[9] - 60, liste_complet[10] - 60, liste_complet[11] - 60, fill="red", width=3)
    #canvas.create_line(liste_complet[10] - 60, liste_complet[11] - 60, liste_complet[12] - 60, liste_complet[13] - 60, fill="red", width=3)
    #canvas.create_line(liste_complet[12] - 60, liste_complet[13] - 60, liste_complet[14] - 60, liste_complet[15] + 60, fill="red", width=3)
    #canvas.create_line(liste_complet[14] - 60, liste_complet[15] + 60, liste_complet[16] - 60, liste_complet[17] + 60, fill="red", width=3)
    canvas.create_line(liste_complet[16] - 60, liste_complet[17] + 60, liste_complet[18] - 60, liste_complet[19] + 60, fill="red", width=3)
    canvas.create_line(liste_complet[18] - 60, liste_complet[19] + 60, liste_complet[20] + 60, liste_complet[21] + 60, fill="red", width=3)
     
    root.mainloop()

    Comme vous pouvez le remarqué, j'ai tapé toutes les lignes à la main pour comprendre comment procéder pour automatiser mais je suis complètement perdu.

    J'ai bien comprit que je devais mettre des conditions pour tester la valeur de x,y par rapport au premier tracé ( boucle while ) et savoir si c'est un "+" ou un "-". Le décalage entre les différents tracé est donc de 20.

    Voici mes questions:

    Comment automatisé le retour ? ( photo 3 )
    Comment faire pour faire mes conditions ? J'ai essayer de plusieurs façon différent mais rien ne fonctionne, il faut que le programme choisisse automatique de mettre un -20 ou + 20 suivant le première traçage de la boucle while ?
    Comment faire ne pas tracé certaine ligne quand l'écartement entre les ligne est plus petit de 10 ? Voir photo 2

    J'espère que vous avez comprit le fonctionnement et que j'ai été clair dans mes propos.

    Je vous remercie.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 719
    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 719
    Par défaut
    Salut,

    Citation Envoyé par maxstilde Voir le message
    Comment automatisé le retour ? ( photo 3 )
    Pour automatiser, il faut un algorithme.
    C'est à dire décrire la suite des étapes que pourra faire l'ordinateur en répétant...

    Comme vos dessins ressemblent à des spirales, voilà comment je ferais pour tracer une spirale:
    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
    import tkinter as tk
     
    canvas = tk.Canvas(width=400, height=400)
     
    x0, y0, x1, y1 = 50, 50, 350, 350
    canvas.create_rectangle(50, 50, 350, 350, fill='grey', outline='black')
    canvas.pack()
     
     
    COUNT = 10
     
    c0 = int((x0 + x1) / 2)
    c1 = int((y0 + y1) / 2)
     
    dx = (c0 - x0) / COUNT
    dy = (c1 - y0) / COUNT
     
    alist = []
     
    for i in range(1, COUNT):
        x = x0 + i * dx
        u = x + 2 * (c0 - x)
        y = y0 + i * dy
        v = y + 2 * (c1 - y)
        alist += [(x, y), (u, y), (u, v), (x, v), (x, y+dx) ]
     
    canvas.create_line(*alist, width=3)
     
    tk.mainloop()
    mais pour vous structures un peu plus compliquées, vous avez la rubrique Algorithmes où demander de l'aide.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Un probléme de condition dans une boucle
    Par boubz013 dans le forum Débuter
    Réponses: 6
    Dernier message: 22/02/2010, 15h52
  2. Réponses: 3
    Dernier message: 12/03/2009, 18h08
  3. Problème condition d'arrêt boucles while et for
    Par Clairette29 dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/06/2008, 11h51
  4. Problème d'affichage redondant (genre boucle)
    Par EJ dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 01/06/2004, 11h41
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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