IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Tkinter : Nouveau widget listbox - Prob frame container


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Tkinter : Nouveau widget listbox - Prob frame container
    Bonjour ,

    Sous tkinter, avec python, j'ai commencé à créer une sorte de listbox où je souhaite mettre n'importe quel type de widget.

    En glanant sur Internet, j'ai réussi en partie.

    Seulement , dans le code qui suit (un exemple), j'insère un bouton dans ma listbox en étant obliger de précisant la frame container fr1

    button = Tk.Button(lbox.fr1, ...
    lbox.insert(button)

    Je voudrais pouvoir faire dépendre mon bouton à la listbox (et non pas à la sous frame fr1) et trouver le moyen de le positionner dans fr1 seulement lors du codage de la listbox :

    button = Tk.button(lbox, ...
    lbox.insert(button)

    def insert(self, item): ???


    Une aide serait la bienvenue (même un début de piste),
    merci à tous !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    import Tkinter as Tk
     
    class Listbox(Tk.Frame):
     
        def __init__ (self, parent):
     
            Tk.Frame.__init__(self, parent, bd=2, relief=Tk.RIDGE)
     
            self.parent = parent
     
            self.width = 0
            self.height = 0
     
            self.grid()    
            self.rowconfigure(0,weight=1)
            self.columnconfigure(0,weight=1)
     
            self.cnv = Tk.Canvas(self, bd=0)
            self.fr1 = Frame(self.cnv)
     
            self.vsb = Tk.Scrollbar(self)
     
            self.cnv.grid(column=0,row=0,sticky="NSEW")
            self.cnv.create_window(0, 0, window=self.fr1)

  2. #2
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,

    Quand tu insères ton Boutton, il faudrait qu'il est slave en master
    Mais ensuite quant tu le grid tu met self.fr_1 en in_ .

    self.cnv.grid( in_ = self.fr_1, column=0,row=0,sticky="NSEW")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    étant obliger de précisant la frame container fr1
    Fait une liste de frame. A chaque insert,

    self.ma_liste_de_frames.append( Frame )
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut complément code
    Merci pour ta réponse, je vais tester cette solution.

    Pour l'instant, je remets mon code car j'avais fait une fausse manœuvre et il était incomplet.

    Le voici donc en entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    import Tkinter as Tk
     
    class Listbox(Tk.Frame):
     
        def __init__ (self, parent):
     
            Tk.Frame.__init__(self, parent, bd=2, relief=Tk.RIDGE)
     
            self.parent = parent
     
            self.width = 0
            self.height = 0
     
            self.grid()    
            self.rowconfigure(0,weight=1)
            self.columnconfigure(0,weight=1)
     
            self.cnv = Tk.Canvas(self, bd=0)
            self.fr1 = Frame(self.cnv)
     
            self.vsb = Tk.Scrollbar(self)
     
            self.cnv.grid(column=0,row=0,sticky="NSEW")
            self.cnv.create_window(0, 0, window=self.fr1)
     
            self.vsb.configure(command=self.cnv.yview)
            self.cnv.configure(yscrollcommand=self.vsb.set)
     
            self.fr1.update_idletasks()
     
            self.bind("<Configure>", self.resize)
     
        def resize(self, event):
     
            self.width = event.width
            self.height = event.height
     
            self.fr1.update_idletasks()
     
            self.scrollbar_visbility()
     
     
        def insert(self, item):
     
            item.pack()
     
            self.fr1.update_idletasks()
            self.cnv.config(scrollregion=self.cnv.bbox("all"))
            self.cnv.configure(width=self.fr1.width)
     
            self.scrollbar_visbility()
     
     
        def scrollbar_visbility(self):
     
            if self.height > self.fr1.height:
                self.vsb.grid_forget()
            else:
                self.vsb.grid(column=1,row=0,sticky="NSEW")
     
    class Frame(Tk.Frame):
     
        def __init__(self, parent):
     
            Tk.Frame.__init__(self, parent, bd=0)
     
            self.parent = parent
     
            self.width = 0
            self.height = 0
     
            self.bind("<Configure>", self.resize)
     
        def resize(self, event):
     
            self.width = event.width
            self.height = event.height
     
     
    root = Tk.Tk()
    lbox = Listbox(root)
    root.grid()
    root.rowconfigure(0,weight=1)
    root.columnconfigure(0,weight=1)
    lbox.grid(column=0,row=0,sticky="NS")
     
    for i in range(0,10):
        button = Tk.Button(lbox.fr1, width=10, height=2, text="%s" %(chr(i+65)), command=root.quit)
        lbox.insert(button)
     
    root.mainloop()

  4. #4
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    OK vincent.mbg, ta solution fonctionne parfaitement, vraiment tu m'aides bien.

    Voici donc la modif du code :

    dans ma class Listbox :

    def insert(self, item):

    item.pack(in_= self.fr1)


    et donc son utilisation :
    button = Tk.Button(lbox... disparue la frame .fr1

    J'ai retrouvé la doc du "in_" ici :
    [URL="http://infohost.nmt.edu/tcc/help/pubs/tkinter/grid.html"]

    To register w as a child of some widget w2, use in_=w2. The new parent w2 must be a descendant of the parent widget used when w was created.

    Maintenant, c'est clair, mais quand on lit la doc comme ça, c'est pas évident, je te félicite d'avoir su l'utiliser. Il y a plein d'autres indications très intéressantes, mais sans exemple, c'est pô facile d'avancer.

    Bon, ma listbox avance plutôt bien.

    Lorsque mes codes seront fonctionnels, je les posterai. Je crois que ce widget est celui qi manque le plus à tkinter. (quelqu'un l'a peut être déjà fait, mais je ne l'a pas trouvé - la listbox de tkinter ne permet que d'insérer des labels) Avec ça, je suis même en train d'en faire un widget table.

    Bye...

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut post-sciptum
    Je viens d'améliorer un tout petit point du code précédent.
    Le prob n'était pas le même que le sujet : l'ascenseur du scrollbar se positionnait au milieux.
    Je ne sais pas si la solution est élégante, pour le moment elle fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	def scrollbar_visbility(self):
    
    		if self.height > self.fr1.height:
    			self.vsb.grid_forget()
    		else:
    			self.vsb.grid(column=1,row=0,sticky="NSEW")
    			self.cnv.yview_moveto(0)

  6. #6
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut post-scriptum 2
    C'est bien ce que je subodorais au sujet du scrollbar, ma correction précédente n'était pas propre.

    Dans :

    self.cnv.create_window(0, 0, window=self.fr1)

    il faut ajouter un ancrage :

    self.cnv.create_window(0, 0, window=self.fr1, anchor=Tk.N)

    et l'ascenseur se place normalement en haut.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Android] Mobideals : Un nouveau widget de partage de bons plans !
    Par gégé140488 dans le forum Mon application mobile
    Réponses: 1
    Dernier message: 15/11/2012, 23h22
  2. Réponses: 0
    Dernier message: 22/09/2010, 20h26
  3. Ajouter un nouveau widget à Qt Designer
    Par warent dans le forum Débuter
    Réponses: 1
    Dernier message: 22/06/2010, 03h10
  4. Réponses: 3
    Dernier message: 28/04/2010, 16h11
  5. [Tkinter] Redimensionner une Listbox
    Par THE_VIP dans le forum Tkinter
    Réponses: 6
    Dernier message: 29/05/2008, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo