2009-12-09 5 views
8

Je voudrais avoir un Frame, où l'utilisateur pourrait ajouter autant de champs de texte que nécessaire par l'application.Comment puis-je obtenir un cadre avec une barre de défilement dans Tkinter?

L'application commence par un champ de texte et un bouton sous ce champ de texte. Lorsque l'utilisateur appuie sur le bouton, une nouvelle entrée de texte sera ajoutée au-dessous du premier (cela peut être répété d'innombrables fois). Au milieu de la fenêtre, il y aura un widget Text, utilisé pour afficher le texte :)

Cependant, Je l'ai remarqué dans la documentation:

This widget is used to implement scrolled listboxes, canvases, and text fields.

est-il un moyen d'utiliser le Scrollbar avec un Frame?

Répondre

8

Si vous pouvez utiliser Tix, il y a le widget ScrolledWindow qui a un cadre window et un ou deux widgets: la barre de défilement

import Tix as tk 

r= tk.Tk() 
r.title("test scrolled window") 
sw= tk.ScrolledWindow(r, scrollbar=tk.Y) # just the vertical scrollbar 
sw.pack(fill=tk.BOTH, expand=1) 
for i in xrange(10): 
    e= tk.Entry(sw.window) 
    e.pack() 
r.mainloop() 

Modifier la taille de la fenêtre racine. Vous voudrez ajouter du code à l'événement focus_get des widgets Entry pour faire défiler la fenêtre ScrolledWindow lorsque vous ferez défiler le clavier.

Sinon, vous devrez utiliser un widget Canvas (vous pouvez ajouter des sous-widgets Label, Entry et Text) et écrire beaucoup plus de code vous-même pour implémenter la fonctionnalité requise.

6

Voici un exemple de scrollbars Hiding auto qui ne fonctionne que si vous utilisez simplement le grille gestionnaire de géométrie, tirée de la documentation effbot.org:

from tkinter import * 


class AutoScrollbar(Scrollbar): 
    # A scrollbar that hides itself if it's not needed. 
    # Only works if you use the grid geometry manager! 
    def set(self, lo, hi): 
     if float(lo) <= 0.0 and float(hi) >= 1.0: 
      # grid_remove is currently missing from Tkinter! 
      self.tk.call("grid", "remove", self) 
     else: 
      self.grid() 
     Scrollbar.set(self, lo, hi) 
    def pack(self, **kw): 
     raise TclError("cannot use pack with this widget") 
    def place(self, **kw): 
     raise TclError("cannot use place with this widget") 


# create scrolled canvas 

root = Tk() 

vscrollbar = AutoScrollbar(root) 
vscrollbar.grid(row=0, column=1, sticky=N+S) 
hscrollbar = AutoScrollbar(root, orient=HORIZONTAL) 
hscrollbar.grid(row=1, column=0, sticky=E+W) 

canvas = Canvas(root, yscrollcommand=vscrollbar.set, xscrollcommand=hscrollbar.set) 
canvas.grid(row=0, column=0, sticky=N+S+E+W) 

vscrollbar.config(command=canvas.yview) 
hscrollbar.config(command=canvas.xview) 

# make the canvas expandable 
root.grid_rowconfigure(0, weight=1) 
root.grid_columnconfigure(0, weight=1) 

# create canvas contents 
frame = Frame(canvas) 
frame.rowconfigure(1, weight=1) 
frame.columnconfigure(1, weight=1) 

rows = 5 
for i in range(1, rows): 
    for j in range(1, 10): 
     button = Button(frame, text="%d, %d" % (i,j)) 
     button.grid(row=i, column=j, sticky='news') 

canvas.create_window(0, 0, anchor=NW, window=frame) 
frame.update_idletasks() 
canvas.config(scrollregion=canvas.bbox("all")) 

root.mainloop() 
+0

Je ne pense pas que cette question est pertinent. Je viens de télécharger Python 2.6.6 pour Windows, et il vient avec Tix. Donc, il semble fonctionner aussi bien que Tkinter. –

+0

Merci! C'était une grande aide. – reckoner

+0

J'ai essayé de refactoriser le code dans cette réponse en son propre 'class' réutilisable, mais a échoué. Si vous avez un moment pour regarder ma question ici, je l'apprécierais vraiment: http://stackoverflow.com/questions/30018148/python-tkinter-frame-class-with-autohiding-scroll-bars Aussi, Rinzler , pourquoi avez-vous publié ce code comme un edit plutôt que comme une réponse à part entière? Les commentaires existants à partir de 2010 n'ont aucun sens maintenant, et le représentant qui m'a attribué ce code finit par aller au compte-rendu, qui n'a rien à voir avec le code. Vous devez publier une nouvelle réponse, puis annuler vos modifications. – ArtOfWarfare

Questions connexes