Найти - Пользователи
Полная версия: Пролистывание экрана в Tkinter
Начало » GUI » Пролистывание экрана в Tkinter
1 2
4kpt_III
Возможно Вы просто ставите нетривиальные задачи. Ну или просто tkinter немного не для Вас. Я на stackoverflow ничего не ищу по tkinter. Можете верить, а можете и нет. Мне хватает документации с new mexico tech…

P.S. По моему опыту see работает всегда нормально. Просто иногда бывают неоднозначные ситуации. Приведу пример. У меня последняя строка в списке. Я делаю ей see. Куда она должна отобразиться? Первой? Тогда что будет внизу? Пустые строки которых нет? Плюс есть еще проблема с разными моделями отображения одних и тех же объектов не только в разных системах но и в разных версиях tk, tcl.

Ну и насчет убогости. Ставил интересный эксперимент. Опрашивал клиентов, что могу поправить интерфейс и сделать его “няшным” за очень низкую цену. Ну при цене решения в 300$ где-то 20$. Как Вы думаете, какой был процент согласившихся. Tkinter это сугубо рабочий интерфейс для сугубо рабочих программ. Просто с этим нужно или смириться или переходить на PyQt. У меня просто нет других задач, поэтому мне хватает за глаза.

P.S.S. А какую бы Вы систему координат предложили для Text?
vanvanov
4kpt_III
У меня последняя строка в списке. Я делаю ей see. Куда она должна отобразиться?
Я так понимаю, see - это некий аналог tail. Вот только tail имеет дополнительные ключи, можно сделать tail -n 5, чтобы отобразить последние 5 строк, а можно tail -n 1, чтобы отобразить только последнюю строку. Соответственно, делай как хочешь. А see - это какой-то непонятный монолит, который принимает только индекс, к тому же, еще и некорректно (у меня) работает на очень длинных строках. Почему реализован see, но не реализован метод, который бы позволял определить, находится ли индекс в границах окна? Наконец, почему при yview('80.0') первой отображается строчка ‘77.0’? Какой нужно передать параметр, чтобы первой шла строчка ‘80.0’?
Пустые строки которых нет?
В процессе костыляния, выяснилось, что если получить размеры окна и вычислить координаты правого нижнего угла в пикселях, а потом по пикселям определить индекс, то tkinter корректно вернет индекс последнего символа в тексте, даже если текст занимает только пол-экрана. Т.е. пустые строки для него не проблема (как и определение конечного элемента). Правда, если пол-строчки обрезано границей и фактически эта строчка не видна, то tkinter считает, что она видна, т.е. ее индекс лежит в пределах пиксельных координат виджета, а на деле человек прочитать не сможет.
Ставил интересный эксперимент. Опрашивал клиентов, что могу поправить интерфейс и сделать его “няшным” за очень низкую цену. Ну при цене решения в 300$ где-то 20$. Как Вы думаете, какой был процент согласившихся.
Я вас не понял. Вы имеете в виду, что полная стоимость разработки интерфейса вылилась в $300, а легкий ремонт - в $20? И никто не согласился даже на $20?
А какую бы Вы систему координат предложили для Text?
Разумеется, список символов. И твори, что хочешь и как хочешь. А в случае с индексами по типу ‘1.25’-'1.27' мне нужно сначала получить номера начального и конечно символов, проанализировать полученный текст (например, найти соседние слова или совпадения в тексте), а потом еще обратно сконвертировать номера символов в индексы Tkinter. Просто .get или .search не подходят - у меня строгая привязка к контексту.
4kpt_III
vanvanov
чтобы отобразить последние 5 строк,

И куда он их поместит? Вверх окна? Или по-середине окна? Или внизу ока, чтобы было видно. Ну это простой пример. А если посередине где-то? Почему он должен отображать их вверху. Когда я писал интерфейс для связанных listbox, которые использую постоянно, то я делал специально так, чтобы строка была на Х строк ниже активной. Получается эффект скользящего окна. Для моих задач это было удобно, так как было видно строки выше. Про подходы и механизмы можно спорить бесконечно. Я, честно говоря, не сталкивался с задачей, когда see отображается некорректно. Хотя все может быть.

vanvanov
Разумеется, список символов

В text могут храниться не только символы. Далее. Есть такое понятие как tag. Как быть с ним. Указывать группу символов? А если они повторяются по-тексту? Будет несколько tag создаваться. А Вам это может не быть нужно. Тогда задавать сколько tag создать? А если изменили что-то внутри…. Короче. Оверхед Ваше предложение. Причем лихой. Мне сложно представить среду, где работа со сложным виджетом типа текстового окна происходила без индексов, а на чистом тексте. Ну и Вы можете написать свой класс, который бы работал поверх Text и это реализовывал.

vanvanov
Наконец, почему при yview('80.0') первой отображается строчка ‘77.0’? Какой нужно передать параметр, чтобы первой шла строчка ‘80.0’?

Сколько всего строк?

vanvanov
Т.е. пустые строки для него не проблема (как и определение конечного элемента).

Вы меня не поняли. Я говорил про Listbox. Как его отображать? Достраивать строки?

vanvanov
Я вас не понял. Вы имеете в виду, что полная стоимость разработки интерфейса вылилась в $300, а легкий ремонт - в $20? И никто не согласился даже на $20?

Не ремонт, а облагораживание. Да. Никто не согласился. Никому оно, как оказалось, не надо. Если это рабочий продукт для анализа, учета, получения данных или еще чего-нибудь подобного, то никто на внешний вид не даст и копейки. Возможно это мой опыт, но он у меня есть.
vanvanov
4kpt_III
И куда он их поместит? Вверх окна? Или по-середине окна? Или внизу ока, чтобы было видно.
В соответствии с выравниванием, указанным в .config. Додумывать что-то за программиста, IMO, не есть хорошо.
4kpt_III
В text могут храниться не только символы.
Однако, логично, если текст будет состоять из одних символов, а для посторонних объектов создавать отдельный фрейм.
Далее. Есть такое понятие как tag. Как быть с ним. Указывать группу символов?
Сложные проекты вроде BeautifulSoup создают свой собственный объект, который уже включает всю проанализированную информацию. Однако, с учетом того, что средствами Tkinter можно провести лишь минимальный анализ входных данных, то можно указывать и диапазон номеров символов, почему бы и нет? А если он претендует на анализ текста, то пусть создает свой soup и предлагает к нему парсер.
Так в чем польза той системы координат, которая принята в Tkinter, по сравнению просто с номерами символов?
А если они повторяются по-тексту? Будет несколько tag создаваться.
Почему? Сколько тэгов добавлять остается на усмотрение программиста. Если нужно, можно выделить все. Если нужны только некоторые - пройти каждую группу и решить для каждой индивидуально.
Сколько всего строк?
Код вот такой.
#!/usr/bin/python3
import tkinter as tk
text=[]
for i in range(100):
	text.append(str(i))
	
text='\n'.join(text)
root=tk.Tk()
txt=tk.Text(root)
txt.pack()
txt.insert('1.0',text)
txt.yview('80.0')
root.mainloop()
Буду признателен, если поможете мне сдвинуть экран так, чтобы первой строкой шла именно ‘80.0’.
Я говорил про Listbox. Как его отображать? Достраивать строки?
Выравнивать текст согласно .config. Если текст не помещается - обрезать с соответствующего края.
Если это рабочий продукт для анализа, учета, получения данных или еще чего-нибудь подобного, то никто на внешний вид не даст и копейки.
Да оно и понятно. Только я для себя пишу, чтобы было удобно пользоваться. Вот есть у нас на работе одна корпоративная программа - там скроллбар сделан с таким шагом, что одно смещение колесика мыши сдвигает пол-экрана, а создаваемые окна получаются произвольного размера, в том числе, слишком маленькие. Понятно, что кодерам все равно, может, даже и не все юзеры такое заметят и тем более отдадут $20 кодерам за исправление их же косяка, а вот мне неудобно.
4kpt_III
vanvanov
В соответствии с выравниванием, указанным в .config

Для GUI дополнительный config. Простите, я пас.

vanvanov
А если он претендует на анализ текста, то пусть создает свой soup и предлагает к нему парсер.

Он не претендует на анализ. С чего Вы это взяли? tag для удобства управления фрагментами текста.

vanvanov
Сложные проекты вроде BeautifulSoup создают свой собственный объект

Он никакого отношения к GUI вообще не имеет. Это как реку сравнить с автомобилем. Естественно парсеры на ООП должны работать с объектами и разбирать объект анализа на запчасти. Но это же не парсер. В GUI ООП нужно совсем для других задач.

P.S. Я думаю Вы не настолько глубоко закопались в Tkinter. Я рекомендую глянуть в сторону PyQt. Вы уже от Tkinter требуете не совсем того, под что он заточен. Боюсь дальше эта ситуация будет усугубляться и Вы будете еще более недовольны.
vanvanov
4kpt_III
Для GUI дополнительный config. Простите, я пас.
Имелся в виду метод .config, синоним .configure. Например, чтобы можно было сделать что-нибудь по типу: txt.config(align='bottom') или .tag_config('tag',align='bottom'). Сейчас такой возможности почему-то нет.
Он не претендует на анализ. С чего Вы это взяли?
Есть .search, linestart, lineend и прочие вещи.

P.S. Не троллинга ради, действительно будет полезно узнать, как сделать определенную строку первой в видимом пространстве окна.
4kpt_III
vanvanov
Не троллинга ради, действительно будет полезно узнать, как сделать определенную строку первой в видимом пространстве окна.

Никак. В Вашем примере всего 99 строк. Высота виджета 23 символа. Итого получается 103 символа при наличных 99. А так вообще, если я не ошибаюсь нужно вводить на 1 строку больше. Т.е. написать функцию, которая бы заместила text.view. Она бы принимала Ваше значение и добавляла или отнимала по одной позиции в зависимости от предыдущего значения.
vanvanov
4kpt_III
А, я понял. yview действительно делает строчку первой, но только если имеется достаточно строк для заполнения экрана.

Пойду дальше разбираться со скроллингом в своем коде.
vanvanov
4kpt_III
Вроде бы получилось, как я хотел, но есть одна проблема: системные панели могут перекрывать окно Tkinter.
Так выглядит проблемный участок на полный экран без панелей:



А вот так - с панелью tint2:



Что можете посоветовать тут сделать? Мне хотелось бы, чтобы выделяемый текст можно было прочитать.
4kpt_III
Контролировать размер окна исходя из размера шрифта и количества строк, которые влезают. Только так.
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