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 :

Faire une fonction contenant du Tkinter


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Par défaut Faire une fonction contenant du Tkinter
    Bonjour,

    Pour mon TIPE, j'ai fait un code qui affiche un carré qui se déplace sur une image de fond grâce a tkinter, code que voici :
    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
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    import os
     
    os.chdir("U:/Documents/")
     
    import tkinter as tk
    import time as t
    liste = [(0, 0),(0, 1), (0, 2), (1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (4, 4), (5, 4), (5, 5), (5, 6), (6, 6), (7, 6), (7, 7), (7,8), (8, 8), (9, 8), (10, 8), (10, 9), (10, 10), (10, 11), (11, 11), (12, 11), (12, 12), (12, 13), (12, 14), (13, 14), (14, 14),(14, 15), (14, 16), (15, 16), (16, 16)] 
     
    #opérations de base
    def moins_tuple(t,u):
        n = len(t)
        n2 = len(u)
        if n != n2:
            raise ValueError("the tuples must have the same length")
        else:
            r = tuple()
            for k in range(n):
                r = r + (t[k]-u[k],)
        return(r)
     
    def plus_tuple(t,u):
        n = len(t)
        n2 = len(u)
        if n != n2:
            raise ValueError("the tuples must have the same length")
        else:
            r = tuple()
            for k in range(n):
                r = r + (t[k]+u[k],)
        return(r)
     
     
    #code du déplacement
     
    L = liste
    n = len(liste)
    i = 0
    l,c = L[0]
    l2 = 30*(l)+2
    c2 = 30*(c)+2
    com = 0
     
     
     
    fenetre = tk.Tk()
    photo = tk.PhotoImage(file = "UEA.gif")
     
    def dplct2():
        global L,i,com,l2,c2
        if i< n-1:
            if com<10:
                x,y = moins_tuple(L[i+1],L[i])
                l2 = l2 + x*3
                c2 = c2 + y*3
                canvas.coords(rectangle,c2+3,l2+3,c2+27,l2+27)
                fenetre.after(70,dplct2)
                com = com + 1
            else:
                com = 0
                i = i+1
                fenetre.after(1,dplct2)
     
    def dplct(event):
        dplct2()
     
     
    canvas = tk.Canvas(fenetre, width = 512, height = 512,bg = 'cyan')
    item = canvas.create_image(256,256, image=photo)
    canvas.pack(padx = 5 , pady = 5)
    rectangle = canvas.create_rectangle(c*30+3,l*30+3  ,c*30+27,l  *30+27,fill="black")
    canvas.focus_set()
    canvas.bind('<KeyPress-space>',dplct)
    fenetre.mainloop()
    Ce code affiche parfaitement ce que je veux.

    Cependant, j'aimerais, afin de pouvoir l'utiliser dans mon TIPE, passer le code du déplacement dans une fonction du type f(liste), mais toutes mes tentatives se sont soldées par des échecs...

    Merci d'avance pour votre aide !

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

    Citation Envoyé par drozzyyy Voir le message
    mais toutes mes tentatives se sont soldées par des échecs...
    Si vous ne montrez pas ce que vous avez essayé de faire, difficile de comprendre la difficulté rencontrée... Et surtout imaginer ce que vous voulez réellement faire.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Par défaut
    Le but est de transformer le code situé après le #code du déplacement en une fonction de type f(liste) plutôt que d'avoir le code brut ( le but étant de mettre cette fonction dans une autre qui renvoie une liste afin de modéliser un chemin parcouru par une voiture sur plusieurs itérations). Quand à ce que j'ai tenté, j'ai essayé de mettre le code tel quel dans une fonction (avec liste en entrée) et j'ai aussi tenté la même chose mais en modifiant le code pour supprimer le bind, mais l'erreur est toujours du même type : les variables mises en entrée de la fonction (ou qui en dépendent) et celles annoncées au début du code sont considérées comme inexistantes.

    En espérant que ce complément d'informations aidera

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Certes mais çà ne dit pas ce que retourne la fonction ni d'où elle est supposée être appelée et d'où sort l'argument liste à passer.
    Peut être que d'autres lecteurs plus perspicaces que moi pourront vous aider, moi en l'état, je ne sais pas.

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Par défaut Un peu plus de précision !
    Bonjour, et désolé de cette réponse qui à tardé à venir.

    Je vais donc tenter de résumer le plus clairement ma situation :

    Dans le cadre d'une épreuve, je dois créer et utiliser un algorithme de recherche de chemin dans une matrice.
    Cet algorithme étant fonctionnel, je cherche a modéliser graphiquement le résultat, c'est à dire déplacer un carré sur une 'carte' faites en amont, le long d'un chemin déterminé par mon algorithme de recherche précédemment évoqué.

    C'est le but du code que je vous ai partagé ici (et que je vous repartage) :

    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
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    import os
     
    os.chdir("U:/Documents/")
     
    import tkinter as tk
    import time as t
    liste = [(0, 0),(0, 1), (0, 2), (1, 2), (2, 2), (3, 2), (3, 3), (3, 4), (4, 4), (5, 4), (5, 5), (5, 6), (6, 6), (7, 6), (7, 7), (7,8), (8, 8), (9, 8), (10, 8), (10, 9), (10, 10), (10, 11), (11, 11), (12, 11), (12, 12), (12, 13), (12, 14), (13, 14), (14, 14),(14, 15), (14, 16), (15, 16), (16, 16)] 
     
     
    #opérations de base
    def moins_tuple(t,u):
        n = len(t)
        n2 = len(u)
        if n != n2:
            raise ValueError("the tuples must have the same length")
        else:
            r = tuple()
            for k in range(n):
                r = r + (t[k]-u[k],)
        return(r)
     
    def plus_tuple(t,u):
        n = len(t)
        n2 = len(u)
        if n != n2:
            raise ValueError("the tuples must have the same length")
        else:
            r = tuple()
            for k in range(n):
                r = r + (t[k]+u[k],)
        return(r)
     
     
    #code du déplacement
     
    L = liste
    n = len(liste)
    i = 0
    l,c = L[0]
    l2 = 30*(l)+2
    c2 = 30*(c)+2
    com = 0
     
     
     
    fenetre = tk.Tk()
    photo = tk.PhotoImage(file = "UEA.gif")
     
    def dplct2():
        global L,i,com,l2,c2
        if i< n-1:
            if com<10:
                x,y = moins_tuple(L[i+1],L[i])
                l2 = l2 + x*3
                c2 = c2 + y*3
                canvas.coords(rectangle,c2+3,l2+3,c2+27,l2+27)
                fenetre.after(70,dplct2)
                com = com + 1
            else:
                com = 0
                i = i+1
                fenetre.after(1,dplct2)
     
    def dplct(event):
        dplct2()
     
     
    canvas = tk.Canvas(fenetre, width = 512, height = 512,bg = 'cyan')
    item = canvas.create_image(256,256, image=photo)
    canvas.pack(padx = 5 , pady = 5)
    rectangle = canvas.create_rectangle(c*30+3,l*30+3  ,c*30+27,l  *30+27,fill="black")
    canvas.focus_set()
    canvas.bind('<KeyPress-space>',dplct)
    fenetre.mainloop()
    Ici, afin de tester la validité de ce code, j'ai déclaré une liste en amont, qui correspond à un trajet dans la carte en pièce jointe (les cases grises sont les 'routes', ie le carré peux se déplacer dessus, et les noires sont des obstacles, ie le carré ne peux se déplacer dessus)
    Le code en dessous de #Opérations de bases sert a faire des opérations sur les coordonnées du carré, et ainsi pouvoir le faire suivre le chemin donné par la liste.

    Nous voilà donc dans la deuxième partie, le code du déplacement :

    Premièrement, la déclaration des variables :

    i va être l'indice dans la liste des coordonnées, indice qui va être incrémenté au fur et à mesure du déplacement du carré.
    l et c sont les valeurs de la ligne (l) et de la colonne (c) du carré.
    l2 et c2 sont les coordonnées en pixels du carré (une case sur la carte faisant 30 pixels de coté, avec une bordure de 2 pixels)
    com est juste un compteur.

    fenêtre est, comme son nom l'indique, la fenêtre qui va être ouverte par tkinter afin d'être le support de "l'animation"
    On attribue a photo l'image en pièce jointe.

    Dans la fonction Dplct2, je code le déplacement du carré (qui lui est créé plus bas dans le code):
    Après avoir appelé les différentes variables, je fais déplacer le carré en fonction de la coordonnée suivante dans la liste L, et ce petit a petit, ie quelques pixels par quelques pixels : On divise la case en 10, et on fait avancer le carré 3 pixels par 3 pixels dans la direction voulue, en incrémentant le compteur.
    Une fois arrivé a 10, on réinitialise le compteur et on incrémente i de 1.

    La fonction dplct est une fonction avec un argument,qui ne fait qu'appeler dplct2, pour être appelée plus tard, car un argument est demandé dans "canvas.bind"

    Les instructions suivantes servent, dans l'ordre :

    A créer l'image sur laquelle on va coller l'objet photo, ie la carte.
    On créer ensuite le carré (oui bon c'est un rectangle ici ) de 30 pixels de coté, pour finalement appeler notre fonction dplct, qu'on lance avec la touche espace une fois le code exécuté.


    Voilà donc mon programme. Notons que celui ci est fonctionnel, ie qu'il déplace bien le carré, en suivant la bonne direction sur la bonne image.

    Cependant, même si l'environnement ne change pas, les chemins empruntés si.
    C'est pourquoi j'aimerais pouvoir avoir une fonction avec comme argument une liste de coordonnée, et qui quand on l'appelle ouvre l'animation, de la même manière que quand on exécute le code ci dessus.

    Tous mes essais, dont voici une représentation :


    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
     
    def test(L1):
        L = L1
        n = len(L1)
        i = 0
        l,c = L[0]
        l2 = 30*(l)+2
        c2 = 30*(c)+2
        com = 0
        fenetre = tk.Tk()
        photo = tk.PhotoImage(file = "UEA.gif")
        def dplct2():
            global L,i,com,l2,c2
            if i< n-1:
                if com<10:
                    x,y = moins_tuple(L[i+1],L[i])
                    l2 = l2 + x*3
                    c2 = c2 + y*3
                    canvas.coords(rectangle,c2+3,l2+3,c2+27,l2+27)
                    com = com + 1
                    fenetre.after(70,dplct2)
                else:
                    com = 0
                    i = i+1
                    fenetre.after(1,dplct2)
     
        def dplct(event):
            dplct2()
        canvas = tk.Canvas(fenetre, width = 512, height = 512,bg = 'cyan')
        item = canvas.create_image(256,256, image=photo)
        canvas.pack(padx = 5 , pady = 5)
        rectangle = canvas.create_rectangle(c*30+3,l*30+3  ,c*30+27,l  *30+27,fill="black")
        canvas.focus_set()
        canvas.bind('<KeyPress-space>',dplct)
        fenetre.mainloop()
    Je le conçois, pas très subtil.
    Voici l'erreur retourné par python :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TclError: image "pyimage13" doesn't exist
    A noter que le numéro change a chaque essai....

    Voilà le point où j'en suis.

    Je vous remercie de votre réponse, en espérant que cette fois ci, j'ai été assez clair sur mes intentions.
    Images attachées Images attachées  

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

    L'erreur TclError: image "pyimage13" doesn't exist est la plupart du temps provoquée par des créations successives de Tk() *et* la création du PhotoImage sans préciser le Tk auquel l'associer. Par défaut c'est pas le bon, donc çà râle.

    Comme vous n'avez pas de bonnes raisons d'avoir plusieurs (instances) de Tk dans votre code, appliquez vous à créer Tk au lancement du programme et d'utiliser Toplevel pour les autres fenêtres.

    Pour le reste, vous voulez mettre ces lignes de codes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    L = liste
    n = len(liste)
    i = 0
    l,c = L[0]
    l2 = 30*(l)+2
    c2 = 30*(c)+2
    com = 0
    dans une fonction et vous avez juste mis tout le code dans une fonction i.e. pas seulement les instructions que vous vouliez.
    note: si vous appelez plusieurs fois cette fonction là (qu'on ne sait relier au reste)... Vous fabriquez plusieurs Tk et des erreurs avec pyimageNN qui s'incrémente à chaque appel.

    Donc je n'ai toujours rien compris.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/02/2010, 13h49
  2. Comment faire une fonction qui renvoi un tableau.
    Par poly128 dans le forum Delphi
    Réponses: 2
    Dernier message: 01/06/2006, 01h04
  3. [C#][Débutant] Comment faire une fonction FindWindow ?
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/04/2006, 13h19
  4. Faire une fonction
    Par philippef dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/04/2006, 17h14
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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