2009-12-09 14 views
8

Mi piacerebbe avere uno Frame, in cui l'utente possa aggiungere tutti i campi di testo necessari per l'applicazione.Come posso ottenere una cornice con una barra di scorrimento in Tkinter?

L'applicazione inizia con un campo di testo e un pulsante sotto quel campo di testo. Quando l'utente preme il pulsante, verrà aggiunta una nuova voce di testo al di sotto della prima (può essere ripetuta innumerevoli volte). Al centro della finestra, ci sarà un widget Text, utilizzato per visualizzare il testo :)

Tuttavia, ho notato questo nella documentazione:

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

C'è un modo per utilizzare il Scrollbar con un Frame?

risposta

8

Se è possibile utilizzare Tix, c'è il widget di ScrolledWindow che ha un window Telaio e uno o due widget Scrollbar:

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

Modificare la dimensione della finestra principale. Dovrai aggiungere il codice all'evento focus_get dei widget Entry per far scorrere la ScrolledWindow durante la tabulazione attraverso la tastiera.

In caso contrario, sarà necessario utilizzare un widget Canvas (è possibile aggiungere sottoliste Label, Entry e Text) e scrivere un codice molto più personale per implementare le funzionalità richieste.

6

Il seguente è un esempio di barre di scorrimento automatico nascondigli che funziona solo se si utilizza il griglia geometria direttore, preso dalla documentazione 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

Non credo che questo problema è rilevante. Ho appena scaricato Python 2.6.6 per Windows e viene fornito con Tix. Quindi, sembra funzionare altrettanto bene di Tkinter. –

+0

Grazie! È stato un grande aiuto – reckoner

+0

Ho provato a rifattorizzare il codice in questa risposta nella sua 'classe' riutilizzabile, ma non ha avuto successo. Se hai un momento per guardare la mia domanda qui, lo apprezzerei molto: http://stackoverflow.com/questions/30018148/python-tkinter-frame-class-with-autohiding-scroll-bars Inoltre, Rinzler , perché hai pubblicato questo codice come una modifica anziché come una risposta a sé stante? I commenti esistenti dal 2010 non hanno senso ora, e il rappresentante che ho ricevuto invitando questo codice finisce per andare invece al calcolatore, che non ha nulla a che fare con il codice. Dovresti pubblicare una nuova risposta e quindi ripristinare le tue modifiche. – ArtOfWarfare

Problemi correlati