[python] tkinter

frizou11 -  
sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   -
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. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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
    1. frizou11
       
      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
      0
  2. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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.
    0
  3. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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.
    0
  4. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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()
    0
    1. frizou11
       
      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()
      
      
      
      0
  7. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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()).
    0
    1. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
       
      "sinon il ne s'affiche page."

      ==> "sinon il ne s'affiche pas."
      0