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

Programmation multimédia/Jeux Python Discussion :

problème programmation python Tkinter


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut problème programmation python Tkinter
    Bonjour à tous,
    je suis nouveau sur ce forum et débutant en programmation, et je cherche à coder un jeu simple de "séduction", et pour cela j'ai besoin d'afficher les photos des personnages à séduire, mais je n'y parviens pas...
    Je vous met mon code en dessous, je suis vraiment débutant et malgré la lecture de nombreux cours je suis encore très loin d'avoir tout compris, j'ai particulièrement du mal avec l'utilisation du self dans les classes.
    Soit la page 3 s'ouvre mais elle est vide, soit elle ne s'ouvre pas du tout ...et l''erreur affichée est "AttributeError: 'Page3' object has no attribute 'bouton_homme'" mais je pense qu'il y en a plusieurs.
    Si qqn pouvait m'expliquer d'où vient le pb dans l'affichage de ma photo et pourquoi pas me donner une brève explication de l'utilisation de self ce serait incroyable.
    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
    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
     
    from tkinter import *
     
    class Application(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.frame = None
            self.switch_frame(Page1)
            self.title("EPF DE TOI")#
            self.geometry("600x500")
            self.config(background='#FCCFFC')
     
     
        def switch_frame(self, frame_class):
            new_frame = frame_class(self)
            if self.frame is not None:
                self.frame.destroy()
            self.frame = new_frame
            self.frame.pack(expand=YES)
     
    class Page1(Frame):
        def __init__(self, master):
            Frame.__init__(self, master, bg='#FCCFFC')
            Label(self, text="Bienvenue sur EPF DE TOI!!", font=("Courrier", 40), bg='#FCCFFC', fg='white').pack(expand=YES)
            Button(self, text="JOUER", font=("Courrier", 35), bg='white', fg='#FCCFFC', relief=RAISED, command=lambda: master.switch_frame(Page2)).pack(pady=20, fill=X)
     
    class Page2(Frame):
        def __init__(self, master):
            Frame.__init__(self, master, bg='#FCCFFC')
            Label(self, text="Choisi le sexe de ton personnage:", font=('Courrier', 30), bg='#FCCFFC', fg='white').pack(expand=YES, side="top", fill="x", pady=5)
            bouton_homme=Button(self, text="Les Hommes", font=("Courrier", 35), bg='white', fg='#FCCFFC', command=lambda:master.switch_frame(Page3))
            bouton_homme.pack(pady=20, fill=X)
            bouton_femme=Button(self, text="Les Femmes", font=("Courrier", 35), bg='white', fg='#FCCFFC', command=lambda:master.switch_frame(Page3))
            bouton_femme.pack(pady=20, fill=X)
            bouton_les2=Button(self, text="Les Hommes et les Femmes", font=("Courrier", 35), bg='white', fg='#FCCFFC', command=lambda:master.switch_frame(Page3))
            bouton_les2.pack(pady=20, fill=X)
     
    class Page3(Frame):
        def __init__(self, master):
            Frame.__init__(self, master)
            Frame.configure(self, bg='#FCCFFC')
            self.affichage_personnages()
    #        self.bouton_homme
     
        def affichage_personnages(self):
            if self.bouton_homme.clic==TRUE:
               self.photo_maxime= PhotoImage(file="Maxime.gif")
               self.zone_maxime=Canvas(self, width=200, height=300)
               self.zone_maxime.create_image(0,0, photo_maxime)
               self.zone_maxime.pack()
    #        if bouton_femme.clic==TRUE:
    #            
    #        if bouton_les2.clic==TRUE:
    #            
    #            
        app = Application()
        app.mainloop()
    Fichiers attachés Fichiers attachés

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

    Citation Envoyé par augustinpl Voir le message
    Si qqn pouvait m'expliquer d'où vient le pb dans l'affichage de ma photo et pourquoi pas me donner une brève explication de l'utilisation de self ce serait incroyable.
    Votre photo n'a aucune chance de s'afficher car comme vous l'avez noté, çà plante avant avec AttributeError...

    Recopier du code sur Internet est une très bonne idée: çà permet de passer le temps qu'on aurait mis à coder çà à faire autre chose. Mais pour pouvoir en faire quelque chose, il faut avoir le même niveau que celui(celle) qui à codé çà: on aurait pu coder çà comme un grand mais vu que ce qu'on voulait faire est déjà réaliser et qu'on peut le récupérer gratuitement...

    Si on n'a pas le niveau, c'est un fruit empoisonné: quand on va essayer d'adapter le code, çà va nous péter à la gueule et on ne saura que faire. Un forum Python n'est pas un centre anti-poison et votre vie n'est pas en danger (enfin pas à cause de ce code là).

    On ne peut pas vous faire une brève explication des classes en Python: vous avez des tutos pour çà.

    En plus, vous utilisez tkinter, le seul GUI de la planète que vous pouvez programmer sans utiliser "class"!

    Ceci dit, si vous ne savez pas encore qu'une variable (Page2, Page3) doit avoir été définie avant de pouvoir l'utiliser, il va falloir passer du temps pour apprendre les bases avant de pouvoir jouer avec tkinter, puis comprendre l'intérêt des classes,... Et c'est en faisant les exercices d'un tuto. que vous allez pouvoir vous familiariser avec des messages d'erreurs comme NameError, IndexError, ....

    Vous avez de quoi vous occuper ces 4 prochaines semaines de confinement

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Le problème c'est que c'est un projet en autonomie a rendre dans 1 mois (nous l'avons eu il y a semaine pas au début de l'année), et j'ai déjà regardé beaucoup de vidéos mais a part pour l'utilisation des widgets qui est très simple il y a énormément de choses pour lesquelles je ne trouve pas d'explications claires, par exemple pour changer de pages, et sur tous les cours que j'ai vu il était dit que l'utilisation de classe était le moyen le plus simple de coder un programme un peu compliqué sur tkinter, j'ai donc essayé de reprendre la seule explication que j'ai trouvé permettant de passer d'une page à l'autre et je reconnais que je n'ai pas tout compris, mais je ne sais pas et vois pas comment faire autrement... si vous pouviez me donner des pistes sur la façon de coder, m'expliquer pourquoi celui-ci n'est bon, cela m'aiderait à avancer...
    Cependant je sais qu'une variable doit être définie avant de l'utiliser puisque je code sur python depuis le début de l'année en cours, je découvre seulement tkinter, et le passage de la page 1 à 2 et pas celui de la 2 à la 3 alors que c'est la même méthode il me semble.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    je ne demande que ca de simplifier mon code, je ne sais juste pas comment faire pour changer de page à chaque fois en faisant autrement...

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

    Citation Envoyé par augustinpl Voir le message
    par exemple pour changer de pages, et sur tous les cours que j'ai vu il était dit que l'utilisation de classe était le moyen le plus simple de coder un programme un peu compliqué sur tkinter
    A partir du moment où vous connaissez la programmation objet, c'est sûr que çà peut être plus simple.
    Mas si vous ne connaissez pas cette programmation là vous vous tirez une balle dans le pied.

    Changer de pages, c'est juste avoir une liste de "pages" et une mécanique qui permet de passer de la page courante à la page suivante ou à la n-ième page de la liste.

    A la place de "pages", vous pourriez faire défiler une collections de photos, ce serait pareil.

    Une liste, l'index de l'item courant, et des fonctions pour passer au n-ième item (ou le suivant/précédent).

    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
    import tkinter as tk
     
    root = tk.Tk()
     
    pages = []
    for i, color in enumerate(('red', 'grey', 'green')):
        page = tk.LabelFrame(root, text=f'page {i}', width=300, height=300, bg=color)
        pages.append(page)
     
    index = 0
    pages[0].grid(row=0, column=0, columnspan=2)
     
    def shift_page(n):
        global index
        pages[index].grid_forget()
        index = (index + n) % len(pages)
        pages[index].grid(row=0, column=0, columnspan=2)
     
     
    def show_next():
        shift_page(1)    
     
    def show_prev():
        shift_page(-1)    
     
     
    tk.Button(root, text='prev', command=show_next).grid(row=1, column=0)
    tk.Button(root, text='next', command=show_next).grid(row=1, column=1)
     
    tk.mainloop()
    Dans mon exemple les Frames sont vides et j'ai utilisé des LabelFrame pour afficher des numéros et des couleurs histoire qu'on voit du changement. Rien ne vous empéche de créer des pages avec des widgets dedans, çà ne doit pas changer la mécanique liste, index, passer d'une page à l'autre.

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

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Merci beaucoup, je crois avoir compris le principe. Et vous me conseillez donc d'abandonner les classes?

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

    Citation Envoyé par augustinpl Voir le message
    Et vous me conseillez donc d'abandonner les classes?
    Je vous suggère juste d'essayer de faire votre projet avec les constructions Python que vous connaissez.

    Si vous voulez organiser votre code avec des classes, prenez le temps d'apprendre à maîtriser la POO avant: cette organisation va imposer des contraintes qui ne sont pas sans implications/neutres.

    Votre application peut avoir les mêmes fonctionnalités que votre code soit organisé avec de la programmation de base (fonctions, structures de données de bases) ou à la sauce orientée objets (avec des class).

    S'il y a des différences, ce sera (peut être) dans les aspects non fonctionnels: modularité, reutilisabilité, maintenance, tests, ... aspects font sens pour des développeurs professionnels.

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

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Pouvez-vous juste me préciser comment afficher les widgets dans une certaines pages, je n'y suis pas arrivé. Par exemple pour afficher un bouton dans la page 3, comment dois-je faire?
    Merci d'avance

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

    Citation Envoyé par augustinpl Voir le message
    Par exemple pour afficher un bouton dans la page 3, comment dois-je faire?
    Dans la mouture que je vous ai donné, vous pouvez créer le Button en lui précisant la frame parent souhaitée: btn = tk.Button(pages [2],....)
    puis vous l'affichez via btn.pack/.grid.

    Vous pouvez aussi créer une fonction create_page_3 qui crée la Frame, la remplit,... retourne la Frame qu'on stocke dans la liste.

    Mais là vous êtes dans des constructions que vous devez maîtriser avant de vous lancer à programmer avec tkinter et Python (les tutos. sont à votre disposition).

    Et vous vous rendez compte que "programmer", c'est pas juste connaître des instructions mais c'est apprendre à les utiliser pour réaliser quelque chose: un outil quoi.

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

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    J'avais déjà essayé la première solution qui me semblait logique mais, un message d'erreur s'affiche comme quoi je ne pas mettre de chiffre à cet endroit...
    TypeError: can only concatenate str (not "int") to str

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Si la première solution est tk.Button(pages [2],....), il n'y a pas de "+" donc pas de concaténation. Si vous voulez de l'aide, il va falloir montrer ce que vous avez essayé de faire pour qu'on comprenne ce qu'il se passe.

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

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    Je n'ai pas mis de +, voila ce que j'ai fait:
    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
     
    from tkinter import *
     
    window = Tk()
    window.title("EPF DE TOI")
    window.geometry("600x500")
    window.config(background='#FCCFFC')
    pages = []
    n=3
     
     
    for i in range(n):
        page = Frame(window, width=600, height=500, bg='WHITE')
        pages.append(page)
     
    index=0  
    pages[0].pack()
     
    def next_frame():
        global index
        pages[index].pack_forget()
        index = index + 1
        pages[index].pack()
     
    Label(page[1], text="Bienvenue sur EPF DE TOI!!", font=("Courrier", 40), bg='#FCCFFC', fg='white').pack(expand=YES)
    Button(page[1], text="JOUER", font=("Courrier", 35), bg='white', fg='#FCCFFC', command=next_frame()).pack(expand=YES, pady=2, fill=X)
     
    window.mainloop()

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

    Citation Envoyé par augustinpl Voir le message
    Je n'ai pas mis de +, voila ce que j'ai fait:
    La liste s'appelle "pages" (et c'est aussi le nom que j'utilise dans mon exemple).
    La variable "page" est juste locale à la boucle qui crée les pages.

    Soyez un peu plus attentif, programmer demande de la rigueur.

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

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Par défaut
    En effet, c'est bien mieux, merci beaucoup!
    Sinon, à propos de la première version, juste pour progresser, j'ai tout compris cette nuit, mon seul problème restant est le fait que je supprime ou cache la frame précédente ("Page2") avec la fonction switch_frame pour en afficher une vierge, ce qui m'empêche d'appeler les boutons de la classe Page2 dans le classe Page3 pour le if button.clic.
    Si tu sais comment résoudre ce problème ca m'aiderait beaucoup.

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par augustinpl Voir le message
    Sinon, à propos de la première version, juste pour progresser, j'ai tout compris cette nuit, mon seul problème restant est le fait que je supprime ou cache la frame précédente ("Page2")
    C'est juste la réponse qui vous a été donné dans un autre forum.

    Dans le dernier code que vous avez posté ici, vous savez que .pack_forget permet de cacher la Frame sans la détruire (avec .destroy).

    Si vous avez du temps à perdre, remplacez .destroy par .pack_forget: vous aller constater çà plante pareil.

    Donc, c'est bien plus compliqué que ce que vous avez l'impression d'avoir compris.

    Et si la compréhension de ce qu'il se passe dans votre code vous échappe, c'est juste parce que la POO est suffisamment compliquée pour mériter de passer du temps à apprendre.

    Vous n'avez pas le temps d'apprendre avant de rendre votre copie et vous n'avez pas besoin de la POO pour réaliser votre code.

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

Discussions similaires

  1. Problème programme python
    Par arthurronda dans le forum Général Python
    Réponses: 13
    Dernier message: 23/11/2019, 19h34
  2. [Python 3.X] Problème liste (Python - Tkinter)
    Par KROCLARYS dans le forum Général Python
    Réponses: 17
    Dernier message: 10/05/2018, 19h51
  3. Problème programme Python 3 sous Tkinter
    Par vbvero dans le forum Tkinter
    Réponses: 2
    Dernier message: 05/02/2017, 17h35
  4. Programme Python Tkinter
    Par LeSmaug dans le forum Général Python
    Réponses: 22
    Dernier message: 29/04/2016, 16h38
  5. Réponses: 1
    Dernier message: 03/01/2011, 15h19

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