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 :

Demande de critiques constructives sur mon premier programme avec Tkinter


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Points : 97
    Points
    97
    Par défaut Demande de critiques constructives sur mon premier programme avec Tkinter
    Bonjour,

    Pour l'anniversaire de mes 1 mois sous python (et 3 semaines sous Tkinter), je vous soumets mon programme d'apprentissage des 4 opérations (compatible python 2.6 et python3) pour lequel j'aurais besoin :

    - de beta testeurs

    - d'avis sur la méthode de programmation (NB: je pense que si je m'y mettais aujourd'hui, j'aurais une approche beaucoup moins procédurale et je ferai une classe pour chacune des 3 cases de menus et une ou deux pour la partie exo, avec chacune leurs méthodes pour actualisations, binds, etc...)

    - d'un renseignement en particulier : comment resizer à la volée un GIF pour l'afficher dans un bouton avec une taille variable (qui sera adaptée à celle de la fenêtre, comme le reste de l'interface si j'ai bien calculé mon coup) ? J'ai essayé la méthode resize() de phtoimage si je me souviens bien, mais c'était un recadrage et non un redimensionnement.

    - d'une réponse à un vain espoir : peut-on mettre une image de fond sur une frame, sur laquelle viennent se poser les widgets auxquels l'on donne un background transparent ? J'ai cru comprendre que ce n'était pas possible sous tkinter, mais je vous demande quand même...

    Merci à PauseKawa de son aide précieuse à mes tous débuts, et merci d'avance à ceux qui jetteront un coup d'œil au programme et à son code.

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pas le temps ce matin de regarder tout.
    Déjà pour le popup il n'y a pas de gestion de fermeture de la fenetre.
    Plutot que d'utiliser WM je te propose ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            tkParent.identification.geometry(geometry)
            tkParent.identification.overrideredirect(1)
            tkParent.identification.bind('<Escape>', quit)
    Et au passage...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            boutonGo = Button(tkParent.identification, text="C'est parti !", font=tkParent.tailleMessage, background=bg, fg='red', command = self.gogogo)
    Je regarderais la suite plus tard

    @+

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Re,

    Petits détails

    Si tu lance ton appli dans une console tu remarqueras que le quit du bind n'est pas très propre.
    J'en profite pour te montrer un bout de code fort utile (c'est de la faq il me semble)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def Onquit(self, event = None):
            for widget in self.winfo_children():
                if isinstance(widget,Toplevel):
                    widget.destroy()
    Si tu trouve l'apparence de l'overrideredirect trop flat utilise une frame avec une fine bordure dans ton toplevel et mets tes widgets dedans. Cela te donneras une 'zolie' bordure.

  4. #4
    Membre régulier
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Points : 97
    Points
    97
    Par défaut
    Merci pour ta réponse, j'essaie de modifier ça ce soir

  5. #5
    Membre régulier
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Points : 97
    Points
    97
    Par défaut
    Bonsoir !

    j'ai essayé le code de ton 1er post :
    - avantage : avec l'overrideredirect(1), c'est effectivement impossible de fermer la popup comme un cochon avec la croix, ce qui faisait lamentablement planter l'appli en mainloop infini.
    - mais nombreux problèmes :
    . pas de focus au premier lancement : on ne peux pas renseigner le prénom
    . idem pour le bind 'escape' qui ne fonctionne pas au premier lancement
    . sur un second appel, le bind escape fait quitter complètement l'appli, ce qui n'est pas souhaité quand la toplevel est affichée ; c'est simplement sa fermeture qui l'est, le programme devant être quitté à la fenêtre principale.

    pour la procédure OnQuit, je n'ai pas réussi à la binder au sein de la class...

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par spirzouf Voir le message
    mais nombreux problèmes :
    . pas de focus au premier lancement : on ne peux pas renseigner le prénom
    . idem pour le bind 'escape' qui ne fonctionne pas au premier lancement
    . sur un second appel, le bind escape fait quitter complètement l'appli, ce qui n'est pas souhaité quand la toplevel est affichée ; c'est simplement sa fermeture qui l'est, le programme devant être quitté à la fenêtre principale
    Ici

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    class popUpID():
     
    #########################################################################
    #############   Fenêtre d'identification (prénom et âge)   #############
    #########################################################################
     
        def __init__(self, parent, bg='white', geometry="640x480+0+0", event=None):
     
            global tkParent
            tkParent = parent
     
            #création de la toplevel
            tkParent.identification = Toplevel(background=bg)
            tkParent.identification.title('Qui suis-je ?')
            tkParent.identification.geometry(geometry)
            # Perso j'avais le bind au premier lancement mais bon... Mis avant l'overrideredirect
            tkParent.identification.bind('<Escape>', self.gogogo) # A remplacer par self.Onquit pour test
     
    		# Bordure. Voir l'exemple sur http://effbot.org/tkinterbook/frame.htm
            framecontour = Frame(tkParent.identification, height=2, background=bg, bd=1, relief=SUNKEN)
     
            # création d'une frame pour la saisie
            frameSaisie = Frame(framecontour, background=bg)
     
            # prénom : servira à créer un profil (associé à la date de naissance) et à personnaliser le menu
            labelPrenom = Label(frameSaisie, text='Mon prénom :', font=tkParent.tailleMessage, background=bg, fg='black')
            self.saisiePrenom = Entry(frameSaisie, font=tkParent.tailleMessage)
     
            # date de naissance : servira à créer un profil (associé au prénom) et à personnaliser le menu
            labelDDN = Label(frameSaisie, text='Ma date\nde naissance :', font=tkParent.tailleMessage, background=bg, fg='black', pady=10)
            self.CanvasAvecDate = Canvas(frameSaisie, width=tkParent.ecran_X(40), height=tkParent.ecran_Y(10), background=bg, borderwidth=0, highlightthickness=0)
            self.dateDansCanvas = create_date(self.CanvasAvecDate,1,tkParent.ecran_Y(5),taille=int(40*tkParent.ratio_X),date='01/Janvier/2000',format='JJ/Mois/AAAA')
     
            # bouton de validation 'gogogo'
            boutonGo = Button(framecontour, text="C'est parti !", font=tkParent.tailleMessage, background=bg, fg='red', command = self.gogogo)
     
            # affichage
            framecontour         .pack(fill=X, padx=5, pady=5)
            frameSaisie          .pack()
            labelPrenom          .grid(row=0, column=0, padx=20, pady=20)
            self.saisiePrenom    .grid(row=0, column=1, padx=20, pady=20, sticky='W')
            labelDDN             .grid(row=1, column=0, padx=20, sticky='W')
            self.CanvasAvecDate  .grid(row=1, column=1, padx=20, sticky='W')
            boutonGo             .pack(expand=1, pady=5)
     
            # focus sur le prénom
            self.saisiePrenom.focus_set()
     
            # fini le gestionnaire de fenetre
            tkParent.identification.overrideredirect(1)
     
     
    #########################################################################
    ############# Procédure après clic gauche du bouton boutonGo ############
    #########################################################################
     
        def gogogo(self,event=None):
     
            # Récupération du prénom
            prenom = self.saisiePrenom.get()
     
            # Récupération de la date de naissance (objet de type datetime) et de la date pour calcul de l'âge
            ddn = self.dateDansCanvas.objetDatetime
            aujourdhui = datetime.date.today()
            age = aujourdhui.year - ddn.year
            if (aujourdhui.month < ddn.month) or ((aujourdhui.month == ddn.month) and (aujourdhui.day < ddn.day)):
                age -= 1
     
            # Affichage des messages personnalisés de la fenêtre principale
            tkParent.messageMenu11.config(text="{0}, {1} ans,\nfait des mathématiques.".format(prenom,age))
            tkParent.message.config(text='À toi de jouer {0} !\nÉcris ta réponse dans la case en-dessous ⤵'.format(prenom))
     
            # Puis fermeture de cette fenêtre pour laisser place à la fenêtre principale
            tkParent.identification.destroy()
            tkParent.deiconify()
     
        def Onquit(self, event = None):
            # Pour l'exemple. En fait la fermeture de tkParent.identification ici.
            # Ce code est utile lors de la création d'interfaces avec de multiples toplevels par exemple.
            for widget in tkParent.winfo_children():
                if isinstance(widget,Toplevel):
                    widget.destroy()
            tkParent.quit()

  7. #7
    Membre régulier
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Points : 97
    Points
    97
    Par défaut
    Bonsoir,

    Je pense avoir saisi l'intérêt de la procédure Onquit (NB : je n'arrivais pas à la binder à cause d'une bête erreur de casse : onQuit/Onquit...) : cela permet quand on ferme une toplevel de fermer toutes les autres toplevel existantes si j'ai bien compris (la boucle for va chercher toute toplevel enfant de la fenêtre root) ?

    Par contre, même avec l'overrideredirect(1) en dernière position après création des widgets, toujours le même problème de focus... y compris en faisant un copier-coller de ton code

Discussions similaires

  1. [1.x] Demande de conseils sur mon premier module (messagerie privée)
    Par Nanocom dans le forum Débuter
    Réponses: 1
    Dernier message: 08/05/2011, 11h37
  2. Je bloque sur mon premier essai avec ANT
    Par Invité dans le forum ANT
    Réponses: 2
    Dernier message: 15/12/2010, 00h27
  3. Demande d'aide pour mon premier programme
    Par ne2sbeal dans le forum Windows Forms
    Réponses: 6
    Dernier message: 21/01/2009, 21h53
  4. [Language] Aide sur mon premier programme Java?
    Par hash2zo dans le forum Langage
    Réponses: 15
    Dernier message: 27/09/2005, 19h26
  5. [Débutant] Mon premier programme: rien ne va...
    Par vincent0 dans le forum OpenGL
    Réponses: 10
    Dernier message: 02/08/2005, 13h59

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