[python] tkinter

Fermé
frizou11 - 12 mai 2006 à 15:27
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 - 14 mai 2006 à 23:59
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

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
12 mai 2006 à 16:36
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
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
12 mai 2006 à 16:16
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
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
12 mai 2006 à 16:17
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
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
14 mai 2006 à 16:46
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
14 mai 2006 à 16:57
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
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
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
14 mai 2006 à 20:47
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
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
14 mai 2006 à 23:59
"sinon il ne s'affiche page."

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