2013-07-15 12 views
11

Poniższy kod przedstawia nieprzyjemny, ale funkcjonalny przykład używania paska przewijania w widgecie tekstowym i powoduje kilka pytań. Uwaga: odbywa się to za pomocą Pythona 3 na oknie Windows.Sposób kodowania modułu "scrolledtext" tkintera

  1. Pasek przewijania, który pojawia się przymocowany do ramy, a mimo to przewija zawartość pola tekstowego wolałbym, że został dołączony do widgetu tekstowego samego. Nie mogłem tego zrobić.

  2. Istnieje wiele odniesień do modułu Tkinter o nazwie "scrolledtext", który ma być znacznie lepszym mechanizmem do dodawania pasków przewijania do pól tekstowych, ale nie znalazłem żadnych przykładów, jak go zaimportować i nazwać że jestem w stanie dostać się do pracy (prawdopodobnie potrzebuję przykładu).


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) 

Odpowiedz

20

Miałeś rację, można użyć widżetu ScrolledText z modułem tkinter.scrolledtext, tak:

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

i tam idziesz:

enter image description here

9

Podczas korzystania z widżetu ScrolledText może zaoszczędzić kilka linii kodu, nie robi nic, czego nie możesz zrobić sam. Wykonanie tego samodzielnie pomoże usunąć niektóre z tajemnic.

Rzeczywiście wszystko robisz prawie poprawnie. Błąd, który popełniasz, polega na tym, że widżet tekstowy powinien wypełniać całkowicie jego zawartość, a nie tylko niewielką jej część.

Standardowym sposobem na to jest tak:

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) 

To wszystko jest do niego. Teraz, niezależnie od tego, jak duży pojemnik zostanie pobrany z powodu zmiany rozmiaru okna, itp. Pasek przewijania zawsze będzie dołączony do widżetu tekstowego. Następnie traktujesz tę całą grupę kontenerów, widgetów tekstowych i paska przewijania jako pojedynczy widget podczas dodawania go do całego GUI.

Pamiętaj, że możesz tu również używać siatki. Opakowanie jest łatwiejsze, jeśli masz tylko pionowy pasek przewijania. Jeśli masz zarówno poziome, jak i pionowe paski przewijania, siatka ma trochę więcej sensu.

Aby ukończyć iluzję, można ustawić granicę szerokości widgetu tekstowego na zero i ustawić granicę ramki zawierającej tekst na 1 z reliefem zatopionym, a pasek przewijania pojawi się jako "w" widgecie tekstowym .

Powyżej znajduje się pełna przykład pracy, która wygląda bardziej lub mniej jak Twój przykład:

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

Osobiście nie polecam robić importu globalnych, a ja nie polecam korzystania miejsce, ale chciałem aby zachować to jak najbliżej oryginału.

Powiązane problemy