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 :

Probleme avec Scrollbar


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Points : 27
    Points
    27
    Par défaut Probleme avec Scrollbar
    Salut les gens, j'ai beau farfouiller sur les forums, les tutos, etc, je n'arrive pas à trouver de solution à mon problème : je souhaite mettre une scrollbar verticale à ma fenêtre principale.
    Si quelqu'un peut me montrer sur mon code et m'expliquer le pourquoi du comment. Je voudrais avoir une scrollbar pour tout 'self'.
    Je sais, ça fait 'donnez moi la solution toute faite', mais je n'arrive vraiment pas à comprendre comment l'implémenter et surtout je veux comprendre le fonctionnement.

    Voilà mon code simplifié :
    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
     
    ## START WINDOW #####################################################################
            class simpleapp_tk(Tkinter.Tk):
                def __init__(self,parent):
                    Tkinter.Tk.__init__(self,parent)
                    self.parent = parent
                    self.initialize()
                    self.minsize(650,85)
                    self.iconbitmap("images/updater.ico")
     
                def initialize(self):                    
                    self.grid()
                    l=9
                    i=0
     
                    ## AFFICHE NBR ACTIVE SKINS ##
                    self.labelVariable = Tkinter.StringVar()
                    label = Tkinter.Label(self,textvariable=self.labelVariable,
                                          anchor="w",fg="black")
                    label.grid(column=0,row=0,sticky='EW',columnspan=2)
     
                    if nbr_actived_skin==1 or nbr_actived_skin==0:
                        self.labelVariable.set(str(nbr_actived_skin)+" Actived skin\n")
                    else:
                        self.labelVariable.set(str(nbr_actived_skin)+" Actived skins\n")
     
                    ## AFFICHE BOUTTON REFRESH ##
                    monimagezz = Image.open("images/refresh.png")
                    photozz = ImageTk.PhotoImage(monimagezz)
                    label = Tkinter.Label(image=photozz)
                    label.image = photozz
                    label.pack()
                    label.place(x=620, y=5, width=30, height=30)
                    label.bind("<Button-1>", refresh_window)
     
                    l=9
                    i=0
     
                    while i<len(skins):
                        if i in liste_nom_skin and i not in liste_popup:
                            ## AFFICHE BARRE TOP SKINS ##
                            monimage = Image.open("images/barre_top_skin.png")
                            photo = ImageTk.PhotoImage(monimage)
                            label = Tkinter.Label(image=photo)
                            label.image = photo
                            label.pack()
                            label.grid(column=1,row=l,sticky='EW',columnspan=2)
     
                            ## AFFICHE NOM ET VERSION INSTALLED SKINS ##
                            self.labelVariable = Tkinter.StringVar()
                            label = Tkinter.Label(self,textvariable=self.labelVariable,
                                                  anchor="w",fg="black")
                            label.grid(column=1,row=l+1,sticky='EW')
                            self.labelVariable.set(liste_nom_skin[i] + " (" + liste_version_skin[i] +")")
     
                        if i in liste_popup:
                            popup(liste_popup[i])
     
                        l+=3
                        i+=1
     
                    ## CONFIG SELF ##
                    self.grid_columnconfigure(0,weight=600)
                    self.grid_columnconfigure(1,weight=1)
                    self.resizable(False,True)
                    self.update()
     
            if __name__ == "__main__":
                app = simpleapp_tk(None)
                app.title("Rainmeter skins updater")
                app.mainloop()
    Et petit plus, je ne veux voir la scrollbar que si la fenêtre est trop petite pour afficher tout son contenu (si on réduit la hauteur).

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour

    Pour cela vous devez utiliser comme parent un widget ayant les méthodes pour utiliser une Scrollbar, le Canvas me semble bien ici.
    Pour ce qui est de faire apparaître ou disparaître la Scrollbar faite un bind sur l'event '<Configure>'. Dans votre fonction (celle du bind) comparez la taille du Canvas avec celle dont il a besoin (.winfo_reqheight()/.winfo_reqwidth()) et si c'est assez grand utilisez la méthode .grid_forget() sur votre Scrollbar. grid conserve la position donc dans le cadre contraire un simple scrollbar.grid() lui refait prendre sa place.

    @+

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Points : 27
    Points
    27
    Par défaut
    Le parent existe déjà : 'parent', il suffit donc que je le définisse comme un canvas ?
    Un canvas n'est pas plutôt pour des dessins 2D ? Pourquoi pas une frame ?

    J'men vais tester tout ça. Merci

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par PauseKawa Voir le message
    grid conserve la position donc dans le cadre contraire un simple scrollbar.grid() lui refait prendre sa place.
    Et dire que j'ai écrit cela... C'est faux (Pour ma défense j'étais sur une classe de repositionnement des Widgets... Ok, pas d’excuse).

    Citation Envoyé par MangeMouette Voir le message
    Le parent existe déjà : 'parent', il suffit donc que je le définisse comme un canvas ?
    Un canvas n'est pas plutôt pour des dessins 2D ? Pourquoi pas une frame ?

    J'men vais tester tout ça. Merci
    Le Widget Frame n'as pas les méthodes pour être utiliser avec le Widget Scrollbar, le Canvas oui.
    Petit coup de pouce (Vraiment petit par rapport à Tix ou Pmw, mais cela fonctionne sous Python 2/3) du dimanche:
    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
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    class simpleapp_tk(Tk.Tk):
        def __init__(self):
            Tk.Tk.__init__(self)
            self.vsb = Tk.Scrollbar(self, orient=Tk.VERTICAL)
            self.vsb.grid(row=0, column=1, sticky=Tk.N+Tk.S)
            self.hsb = Tk.Scrollbar(self, orient=Tk.HORIZONTAL)
            self.hsb.grid(row=1, column=0, sticky=Tk.E+Tk.W)
            self.canv = Tk.Canvas(self,
                                  yscrollcommand=self.vsb.set,
                                  xscrollcommand=self.hsb.set)
            self.canv.grid(row=0, column=0, sticky=Tk.N+Tk.S+Tk.E+Tk.W)
            self.vsb.config(command=self.canv.yview)
            self.hsb.config(command=self.canv.xview)
            self.grid_columnconfigure(0, weight=1)
            self.grid_rowconfigure(0, weight=1)
            self.frm = Tk.Frame(self.canv)
            for x in range(10):
                for y in range(10):
                    Tk.Label(self.frm,
                             text="x%d, y%d"% (x, y),
                             bg='white').grid(row=y,
                                              column=x,
                                              padx=5,
                                              pady=5,
                                              ipadx=2,
                                              ipady=2)
            self.canv.create_window(0, 0, window=self.frm)
            self.frm.update()
            self.canv.config(scrollregion=self.canv.bbox(Tk.ALL))
            self.canv.yview_moveto(0)
            self.canv.xview_moveto(0)
            self.geometry("%dx%d"% (self.frm.winfo_reqwidth()+
                                    self.vsb.winfo_width(),
                                    self.frm.winfo_reqheight()+
                                    self.hsb.winfo_height()))
            self.bind("<Configure>", self.on_config)
     
        def on_config(self, event=None):
            if self.winfo_width() > self.frm.winfo_reqwidth():
                self.hsb.grid_forget()
            else:
                self.hsb.grid(row=1, column=0, sticky=Tk.E+Tk.W)
            if self.winfo_height() > self.frm.winfo_reqheight():
                self.vsb.grid_forget()
            else:
                self.vsb.grid(row=0, column=1, sticky=Tk.N+Tk.S)
     
    if __name__ == "__main__":
        app = simpleapp_tk()
        app.title("test: scroll or not scroll")
        app.mainloop()
    C'est sans doute perfectible mais c'est le principe.

    @+

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Points : 27
    Points
    27
    Par défaut
    Nikel, ça marche (c'était pas gagné avec moi ^^) !
    Me reste plus qu'à comprendre tout ça.
    Merci beaucoup et bonne continuation !

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pour information puisque j'en parle plus haut:
    Vous avez des librairies qui intègre ce genre de Widget. Le ScrolledFrame() de Pmw ou encore le ScrolledWindow de Tix.

    @+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/07/2009, 15h15
  2. [ScrollBar] Probleme avec le scrollbar et le focus / roulette
    Par alavoler dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/04/2008, 01h00
  3. Probleme avec ma scrollbar :(
    Par piff62 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 22/04/2005, 11h20
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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