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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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