Уведомления

Группа в Telegram: @pythonsu

#1 Март 25, 2015 00:22:02

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

Возможно Вы просто ставите нетривиальные задачи. Ну или просто tkinter немного не для Вас. Я на stackoverflow ничего не ищу по tkinter. Можете верить, а можете и нет. Мне хватает документации с new mexico tech…

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

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

P.S.S. А какую бы Вы систему координат предложили для Text?

Отредактировано 4kpt_III (Март 25, 2015 00:22:46)

Офлайн

#2 Март 25, 2015 01:09:18

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

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 не подходят - у меня строгая привязка к контексту.

Отредактировано vanvanov (Март 25, 2015 01:16:38)

Офлайн

#3 Март 25, 2015 02:01:15

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

vanvanov
чтобы отобразить последние 5 строк,

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

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

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

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

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

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

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

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

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

Отредактировано 4kpt_III (Март 25, 2015 02:02:57)

Офлайн

#4 Март 25, 2015 03:09:44

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

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 кодерам за исправление их же косяка, а вот мне неудобно.

Офлайн

#5 Март 25, 2015 10:20:26

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

vanvanov
В соответствии с выравниванием, указанным в .config

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

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

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

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

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

P.S. Я думаю Вы не настолько глубоко закопались в Tkinter. Я рекомендую глянуть в сторону PyQt. Вы уже от Tkinter требуете не совсем того, под что он заточен. Боюсь дальше эта ситуация будет усугубляться и Вы будете еще более недовольны.

Отредактировано 4kpt_III (Март 25, 2015 10:20:35)

Офлайн

#6 Март 25, 2015 11:17:27

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

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

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

Офлайн

#7 Март 25, 2015 11:35:09

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

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

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

Офлайн

#8 Март 25, 2015 12:34:12

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

4kpt_III
А, я понял. yview действительно делает строчку первой, но только если имеется достаточно строк для заполнения экрана.

Пойду дальше разбираться со скроллингом в своем коде.

Отредактировано vanvanov (Март 25, 2015 12:34:28)

Офлайн

#9 Апрель 8, 2015 21:51:46

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

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



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



Что можете посоветовать тут сделать? Мне хотелось бы, чтобы выделяемый текст можно было прочитать.

Отредактировано vanvanov (Апрель 8, 2015 21:54:13)

Офлайн

#10 Апрель 8, 2015 22:10:05

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Пролистывание экрана в Tkinter

Контролировать размер окна исходя из размера шрифта и количества строк, которые влезают. Только так.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version