2009-12-09 5 views
8

Ich hätte gerne eine Frame, wo der Benutzer so viele Textfelder wie von der Anwendung benötigt hinzufügen kann.Wie könnte ich einen Frame mit einer Bildlaufleiste in Tkinter bekommen?

Die Anwendung beginnt mit einem Textfeld und einer Schaltfläche unter diesem Textfeld. Wenn der Benutzer den Knopf drückt, wird ein neuer Texteintrag unterhalb des ersten eingefügt (dies kann unzählige Male wiederholt werden). In der Mitte des Fensters, wird es eine Text Widget sein, verwendet, um Text jedoch :)

anzuzeigen, bemerkte ich dies in der Dokumentation:

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

Gibt es eine Möglichkeit, die Scrollbar zu verwenden mit einer Frame?

Antwort

8

Wenn Sie Tix verwenden können, gibt es das ScrolledWindow Widget, das einen window Rahmen und ein oder zwei Scrollbar-Widgets hat:

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() 

ändern Sie die Größe der Root-Fenster. Sie möchten dem focus_get-Ereignis der Entry-Widgets Code hinzufügen, um im Fenster "ScrolledWindow" zu blättern, wenn Sie über die Tastatur navigieren.

Andernfalls müssen Sie ein Canvas-Widget verwenden (Sie können Label-, Entry- und Text-Subwidgets hinzufügen) und viel mehr Code selbst schreiben, um die erforderliche Funktionalität zu implementieren.

6

Das folgende ist ein Beispiel für Auto versteckt Bildlaufleisten, das funktioniert nur, wenn Sie nur die Raster Manager Geometrie verwenden, aus der Dokumentation effbot.org genommen:

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

Ich glaube nicht, dieses Problem ist relevant. Ich habe gerade Python 2.6.6 für Windows heruntergeladen, und es kommt mit Tix. Es scheint also genauso gut zu funktionieren wie Tkinter. –

+0

Danke! Das war eine große Hilfe. – reckoner

+0

Ich habe versucht, den Code in dieser Antwort in seine eigene wiederverwendbare "Klasse" umzuwandeln, war aber nicht erfolgreich. Wenn Sie einen Moment haben, um meine Frage hier zu sehen, würde ich es wirklich schätzen: http://stackoverflow.com/questions/30018148/python-tkinter-frame-class-with-autohiding-scroll-bars Auch, Rinzler Warum haben Sie diesen Code als Bearbeitung und nicht als eigenständige Antwort veröffentlicht? Die vorhandenen Kommentare von 2010 machen jetzt keinen Sinn, und der von mir vereidigte Vertreter, der diesen Code aktualisiert hat, wird stattdessen zum Berichterstatter, der nichts mit dem Code zu tun hat. Sie sollten eine neue Antwort posten und dann Ihre Änderungen rückgängig machen. – ArtOfWarfare