Найти - Пользователи
Полная версия: Tkinter: выровнять тексты в 2 виджетах
Начало » GUI » Tkinter: выровнять тексты в 2 виджетах
1 2
vanvanov
Привет!

У меня есть GUI, построенный из 2 виджетов типа tk.Text. Оба виджета одинаковых размеров, только один упакован слева, другой - справа.

В обоих виджетах разные тексты с разным числом символов, но одинаковым числом абзацев. Мне нужно выровнять оба виджета так, чтобы абзацы с одинаковым номером были визуально выровнены по горизонтали. Нужно сделать примерно так, как в сравнивателях текстов, например, kdiff:



Позиции известны, mark установлены. Пробовал разные комбинации с yview - не получилось.
PEHDOM
vanvanov
Мне нужно выровнять оба виджета так, чтобы абзацы с одинаковым номером были визуально выровнены по горизонтали. Нужно сделать примерно так, как в сравнивателях текстов, например, kdiff:
делайте, кто вам мешает?
vanvanov
Позиции известны, mark установлены. Пробовал разные комбинации с yview - не получилось.
Сейчас вызовем телепата, он усилем мысли считает ваш код, также прочитет ваши мысли о том какие варианты с yview вы уже пробовали и выложит это все сюда и тогда может ктото чтото и ответит по существу.
А пока исходного кода нет,никто не знает как у вас там все устроено,и как оно у вас работает, отвечать вам всеравно что писать письмо “на деревню дедушке”

vanvanov
PEHDOM
делайте, кто вам мешает?
Отлично, и каким образом?
PEHDOM
о том какие варианты с yview вы уже пробовали
Их всего 2, насколько я понял из руководства, yview_scroll и yview_moveto.
PEHDOM
А пока исходного кода нет,никто не знает как у вас там все устроено,и как оно у вас работает
Ну, вы сами просили. Клонируйте репозиторий с помощью
 git clone git://github.com/sklprogs/shared.git
Скачайте пример кода на этой странице.


Получается вот это:

Мне нужно, чтобы текст, отмеченный жирным, был выровнен горизонтально. Размер шрифта придется вручную считать?
MrViktor
vanvanov
В обоих виджетах разные тексты с разным числом символов, но одинаковым числом абзацев. Мне нужно выровнять оба виджета так, чтобы абзацы с одинаковым номером были визуально выровнены по горизонтали.
Вам нужно описать алгоритм действий или что?
По описанию проблемы, я понимаю, что нужно только “описать алгоритм”.
Берем первый файл и считаем количество абзацев, для каждого абзаца в переменную записываем позицию его начала (номер строки). Так же поступаем со вторым файлом. Дальше пишем код синхронизации по позиции и номеру абзацев, разницу в строках компенсируем пустой строкой.
vanvanov
MrViktor
Согласно условию задачи, число абзацев (строк) одинаковое, т.е. надо выровнять тексты по горизонтали с метками, например, ‘10.0’ в 1-м окне и ‘10.0’ в 2-м окне. Проблема в том, что абзацы имеют разную длину.

Я, кажется, стал понимать, в чем дело. yview выводит указанную метку на 1-ю видимую строчку, и оба текста оказываются выровненными. Но если метка находится слишком близко к началу или к концу текста (как на скриншоте), то выровнять не получится, потому что текстовый виджет нельзя скроллить за пределами текста. Соответственно, у меня 2 вопроса:

1) как сделать так, чтобы yview отображал нужную метку по центру, а не в самом вверху?
2) что делать, если метка находится слишком близко к началу или концу? Вставлять пустые строки в начало и конец? Использовать tk.Canvas вместо tk.Text?
MrViktor
vanvanov
Согласно условию задачи, число абзацев (строк) одинаковое, т.е. надо выровнять тексты по горизонтали с метками, например, ‘10.0’ в 1-м окне и ‘10.0’ в 2-м окне. Проблема в том, что абзацы имеют разную длину.
Брррр…. Так я вам уже про это и написал… абзац и строка - все таки разные вещи.
Tkinter Listbox - имеет длину строки (ширину), которая устанавливается width (количество символов), то есть если у вас ширина ListBox равна 20 символов, а вы впихиваете текст длинной 100 символов, то текст в листбоксе займет 5 строк. Вот от этого и надо плясать, как я уже и писал разницу в строках компенсировать пустыми строками, сам листбокс этого не сделает.
Покрайней мере на ваших скриншотах я вижу именно эту проблему.
И про какие метки вы все говорите?
vanvanov
MrViktor
если у вас ширина ListBox равна 20 символов, а вы впихиваете текст длинной 100 символов, то текст в листбоксе займет 5 строк. Вот от этого и надо плясать, как я уже и писал разницу в строках компенсировать пустыми строками, сам листбокс этого не сделает.
У меня tk.Text, а не tk.Listbox. Строки слишком длинные, чтобы пытаться впихнуть их в Listbox.
MrViktor
И про какие метки вы все говорите?
Которые используются при yview. Например,
 mark = 'red'
postk = '10.0'
widget.mark_set(mark,postk)
widget.yview(mark)
Соответственно, yview('10.0') в 1-м tk.Text и yview('10.0') во 2-м tk.Text не гарантирует, что строчки в обоих tk.Text будут выровнены по верхней границе.
PEHDOM
пока писал, тема обновилась удалил.
vanvanov
1) как сделать так, чтобы yview отображал нужную метку по центру, а не в самом вверху?
2) что делать, если метка находится слишком близко к началу или концу? Вставлять пустые строки в начало и конец? Использовать tk.Canvas вместо tk.Text?
Вот наконецто хоть какойто конкретный вопрос, и почему мы это должны из вас клещами вытаскивать?

MrViktor
vanvanov
У меня tk.Text, а не tk.Listbox
Да, это я уже глючу (в голове своих проблем вагон), в tk.Text вроде тоже настройка на длину строки имеется
vanvanov
1) как сделать так, чтобы yview отображал нужную метку по центру, а не в самом вверху?
Высчитывать середину tk.Text и скролинг делать с учетом смещения на середину (это что на ум приходит).
Я дальше не объясню (с tk мало знаком).
Выложили бы небольшой свой рабочий проект, где можно всю проблему увидеть визуально. Так гораздо быстрее вам помогут.
vanvanov
PEHDOM
Вот наконецто хоть какойто конкретный вопрос, и почему мы это должны из вас клещами вытаскивать?
Потому что не была ясна причина, по которой текст нормально не выравнивался. А ответы на конкретные вопросы обычно находятся в поисковике.
MrViktor
Выложили бы небольшой свой рабочий проект, где можно всю проблему увидеть визуально. Так гораздо быстрее вам помогут.
Наверху ссылки есть.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB