Tkinter barre de défilement pour l'image
Mon objectif est d'ajouter une barre de défilement verticale pour un cadre qui a plusieurs étiquettes en elle. La barre de défilement doit automatiquement activé dès que les étiquettes à l'intérieur du cadre dépasser la hauteur de l'image. Après recherche j'ai trouvé cette utile de poste. Basé sur ce post, je comprends que, pour atteindre ce que je veux, (corrigez-moi si je me trompe, je suis un débutant) j'ai créer un Frame
d'abord, puis de créer un Canvas
à l'intérieur de ce cadre et le bâton de la barre de défilement de l'image ainsi. Après cela, créez un autre cadre et de le mettre à l'intérieur de la toile comme un objet de la fenêtre. Donc, je suis finalement arrivé à ceci:
from Tkinter import *
def data():
for i in range(50):
Label(frame,text=i).grid(row=i,column=0)
Label(frame,text="my text"+str(i)).grid(row=i,column=1)
Label(frame,text="..........").grid(row=i,column=2)
def myfunction(event):
canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
root=Tk()
sizex = 800
sizey = 600
posx = 100
posy = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
myframe=Frame(root,relief=GROOVE,width=50,height=100,bd=1)
myframe.place(x=10,y=10)
canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)
myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((0,0),window=frame,anchor='nw')
frame.bind("<Configure>",myfunction)
data()
root.mainloop()
- Suis-je en train de faire? Est-il mieux/plus intelligente de manière à atteindre la sortie de ce code m'a donné?
- Pourquoi dois-je utiliser la grille de la méthode? (J'ai essayé la méthode place, mais aucune des étiquettes apparaissent sur la toile.)
- Quoi de si spécial à propos de l'utilisation
anchor='nw'
lors de la création de la fenêtre sur la toile?
Veuillez garder votre réponse simple, car je suis un débutant.
- Vous avez à l'envers dans votre question, si le code est correct à première vue. Vous devez créer un cadre, l'incorporer dans le canevas, puis fixez la barre de défilement sur la toile.
- double possible de l'Ajout d'une barre de défilement à une grille de widgets de Tkinter
- Il y a beaucoup de choses c'est un doublon potentiel, mais j'ai voté pour fermer cette comme un doublon d'un autre qui semble avoir les meilleures réponses: stackoverflow.com/questions/1873575/...
- Je suis très en retard, mais merci beaucoup pour cette! C'était le seul entièrement fonctionnel (et complète) exemple de création d'un cadre défilant à l'aide seulement de la pure Tkinter (une restriction pour mon projet). Je sais que ce n'était pas votre intention, mais je vous remercie!
Vous devez vous connecter pour publier un commentaire.
Suis-je en train de faire?Est-il mieux/plus intelligente de manière à atteindre la sortie de ce code m'a donné?
Généralement parlant, oui, vous le faites à droite. Tkinter n'a pas natif de défilement conteneur autre que la toile. Comme vous pouvez le voir, il est vraiment pas difficile à mettre en place. Comme ton exemple le montre, il ne prend que 5 ou 6 lignes de code pour le faire fonctionner, selon la façon de compter les lignes.
Pourquoi dois-je utiliser la grille de la méthode?(j'ai essayé la méthode place, mais aucune des étiquettes apparaissent sur la toile?)
Vous vous demandez pourquoi, vous devez utiliser la grille. Il n'est pas nécessaire d'utiliser la grille. Place de la grille, et pack peuvent tous être utilisés. C'est tout simplement que certains sont plus naturellement adapté à certains types de problèmes. Dans ce cas, il semble que vous êtes en train de créer une véritable grille-lignes et les colonnes d'étiquettes, de sorte de grille est le choix naturel.
Quoi de si spécial à propos de l'utilisation d'ancrage='nw' lors de la création de la fenêtre sur la toile?
L'ancre vous indique quelle partie de la fenêtre est positionné aux coordonnées que vous donnez. Par défaut, le centre de la fenêtre sera placé à la coordonner. Dans le cas de votre code ci-dessus, vous voulez le coin supérieur gauche ("nord-ouest") angle d'être à la coordonner.
Veuillez noter que le projet de code n'est valide qu'avec Python 2
Voici un exemple:
Il n'a pas encore la molette de la souris lié à la barre de défilement, mais il est possible. Le défilement avec la molette peut être un peu chaotique, cependant.
edit:
1)
À mon humble avis défilement des images est un peu délicat dans Tkinter, et ne semble pas faire beaucoup. Il semble qu'il n'y est pas de manière élégante de le faire.
Un problème avec votre code, c'est que vous devez définir la taille du canevas manuellement - c'est ce que l'exemple de code que j'ai posté en résout.
2)
Vous parlez de la fonction transfert de données? Place fonctionne pour moi, trop. (En général je préfère la grille).
à 3)
Eh bien, c'positions de la fenêtre sur la toile.
Une chose que j'ai remarqué, c'est que votre exemple gère la souris molette de défilement par défaut, tandis que celui que j'ai posté ne fonctionne pas. Aurez à regarder qu'à un certain moment.
VerticalScrolledFrame
, que vous pouvez utiliser comme un remplacement pour toutFrame
. Aller avec le code dans votre solution, vous avez besoin de réécrire tout le code pour chaqueFrame
qui vous voulez être en mesure de les faire défiler. Avec ce code, c'est presque une baisse-dans le remplacement pourFrame
. Donc, ne pas hésiter à l'utiliser sur le compte de la ligne de comptage. Sa solution, c'est plus de code si vous avez besoin seulement d'un cadre défilant. Si vous avez besoin de deux, les deux techniques permettent de prendre une quantité égale de code, et le son est plus facile à maintenir (moins redondants.).interior
- je voudrais une interface qui rend.interior
un détail d'implémentation au lieu de faire quelque chose de la personne qui l'utilise a à savoir sur.Veuillez voir ma classe qui est un cadre défilant. C'est de la barre de défilement verticale est lié à
<Mousewheel>
événement. Donc, tout ce que vous avez à faire est de créer un cadre, de le remplir avec des widgets de la manière que vous aimez, et ensuite faire de ce cadre un enfant de monScrolledWindow.scrollwindow
. N'hésitez pas à demander si quelque chose n'est pas claire.Beaucoup de @ Brayan Oakley réponses à cette questions
self.canv.config(height= ...)
self.sw = ScrolledWindow(self.root)
alors vous attribuer, pour les enfants commeself.child(self.sw.scrollwindow, any of the child's options
donc pour ajouter un bouton à il seraitself.btn = tk.Button(self.sw.scrollwindow, text = 'Button', command = lambda: print("Button Pressed"))
Nous pouvons ajouter de la barre de défilement, même sans l'aide de la Toile. Je l'ai lu dans de nombreux autres post, on ne peut pas ajouter de la barre de défilement verticale dans l'image directement etc etc. Mais après avoir fait beaucoup d'expérience découvert façon d'ajouter de la verticale ainsi que la barre de défilement horizontale :). Veuillez trouver ci-dessous le code qui est utilisé pour créer une barre de défilement dans le treeView et le cadre.
import Tkinter
,import Tkinter as tk
etimport ttk
. Les deux premiers sont redondants, de sorte que tous les endroits qu'il aTkinter.NSEW
par exemple, il pouvait juste mettretk.NSEW
.ttk
est son propre module, et le Treeview est une classe qui n'existe que dans ce module, de sorte que l'instruction est la façon dont il devrait être.