bonjour,
comment associer une Scrollbar à un Frame (par exemple), pour réaliser une sorte de tableur à base de case de type Entry disposées ?
merci d'avance.
bonjour,
comment associer une Scrollbar à un Frame (par exemple), pour réaliser une sorte de tableur à base de case de type Entry disposées ?
merci d'avance.
Une manière simple (mais pas forcement satisfaisante) est d'avoir recours à une tierce bibliothèque, genre Tix, et d'utiliser les modules tout fait (TixScrolledText) qui même s'ils ne correspondent pas exactement à ton besoin (mais peut être que pour d'autres ça sera le cas) feront l'affaire.
Sinon, il faut céer un canevas, une frame dedans, et non seulement créer ta scroll bar
mais aussi l'associer à ton canevas (sur tu créer par la même occasion)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 self.scroll=Scrollbar(self.root,orient=VERTICAL) #ou HORIZONTAL self.scroll.grid(row=0,column=1,sticky=N+S)
et initialiser l'ascenseur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 self.can=Canvas(self.root,yscrollcommand=self.scroll.set) # ou xscrollcommand=self.scroll.set ou les 2 #puis self.scroll.config(command=self.liste.yview) #ou xview
En plus, si ta fenêtre est redimensionable, un petit coup de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 canvas.xview_moveto(0) # ou canvas.yview_moveto(0)
grid_columnconfigure() et grid_rowconfigure() seront nécessaire.
Voilà, j'ai peut être oublié des morceaux mais ça doit te mettre sur la voie
ça m'a l'air viable. et je préfère encore tenter de passer par cette voie que de refaire toute cette partie de mon programme et son interfaçage avec ma base de donnée. mon script est devenu trop bordélique et trop dégueulasse, et je n'ai pas assez de courage pour reprendre.
par contre, je pense que je devrait appliquer assez facilement ce genre de bidouillage.
merci ! (je teste cet après midi ou demain)
euh ben en fait, ça marche pas top. je créé bien un Canvas et un Scrollbar, je les associe bien l'un à l'autre, mais quand je dispose quelque chose sur mon Canvas, qui a une taille supérieure à celui-ci, la scrollbar reste désactivée (grisée).
il n'y aurais pas un petit exemple complet qui marche ?
parce qu'en fait, j'essaie d'utiliser le moins de bibliothèques possibles. étant donné que je devrait faire une distribution en créant un exécutable avec py2exe,moins j'aurais de module à charger pour le bon fonctionnement de mon programme, moins de chance j'aurais de m'arracher les cheveux sur la "pseudo-compilation".
T'arrache pas les cheveux, ils tomberont d'eux même bien assez tôt...
Je regarde ça après manger...
Effectivement.
Moi j'avais fait ça directement avec une zone texte dans le passé.
Si je mets une zone texte dans le canevas et que c'est le canevas qui contrôle la scroll bar, ça ne marche pas.
Question : pourquoi?
démonstration d'un truc qui marche:
Là quand la zone de texte grandit elle agit sur les scroll (et réciproquement)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 self.scroll=Tkinter.Scrollbar(self,orient=Tkinter.VERTICAL) self.scroll.grid(row=0,column=3,sticky=Tkinter.N+Tkinter.S) self.texte=Tkinter.Text(self,width=60,height=10) self.texte.config(yscrollcommand=self.scroll.set) self.texte.grid(row=0,column=0) self.scroll.config(command=self.texte.yview)
Mais pourquoi quand la zone texte est inclue dans un canevas ça ne marche pas? Est-ce que le canevas ne grandit pas? à investiguer.
2ème cas, si tu à ton texte dans ton caneva et que tu lis la scroll barre au 2, ça marche aussi.
par contre c'est pas beau,ne fait pas ça :
edit : piste à explorer : self.can.config(scrollregion=(left, top, right, bottom))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 self.scroll=Tkinter.Scrollbar(self,orient=Tkinter.VERTICAL) self.scroll.grid(row=0,column=3,sticky=Tkinter.N+Tkinter.S) self.can=Tkinter.Canvas(self,yscrollcommand=self.scroll.set) self.can.grid(row=0,column=0,columnspan=3) self.texte=Tkinter.Text(self.can,width=60,height=10) self.texte.config(yscrollcommand=self.scroll.set) self.texte.grid(row=0,column=0) self.scroll.config(command=self.can.yview) self.scroll.config(command=self.texte.yview)
Je confirme que cela marche très bien de cette façon, en fait le principe est d'avoir une ou deux variable (au choix) qui representera l'espace actuellement occupé par l'ensemble des widgets (incluant leur 'inter-espacement') et de vérifier avant d'ajouter un widget si l'espace restant (ScrollRegion-VarEspaceOccupé) sera suffisant ou non, ce qui necessite de connaître la taille du widget que l'on veut placer. Si l'espace restant est insuffisant, on redéfini le scrollRegion (il faut savoir à propos de ce dernier que si l'on essai de récupérer sa valeur, elle sera retournée sous la forme d'un string), pour ma part j'en profite pour pour redéfinir la taille de la Frame mais c'est peut-être inutile, puis on procède à l'insertion du widget...
PS: Je ne sais pas vraiment si le fait d'utiliser la méthode de placement grid changera quoi que ce soit à cette façon de faire, mais en ce qui me concerne je n'utilise que place pour ce cas de figure (je trouve ça plus précis...)
Partager