Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher une image dans un canvas avec tkinter

dans une classe.

Sujet résolu
    19 janvier 2018 à 17:35:32

    Salut tous,  je suis un cours sur ce site et l'objectif que je dois atteindre en ce moment est la création d'un labyrinthe en réseau avec interface graphique côté client. j'ai fais pas mal d'essais sur des bouts de code pour comprendre comment se comporte python 3.6.4, Je commence donc une classe qui me permet d'afficher l'interface voulue. Histoire d'agrémenter l'interface et tester en même temps certaines possibilités en vue de la suite, j'ai désiré y intégrer une image, via Canevas. mais ce fameux canevas n'affiche l'image que si je lance un mainloop() directement à la suite de sa création. Je mets le code ci-dessous: Et si quelqu'un a une idée je suis preneur. autrement je ferais ma fenetre hors classe et tant pis pour la beauté des classes.

    #-------------------------------------------------------------------------------
    # Name:        module1
    # Purpose:     afficher une fenêtre avec deux Canevas, un champ de saisie, un label
    #
    # Author:      environ 800m au dessus du niveau de la mer.
    #  
    # Created:     17.01.2018
    # Copyright:   (c) à gauche 2018
    # Licence:     <to kill>

    #------------------------------------------------------------------------------- #Importation de la librérie qui permettra de créer ma fenêtre from tkinter import * import os class Wclient(Tk): def __init__(self, parent): Tk.__init__(self, parent) self.parent = parent self.initialize() self.AIDE = "" def initialize(self): self.grid() #canevas pour déterminter l'emplacement du labyrinthe #sera construit selon l'arrivée du labyrinthe. self.canvas = Canvas(self) self.canvas.configure(width=300, height=300, bg='red') self.canvas.create_text(150,150, text='Mire') self.canvas.grid(row=1,rowspan=10) #champ de saisie self.entryvariable = StringVar() self.entry = Entry(self, textvariable=self.entryvariable) self.entry.grid(column=1, row=10, sticky='S') self.entry.bind('<Return>', self.OnPressEnter) self.entryvariable.set(u"Enter text here") #C'est la ligne en haut, qui rapelle la dernière frappe self.labelvariable = StringVar() self.label = Label(self, anchor=W, fg="white", bg="blue", textvariable=self.labelvariable) self.label.grid(row=0, columnspan=2,sticky=EW) self.labelvariable.set(u"Hello !") ###################################################################################################### #C'est ici que cela se passe: img = PhotoImage(file="rdv.png") canvas = Canvas(self) canvas.configure(width=img.width(), height=img.height()) canvas.create_image(img.width()/2,img.height()/2,image=img) canvas.grid(row=1,column=1) #j'enlève ce mainloop() ci-dessous et l'image disparaît. Si je le laisse, l'image apparaît mais je ne peux plus
    #changer le titre par exemple. #
    self.mainloop() #permet le redimentionnement dynamique self.grid_columnconfigure(0,weight=1) #empèche le redimentionnement self.resizable(False, False) self.update() self.geometry(self.geometry()) self.entry.focus_set() self.entry.selection_range(0, END) def OnPressEnter(self,event): self.labelvariable.set( self.entryvariable.get()) self.entry.focus_set() self.entry.selection_range(0, END) def main(): app = Wclient(None) app.title('Fenêtre') app.mainloop() if __name__ == '__main__': main()



    -
    Edité par Jean-ClaudeAllinger 19 janvier 2018 à 17:40:38

    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2018 à 17:06:48

      Salut,

      En fait, c'est très simple comme erreur, mais je ne peux pas vraiment l'expliquer.

      Lorsque l'on créer un canva contenant une image, il faut gérer ce canva comme étant un label.

      (On le fait pas souvent, parce que normalement, on a plusieurs images dans le même canvas et qu'elles apparaissent tous).

      label = Label(..., image=img)
      label.image = img ## Association de l'image au widget
      label.pack()

      C'est-à-dire qu'il faut lui associé l'image à ce canva.

      img = PhotoImage(file="rdv.png")
      canvas = Canvas(self)
      canvas.configure(width=img.width(), height=img.height())
      canvas.create_image(img.width()/2,img.height()/2,image=img)
      
      canvas.image = img ## Association de l'image au canva.
      
      canvas.grid(row=1,column=1)


      Sans classe, il fonctionne très bien sans association, mais avec une classe, il faut l'associé (Je ne sais pas pourquoi).

      C'est comme s'il se rappelait pas qu'il y a une image...

      Bonne chance

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        29 janvier 2018 à 16:57:25

        Cool, merci pour la réponse, entre temps j'ai réussi à faire fonctionner ce code de la manière suivante:

        #l'image est dans le répertoire du programme
                img = PhotoImage(file='rdv.png')
                wi = img.width()
                hi = img.height()
                C = Canvas(self.myFenetre)
                C['width'] = wi
                C['height'] = hi
                C.create_image(wi/2 ,hi/2 ,image=img)
                C.grid(row=2, column=1)

        En déclarant self.myFenetre dans l'initialisation plutôt en qu'en faisant hériter ma classe de Tk() ça fonctionne:

         def __init__(self):
        
                self.myFenetre = Tk()
                self.myFenetre['width'] = 500
                self.myFenetre['height'] = 400

        Mais je vais reprendre ta réponse et la tester dans différentes conditions, particulièrement ces histoires de Threads qui rendent chèvre.

        Merci pour la réponse.


        • Partager sur Facebook
        • Partager sur Twitter

        Afficher une image dans un canvas avec 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