2012-12-12 12 views
9

Prawdopodobnie przeczę to, ale z jakiegoś powodu nie mogę tego zrozumieć. Próbuję dołączyć pasek przewijania do mojego pola tekstowego i nie mogłem tego zrobić. Oto segment kodu:Jak dołączyć pasek przewijania do widżetu Tekst?

self.scroller = Scrollbar(self.root) 
self.scroller.place(x=706, y=121) 
self.outputArea = Text(self.root, height=26, width=100) 
self.outputArea.place(x=0, y=120) 
self.scroller.config(command=self.outputArea.yview) 
self.outputArea.config(state=DISABLED, yscrollcommand = self.scroller.set) 

Ten kod jest umieszczenie niewielką przewijania tuż obok mojego pola tekstowego (i bardzo małe, to znaczy, że można zobaczyć w górę iw dół, ale nic pomiędzy) . Mogę przewijać, gdy moje pole tekstowe się wypełni, ale czy istnieje sposób, aby przynajmniej ustawić wysokość paska przewijania tak, aby wyglądał na taką samą wysokość jak pole tekstowe?

Odpowiedz

28

Tkinter ma trzy menedżerów geometrii: pack, grid i place.
Opakowanie i siatka są zwykle zalecane w miejscu.

Można użyć grid manager'swiersz i kolumnę opcji
aby umieścić Scrollbar obok Tekst widget.

ustawić scrollBar widgetu komenda opcję yview metoda tekstu.

scrollb = tki.Scrollbar(..., command=txt.yview) 

Ustaw yscrollcommand opcję Text widgetu do przewijania na ustawić metody.

txt['yscrollcommand'] = scrollb.set 

Oto przykład praca:

import Tkinter as tki # Tkinter -> tkinter in Python3 

class App(object): 

    def __init__(self): 
     self.root = tki.Tk() 

    # create a Frame for the Text and Scrollbar 
     txt_frm = tki.Frame(self.root, width=600, height=600) 
     txt_frm.pack(fill="both", expand=True) 
     # ensure a consistent GUI size 
     txt_frm.grid_propagate(False) 
     # implement stretchability 
     txt_frm.grid_rowconfigure(0, weight=1) 
     txt_frm.grid_columnconfigure(0, weight=1) 

    # create a Text widget 
     self.txt = tki.Text(txt_frm, borderwidth=3, relief="sunken") 
     self.txt.config(font=("consolas", 12), undo=True, wrap='word') 
     self.txt.grid(row=0, column=0, sticky="nsew", padx=2, pady=2) 

    # create a Scrollbar and associate it with txt 
     scrollb = tki.Scrollbar(txt_frm, command=self.txt.yview) 
     scrollb.grid(row=0, column=1, sticky='nsew') 
     self.txt['yscrollcommand'] = scrollb.set 

app = App() 
app.root.mainloop() 

Część, która zajmie się swoją Scrollbar jest małe jest sticky='nsew',
którym można przeczytać o → here lub here.

Coś, co będzie pomocne, aby dowiedzieć się, w tej chwili jest to, że różne Tkinter widżety mogą używać różnych menedżerów geometrii ramach tego samego programu dopóki oni nie mają tego samego rodzica.


Warto również wspomnieć, że istnieje moduł ScrolledText (przemianowany tkinter.scrolledtext w Python3). Zawiera klasę o nazwie ScrolledText, która jest widgetem złożonym (Tekst: & Pasek przewijania).

# Python 2.7 
import Tkinter as tki 
from ScrolledText import ScrolledText 

class App(object): 

    def __init__(self): 
     self.root = tki.Tk() 

    # create a Text widget with a Scrollbar attached 
     self.txt = ScrolledText(self.root, undo=True) 
     self.txt['font'] = ('consolas', '12') 
     self.txt.pack(expand=True, fill='both') 

app = App() 
app.root.mainloop() 
+0

Dzięki, bardzo mi to pomogło. Bardzo to doceniam. – jwebster

+2

Zmieniłbym "zwykle polecany ponad miejsce" na "* zawsze * zalecane ponad miejscem". miejsce jest użyteczne, ale tylko w rzadkich sytuacjach. –

+0

@honestabe Jak uzyskać linijki między różnymi sekcjami odpowiedzi? – xxmbabanexx

0

Jeśli pracujesz z pudełkiem INPUT, to poręczny sposób korzystania z funkcji scrolledtext. Zajęło mi to ponad 4 godziny. Czy ty nie kochasz tkintera?

Dwie rzeczy, aby pamiętać ... Dodatkowy import wymagane import tkinter.scrolledtext jak tkscrolled i wartość domyślną można ustawić za pomocą insert i odczytać wartość używając get (straszniejszego nazewnictwa)

ten bit kodu było kluczowe, aby moje pole wprowadzania 20 znaków o szerokości 10 wierszy działało.

import tkinter.scrolledtext as tkscrolled 
import tkinter as tk 

default_text = '1234' 
width, height = 20,10 
TKScrollTXT = tkscrolled.ScrolledText(10, width=width, height=height, wrap='word') 

# set default text if desired 
TKScrollTXT.insert(1.0, default_text) 
TKScrollTXT.pack(side=tk.LEFT) 

Paski przewijania pojawiają się po osiągnięciu wysokości zdefiniowanej w wywołaniu. Są wyszarzone i dobrze wtapiają się w tło. Działa świetnie ..... gdy już znajdziesz prawidłowe połączenia.

Mam nadzieję, że dotyczy to Twojego pytania!