2013-07-15 5 views
11

Il codice seguente produce un brutto ma funzionale esempio di utilizzo di una barra di scorrimento in un widget di testo e genera un paio di domande. Nota: questo viene fatto usando Python 3 su una finestra di Windows.Come codificare il modulo "scrolledtext" di tkinter

  1. La barra di scorrimento che appare è fissato al telaio e anche se scorre il contenuto della casella di testo, preferirei che si era attaccato al widget di testo stesso. Non sono stato in grado di farlo accadere.

  2. C'è un numero di riferimenti a un modulo Tkinter chiamato "scrolledtext" che dovrebbe essere un meccanismo molto migliore per aggiungere barre di scorrimento a caselle di testo ma, non ho trovato alcun esempio su come importarlo e chiamarlo che sono in grado di mettermi al lavoro (probabilmente ho bisogno di un esempio).


frame1 = tk.Frame(win,width=80, height=80,bg = '#808000') 
frame1.pack(fill='both', expand='yes') 
scrollbar = Scrollbar(frame1) 
scrollbar.pack(side=RIGHT, fill=Y) 
editArea = Text(frame1, width=10, height=10, wrap=WORD, yscrollcommand=scrollbar.set) 
editArea.pack()  
scrollbar.config(command=editArea.yview) 
editArea.place(x=10,y=30) 

risposta

20

Avevi ragione, è possibile utilizzare il widget ScrolledText dal modulo tkinter.scrolledtext, come questo:

import tkinter as tk 
import tkinter.scrolledtext as tkst 

win = tk.Tk() 
frame1 = tk.Frame(
    master = win, 
    bg = '#808000' 
) 
frame1.pack(fill='both', expand='yes') 
editArea = tkst.ScrolledText(
    master = frame1, 
    wrap = tk.WORD, 
    width = 20, 
    height = 10 
) 
# Don't use widget.place(), use pack or grid instead, since 
# They behave better on scaling the window -- and you don't 
# have to calculate it manually! 
editArea.pack(padx=10, pady=10, fill=tk.BOTH, expand=True) 
# Adding some text, to see if scroll is working as we expect it 
editArea.insert(tk.INSERT, 
"""\ 
Integer posuere erat a ante venenatis dapibus. 
Posuere velit aliquet. 
Aenean eu leo quam. Pellentesque ornare sem. 
Lacinia quam venenatis vestibulum. 
Nulla vitae elit libero, a pharetra augue. 
Cum sociis natoque penatibus et magnis dis. 
Parturient montes, nascetur ridiculus mus. 
""") 
win.mainloop() 

E ci si va:

enter image description here

9

Mentre si utilizza il widget ScrolledText si potrebbero risparmiare alcune righe di codice, non si sta facendo nulla che non si può fare da soli. Farlo da solo aiuterà a rimuovere parte del mistero.

In realtà stai facendo tutto quasi corretto. L'errore che stai facendo è che dovresti avere il tuo widget di testo che riempie completamente il suo contenitore piuttosto che essere solo una piccola parte di esso.

Il metodo standard per fare questo è come questo:

container = tk.Frame(...) 
text = tk.Text(container, ...) 
scrollbar = tk.Scrollbar(container, ...) 
scrollbar.pack(side="right", fill="y") 
text.pack(side="left", fill="both", expand=True) 

Questo è tutto ciò che devi fare. Ora, non importa quanto grande sia il contenitore a causa del ridimensionamento della finestra, ecc., La barra di scorrimento apparirà sempre allegata al widget di testo. Trattate quindi questo intero gruppo di container, widget di testo e barra di scorrimento come un singolo widget quando lo aggiungete all'intera GUI.

Si noti che è possibile utilizzare anche la griglia. Pack è più facile se hai solo una barra di scorrimento verticale. Se hai sia barre di scorrimento orizzontali che verticali, la griglia ha un po 'più senso.

Per completare l'illusione, è possibile impostare l'ampiezza del bordo del widget di testo su zero e impostare l'ampiezza del bordo del riquadro di contenimento su 1 con un rilievo di incassato e la barra di scorrimento apparirà "dentro" al widget di testo .

Ecco un esempio di lavoro completo che sembra più o meno come il tuo esempio:

import Tkinter as tk 

win = tk.Tk() 

win.configure(background="#808000") 

frame1 = tk.Frame(win,width=80, height=80,bg = '#ffffff', 
        borderwidth=1, relief="sunken") 
scrollbar = tk.Scrollbar(frame1) 
editArea = tk.Text(frame1, width=10, height=10, wrap="word", 
        yscrollcommand=scrollbar.set, 
        borderwidth=0, highlightthickness=0) 
scrollbar.config(command=editArea.yview) 
scrollbar.pack(side="right", fill="y") 
editArea.pack(side="left", fill="both", expand=True) 
frame1.place(x=10,y=30) 

win.mainloop() 

Personalmente non consiglio di fare le importazioni globali, e mi consiglia di non utilizzare posto, ma volevo per mantenerlo il più vicino possibile all'originale.