[python] tkinter

Bonjour a tous,
je crée une fenetre principale contenant 2 canevas
lorsque je lance mon application ma fenetre principal contient bien les 2 canevas et est adaptée a la taille de ces 2 canevas
mais lorsque manuellement j'agrandis la fenetre principal alors les canevas garde la meme taille. Je me doute qu'il existe un attribut pour que la taille des canevas s'adapte automatiquement a la taille de la fenetre principale mais apres quelques recherches je n'ai pas trouvé... et c'est pourquoi je suis ici
merci d'avance pour votre aide

6 réponses

  1. Modérateur
    frizou11
    c'est normal:

    Tu appelle Frame.__init__(self), mais tu n'a donné aucun parent.

    Tout widget tkinter doit obligatoirement avoir un parent, sinon il ne s'affiche page.

    En principe, le parent de bae est la fenêtre tkinter (ce qui est renvoyé par Tkinter.Tk()).
    1. Modérateur
      "sinon il ne s'affiche page."

      ==> "sinon il ne s'affiche pas."
  2. Modérateur
    euh.. bizarre. Chez moi les deux Pmw.ScrolledCanvas se redimensionnent bien.

    import Tkinter
    import Pmw
    
    class myApplication:
        def __init__(self,root):
            self.root = root 
            self.initialisation() 
    
        def initialisation(self): 
            canvas1 = Pmw.ScrolledCanvas(self.root)
            canvas1.interior().config(background="red")
            canvas1.grid(row=0,column=0,sticky='NSEW')
    
            canvas2 = Pmw.ScrolledCanvas(self.root)
            canvas2.interior().config(background="blue")
            canvas2.grid(row=1,column=0,sticky='NSEW')
            
            self.root.grid_columnconfigure(0,weight=1)
            self.root.grid_rowconfigure(0,weight=1)
            self.root.grid_rowconfigure(1,weight=1)
            
    def main():    
        root = Tkinter.Tk()
        root.title('My application')
        app = myApplication(root)
        root.mainloop()
    
    if __name__ == "__main__":
        main()
    1. c'est encore moi, je vois que ton exemple marche mais jette un coup d'oeil a mon code et corrige le moi stp car je suis en train d'halluciner la, je copie sur ton exemple et ca me marche pas
      voila le code

      # -*- coding: cp1252 -*-
      
      import Tkinter
      import Pmw
      
      
      class Application(Frame):
          """Application principale"""
          def __init__(self, boss =None):
              Frame.__init__(self)
              self.can1 = Pmw.ScrolledCanvas(self)
              self.can1.configure(vscrollmode ='dynamic', hscrollmode ='dynamic')        
              self.can1.resizescrollregion()
              self.canevas1 = self.can1.interior()
              self.canevas1.config(background="red")
      
              self.can2 = Pmw.ScrolledCanvas(self)
              self.can2.configure(vscrollmode ='dynamic', hscrollmode ='dynamic')        
              self.can2.resizescrollregion()
              self.canevas2 = self.can2.interior()
              self.canevas2.config(background="blue")
      
              self.can1.grid(row=0,column=0,sticky='NSEW')
              self.can2.grid(row=1,column=0,sticky='NSEW')
      
      
              self.grid_columnconfigure(0,weight=1)
              self.grid_rowconfigure(0,weight=1)
              self.grid_rowconfigure(1,weight=1)
      
      if __name__ == '__main__':
      
          app = Application()
          app.mainloop()
      
      
      
  3. Modérateur
    j'utilise de widgets ScrolledCanvas du module Pmw
    et ici ton exemple ne marche plus...


    Ah... je n'ai pas là maintenant le temps de regarder.
    Il faudrait voir les différentes options du ScrolledCanvas.
    1. Modérateur
      Voici un exemple:

      Une fenêtre avec 2 canvas, utilisant .grid() (et non pas .pack()).

      import Tkinter
      
      class myApplication:
          def __init__(self,root):
              self.root = root 
              self.initialisation() 
      
          def initialisation(self): 
              canvas1 = Tkinter.Canvas(self.root)
              canvas1.config(background="red")
              canvas1.grid(row=0,column=0,sticky='NSEW')
      
              canvas2 = Tkinter.Canvas(self.root)
              canvas2.config(background="blue")
              canvas2.grid(row=1,column=0,sticky='NSEW')
              
              self.root.grid_columnconfigure(0,weight=1)
              self.root.grid_rowconfigure(0,weight=1)
              self.root.grid_rowconfigure(1,weight=1)
              
      def main():    
          root = Tkinter.Tk()
          root.title('My application')
          app = myApplication(root)
          root.mainloop()
      
      if __name__ == "__main__":
          main() 
      


      Il suffit:
      - sur chaque widget, de spécifier sticky='NSEW' lors de son .grid()
      - puis de configurer le poids (weight) de chaque ligne et colonne de ta grille.

      Pour comparer, commenter les lignes columnconfigure et rowcconfigure: Les canvas ne s'agrandissent pas.

      Jeu amusant:
      Modifier les weight, ce qui permet d'avoir des widgets qui se partage la place disponible dans des proportions différentes.
      1. bonjour,
        ton exmple marche tres bien et c'est bien ce que j'attends mais j'ai un souci
        au lieu d'utiliser deux widgets Canvas, j'utilise de widgets ScrolledCanvas du module Pmw
        et ici ton exemple ne marche plus...
        as-tu la solution pour avoir le meme resultat avec les widgets ScrolledCanvas ?
        ou sinon je peux garder ton exemple mais il me faut rajouter les barres défilement lorsque les Canvas contiennent une image plus grande qu'eux... et je sais pas comment on fait, c'est pourquoi j'utilise ScrolledCanvas. Si tu sais comment le faire sans utiliser ScrolledCanvas...

        Merci de ta réponse
    2. Modérateur
      PS: Les canvas sont faits pour dessiner dedans.
      Si tu veux juste t'en servir pour contenir d'autres widgets (boutons, zones de texte, etc.), il vaut mieux prendre des frames.
      1. Modérateur
        les canevas garde la meme taille

        Par défaut, tout conteneur (canvas, frame, group, etc.) prend les dimensions suffisantes pour ce qu'il contient.

        Donc il s'adapte à ce qu'il doit contenir, et non à celui qui le contient.

        Si tu utilises la méthode .pack() pour créer les widgets, je te conseille de les remplacer par .grid() qui donne beaucoup plus de souplesse.
        (Attention: ne pas mélanger .pack() et .grid(), sinon plantages assurés).

        Je vais donner un petit exemple.