Как подключить панель прокрутки к текстовому виджету?

Я пытаюсь прикрепить полосу прокрутки к своему текстовому полю и не могу этого сделать. Вот фрагмент кода:

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)

Этот код размещает очень маленькую полосу прокрутки рядом с моим текстовым полем (и очень маленьким, я имею в виду, что вы можете видеть стрелки вверх и вниз, но ничего между ними). Я могу прокрутить его, когда мое текстовое поле заполнится, но есть ли способ, по крайней мере, установить высоту полосы прокрутки, чтобы она оказалась такой же высоты, как и текстовое поле?

Ответ 1

В Tkinter есть три менеджера геометрии: pack, grid и place.
Упаковка и сетка обычно рекомендуются на месте.

Вы можете использовать Grid Manager параметры строки и столбца
расположить полосу прокрутки рядом с виджетом "Текст".

Установите для параметра команды виджета "Полоса прокрутки" значение "Текст yview".

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

Установите для параметра текстового виджета yscrollcommand значение метода набора полос прокрутки.

txt['yscrollcommand'] = scrollb.set

Вот рабочий пример, в котором используется ttk:

import tkinter
import tkinter.ttk as ttk

class TextScrollCombo(ttk.Frame):

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

    # ensure a consistent GUI size
        self.grid_propagate(False)
    # implement stretchability
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    # create a Text widget
        self.txt = tkinter.Text(self)
        self.txt.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)

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

main_window = tkinter.Tk()

combo = TextScrollCombo(main_window)
combo.pack(fill="both", expand=True)
combo.config(width=600, height=600)

combo.txt.config(font=("consolas", 12), undo=True, wrap='word')
combo.txt.config(borderwidth=3, relief="sunken")

style = ttk.Style()
style.theme_use('clam')

main_window.mainloop()

Часть, которая будет работать с маленькой полосой прокрутки, это sticky='nsew',
о котором вы можете прочитать → здесь.

Сейчас вам будет полезно узнать, что разные виджеты Tkinter могут использовать разные менеджеры геометрии в одной программе , если они не имеют одного и того же родителя.


Модуль tkinter.scrolledtext содержит класс ScrolledText, который является составным виджетом (текст и полоса прокрутки).

import tkinter
import tkinter.scrolledtext as scrolledtext

main_window = tkinter.Tk()

txt = scrolledtext.ScrolledText(main_window, undo=True)
txt['font'] = ('consolas', '12')
txt.pack(expand=True, fill='both')

main_window.mainloop()

На то, как это реализовано, стоит взглянуть.

Ответ 2

Если вы работаете с блоком INPUT, то удобно использовать функцию scrolledtext. Мне понадобилось 4 часа, чтобы найти его. Разве я не люблю tkinter?

Две вещи, чтобы отметить... Требуется дополнительный импорт импортировать tkinter.scrolledtext как tkscrolled и вы устанавливаете значение по умолчанию с помощью insert и читаете значение с помощью get (более страшное именование)

Этот бит кода был центральным для работы моего текстового поля на 20 символов шириной на 10 строк.

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)

Полосы прокрутки отображаются после достижения высоты, определенной в вызове. Они окрашены в серый цвет и хорошо смешаны с фоном. Он отлично работает... как только вы выясните правильные вызовы.

Я надеюсь, что это относится к вашему вопросу!

Ответ 3

Брайан Оукли говорит, что "не используйте место" - это своего рода "совет", который регулярно дают программисты, тратя впустую часы программиста среднего уровня. Место идеально подходит и полезно для приложений/программ, которые имеют фиксированный размер. Я только что часами искал, почему виджет ScrolledText не изменяет размеры должным образом с помощью pack() или grid(), и нашел обычную тангенциальную, плохо объясненную болтовню о кадре, который он поместил внутри, который находится внутри класса, который создает его внутри модуль, который создает его. Я наткнулся на это случайно после нескольких часов поисков. Этот вид напрасной неясности и глупых советов программистов с мастерами информатики, которые считают, что их запутанный способ делать что-то более правильно, чем самый быстрый и интуитивный способ сделать это, является эпидемией среди "объяснений", предлагаемых в Интернете. для тех, кто самообучается и тратит огромное количество нашего времени. Это также скучно, как ад, пытаясь пробраться сквозь эту тусклую болтовню.

Несмотря на заявления об обратном, программирование в большинстве случаев не так сложно, но самая большая сложность в программировании - это пробираться сквозь непроходимый жаргон и тратить время на советы гиков. Сами понятия, когда вы, наконец, понимаете, что говорит жаргон, чаще всего просты.