Как подключить несколько текстов к одной полосе прокрутки с помощью Tkinter - PullRequest
0 голосов
/ 01 октября 2019

Я кодирую свой личный текстовый редактор. Но у меня проблема с текстом 2 виджетов и полосой прокрутки (подключите одну полосу прокрутки к двум текстам).

Какова моя идея и логика (в начале)?

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

Ноэто не сработало.

Эта система абсолютно не работает, есть какие-либо предложения или исправления, чтобы исправить эту первую идею?

Другие идеи, которые я нашел.

После первой попытки я подумал, что смогу упаковать 2 текста в 1 контейнер. Я попытался создать фрейм (упакованный в корень), который содержит 2 текста, я сделал это, потому что я должен подключить полосу прокрутки только к фрейму. Но это не сработало, более того, оно не позволило мне написать следующий фрагмент: command=frame.yview в опции полосы прокрутки, похоже, я не могу подключить фрейм к полосе прокрутки.

Итак:

Я спрошу вас, правильны ли мои рассуждения и как их решить. Если нет, что я могу сделать?

Подобный вопрос найден в Google: (но это я не понимаю)

Как прокрутитьдва параллельных текстовых виджета с одной полосой прокрутки?

Tkinter добавление номера строки в текстовый виджет

from tkinter import *


root = Tk()

root.geometry("480x540+100+100")
root.config(cursor='')

line = Text(root, bg="light grey", font="Roman 24", width=4)
line.pack(side=LEFT, fill=BOTH)

text = Text(root, bg="grey", font="Roman 24")
text.pack(side=LEFT, fill=BOTH, expand=True)

scrollbar = Scrollbar(text, orient=VERTICAL, command=(line.yview, text.yview))
text.configure(yscrollcommand=scrollbar.set)
line.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side=RIGHT, fill=Y)

for n in range(50):
    line.insert("{}.0".format(n+1), "{}\n".format(n+1))
    text.insert("{}.0".format(n+1), "Line no. {}\n".format(n+1))

if __name__ == '__main__':
    root.mainloop()

1 Ответ

2 голосов
/ 01 октября 2019

В полосе прокрутки нет ничего особенного - она ​​просто вызывает функцию, когда вы ее перемещаете. API для этой функции четко определен. Хотя обычно он должен вызывать метод yview (или xview) прокручиваемого окна, он не должен требовать этого.

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

def multiple_yview(*args):
    line.yview(*args)
    text.yview(*args)
scrollbar = Scrollbar(text, orient=VERTICAL, command=multiple_yview)

У вас будет похожая проблема при прокрутке текстового виджета при вводе новых строк или перемещении с помощью клавиш курсора. Вам необходимо настроить атрибут yscrollcommand текстового виджета для вызова функции, чтобы он одновременно обновлял полосу прокрутки, а также прокручивал другое окно (и, возможно, также добавлял дополнительные номера строк)

...