Partage
  • Partager sur Facebook
  • Partager sur Twitter

Questions interface graphique Tkinter

Sujet résolu
    18 mars 2011 à 21:14:09

    Bonsoir à tous!

    Je suis en train de réaliser un petit programme, dont voici la donnée:

    Ecrivez un programme capable de peupler un pré de fleurs, d'abeilles, de coccinelles et de papillons. Un canevas
    de couleur vert clair fera office de pré et trois images de type GIF joueront le rôle d'insectes. La fenêtre
    possédera 3 boutons principaux permettant d'afficher un insecte à choix, d'afficher un tapis
    aléatoire de 15 fleurs de différents diamètres ou d'effacer le contenu du canevas. Avant d'afficher
    un insecte, l'utilisateur pourra préciser le type d'insecte qu'il veut voir apparaître en double cliquant
    sur l'élément correspondant de la liste à choix ainsi que les coordonnées x et y du point où
    devra être affiché l'insecte qu'il précisera dans les entrées de texte prévues à cet effet. Si la position
    de l'insecte n'est pas indiquée, le programme choisira aléatoirement un point dans le canevas
    pour y placer l'insecte sélectionné.

    et voici ce à quoi je dois arriver:

    Exercice

    Je recherche des éléments de réponse quant à la présentation graphique du programme. Si vous apercevez également des erreurs de sémantique ou autres dans mon code merci de m'en faire part!

    Voici donc mon code:
    #! /usr/bin/env python
    # -*- coding:Utf8 -*-
    
    from tkinter import *
    from random import *
    from math import *
    
    # Programme capable de peupler un pré de fleurs, d'abeilles, de coccinelles et de papillons 
    
    #==== Définitions des fonctions nécessaires ====
    
    def fleur(x, y, r):
        "Crée une fleur de rayon r centrée au point de coordonnées (x;y)"
    
        alpha = 0
        while alpha < 2*pi:
            # création des pétales de la fleur
            can.create_oval(x+r*cos(alpha)-r/1.5, y - r*sin(alpha)-r/1.5,\
                            x+r*cos(alpha)+r/1.5, y - r*sin(alpha)+r/1.5,\
                            fill = 'white')
            alpha += pi/4
    
        # création du centre de la fleur
        can.create_oval(x-r, y-r, x+r, y+r, fill = 'yellow')
    
    
    #==== Définitions des gestionnaires d'événements ====
    
    def afficheFleurs():
        """
        Affiche 15 fleurs de différents rayons de manière aléatoire dans le canevas
        
        """
        for i in range(15):
            x = randint(15, can.winfo_width()-15)   # choisir des coord. pour le centre de la fleur
            y = randint(15, can.winfo_height()-15)  # telles qu'il reste un espace entre elle et les bords du canevas
            r = randint(4,10)                       # choisir un rayon entre 4 et 10
            fleur(x, y, r)
    
    
    # complétez les autres gestionnaires d'événements
    def afficherInsecte():
        global insecte
        insecte=selection
        
        x,y=entr1.get(),entr2.get()
    
        if x=="" and y!="":
            x = randint(15, can.winfo_width()-15)
    
        elif x!="" and y=="":
            y = randint(15, can.winfo_height()-15)
    
        elif x=="" and y=="":
            x = randint(15, can.winfo_width()-15)
            y = randint(15, can.winfo_height()-15)
        
        if insecte=="abeille":
            can.create_image(x,y,image=ImgAbeille)
        elif insecte=="coccinelle":
            can.create_image(x,y,image=ImgCoccinelle)
        else:
            can.create_image(x,y,image=ImgPapillon)
        
    
    
    def effacerCanevas():
        can.delete(ALL)
    
    #==== Corps principal du programme ====
    
    # Création du widget principal:
    fen = Tk()
    fen.title('Exercice 7.7')
    
    # Images des insectes à afficher:
    ImgAbeille = PhotoImage(file = "abeille.gif")
    ImgCoccinelle = PhotoImage(file = "coccinelle.gif")
    ImgPapillon = PhotoImage(file = "papillon.gif")
    
    
    # Création et positionnement des étiquettes de texte:
    
    Label(fen,text="Coord. x:",fg="blue",font=("Sans",8,"bold")).grid(row=2,column=1,sticky=W)
    Label(fen,text="Coord. y:",fg="blue",font=("Sans",8,"bold")).grid(row=3,column=1,sticky=W)
    Label(fen,text="Insecte:",fg="blue",font=("Sans",8,"bold")).grid(row=4,column=1,sticky=W)
    
    
    # Création et positionnement des champs de texte:
    entr1=Entry(fen)
    entr2=Entry(fen)
    entr1.grid(row=2,column=2)
    entr2.grid(row=3,column=2)
    
    # Création et positionnement de la liste de choix:
    
    listechoix=Listbox(fen,bg="yellow",width=25,height=3)
    for mot in ["abeille","coccinelle","papillon"]:
        listechoix.insert(END,mot)
    listechoix.grid(row=4,column=2)
    
    # à compléter et définir le gestionnaire d'événement <choixInsecte>
    # permettant d'indiquer quel sera le prochain insecte affiché
    def choixInsecte(event):
        global selection
        selection=listechoix.get(listechoix.curselection())
        
    
    # Un double click dans la liste appelle le gestionnaire d'événement <choixInsecte>:
    listechoix.bind("<Double-Button-1>",choixInsecte)
    
        
    # Création et positionnement du canvas:
    can = Canvas(fen, width = 400, height = 200, bg = 'lightgreen')
    
    # positionnez le canevas comme sur le modèle can.
    can.grid(row=2,column=3,rowspan=3,columnspan=4)
    
    can2=Canvas(fen,width=200,height=40,bg="pink")
    
    can2.create_text(100,20,text="V'là le printemps !",fill="blue",font=("Sans",16,"bold"))
    
    can2.grid(row=1,column=3,rowspan=1,columnspan=4)
    
    
    # Création et positionnement des boutons:
    bou1 = Button(fen, text='Insecte',command=afficherInsecte)
    bou2 = Button(fen, text='Fleurs', command=afficheFleurs)
    bou3 = Button(fen, text='Effacer', command=effacerCanevas)
    bou4 = Button(fen, text='Quitter', command=fen.quit)
    
    # positionnez les boutons comme sur le modèle
    bou1.grid(row=5,column=3)
    bou2.grid(row=5,column=4,sticky=W)
    bou3.grid(row=5,column=5)
    bou4.grid(row=5,column=6,sticky=E)
    
    # Démarrage du réceptionneur d'événements:
    fen.mainloop()
    
    # Fermeture de la fenêtre:
    fen.destroy()
    

    Mes questions sont donc tout d'abord comment réaliser des boutons d'une forme semblable à ceux sur l'image? Il me manque également des espacements entre les boutons et le canvas ou alors entre la "listbox" et le canvas. Connaissez-vous l'option pour ces espacements?
    Finalement, je souhaiterais enlever le soulignage dans ma listbox lorsque je sélectionne un élément dans la liste. Est-ce possible?


    Je vous remercie pour l'attention que vous prendrez pour ma requête! Et pardonnez-moi d'avance si je n'ai pas utilisé le zcode au mieux, ce sont mes premiers pas sur ce site formidable!
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      18 mars 2011 à 23:19:32

      Citation

      Mes questions sont donc tout d'abord comment réaliser des boutons d'une forme semblable à ceux sur l'image?



      Est-ce vraiment important dans le cadre de cet exercice?

      Citation

      Connaissez-vous l'option pour ces espacements?



      Je pense que tu veux parler de padx et pady

      btn = Button(fen, text='dessin 1', command=figure_1)
      btn.pack(side=LEFT, padx=3, pady=3)
      


      Citation

      Finalement, je souhaiterais enlever le soulignage dans ma listbox lorsque je sélectionne un élément dans la liste. Est-ce possible?



      Faudra tester, mais je pense à l'option takefocus.
      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2011 à 12:13:33

        Pour commencer merci pour ta réponse rapide!

        Citation : fred1599

        Est-ce vraiment important dans le cadre de cet exercice?


        Non, bien sûr ce n'est pas existentiel. Mais, cela m'intrigue. Je me demandais s'il existait une option permettant directement la création de boutons de cette forme ou s'il fallait passer obligatoirement par un canevas avec des images pour les boutons...

        Citation : fred1599

        Je pense que tu veux parler de padx et pady


        Merci d'avoir mis un exemple; je réalise que j'utilisais padx et pady lors de la création du widget Button et non dans le pack ou grid.

        Citation : fred1599

        Faudra tester, mais je pense à l'option takefocus.


        Non, ce n'est pas takefocus, qui a plutôt pour effet de permettre la tabulation. Merci quand meme!
        • Partager sur Facebook
        • Partager sur Twitter
          19 mars 2011 à 21:24:36

          La forme des boutons c'est juste dû au fait que le screenshot a été pris sous Mac.
          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2011 à 21:16:28

            Merci pour ton éclaircissement, Plug'n'Play 512!
            • Partager sur Facebook
            • Partager sur Twitter

            Questions interface graphique Tkinter

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown