Форум сайта python.su
Возможно Вы просто ставите нетривиальные задачи. Ну или просто 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)
Офлайн
4kpt_IIIЯ так понимаю, see - это некий аналог tail. Вот только tail имеет дополнительные ключи, можно сделать tail -n 5, чтобы отобразить последние 5 строк, а можно tail -n 1, чтобы отобразить только последнюю строку. Соответственно, делай как хочешь. А see - это какой-то непонятный монолит, который принимает только индекс, к тому же, еще и некорректно (у меня) работает на очень длинных строках. Почему реализован see, но не реализован метод, который бы позволял определить, находится ли индекс в границах окна? Наконец, почему при yview('80.0') первой отображается строчка ‘77.0’? Какой нужно передать параметр, чтобы первой шла строчка ‘80.0’?
У меня последняя строка в списке. Я делаю ей see. Куда она должна отобразиться?
Пустые строки которых нет?В процессе костыляния, выяснилось, что если получить размеры окна и вычислить координаты правого нижнего угла в пикселях, а потом по пикселям определить индекс, то tkinter корректно вернет индекс последнего символа в тексте, даже если текст занимает только пол-экрана. Т.е. пустые строки для него не проблема (как и определение конечного элемента). Правда, если пол-строчки обрезано границей и фактически эта строчка не видна, то tkinter считает, что она видна, т.е. ее индекс лежит в пределах пиксельных координат виджета, а на деле человек прочитать не сможет.
Ставил интересный эксперимент. Опрашивал клиентов, что могу поправить интерфейс и сделать его “няшным” за очень низкую цену. Ну при цене решения в 300$ где-то 20$. Как Вы думаете, какой был процент согласившихся.Я вас не понял. Вы имеете в виду, что полная стоимость разработки интерфейса вылилась в $300, а легкий ремонт - в $20? И никто не согласился даже на $20?
А какую бы Вы систему координат предложили для Text?Разумеется, список символов. И твори, что хочешь и как хочешь. А в случае с индексами по типу ‘1.25’-'1.27' мне нужно сначала получить номера начального и конечно символов, проанализировать полученный текст (например, найти соседние слова или совпадения в тексте), а потом еще обратно сконвертировать номера символов в индексы Tkinter. Просто .get или .search не подходят - у меня строгая привязка к контексту.
Отредактировано vanvanov (Март 25, 2015 01:16:38)
Офлайн
vanvanov
чтобы отобразить последние 5 строк,
vanvanov
Разумеется, список символов
vanvanov
Наконец, почему при yview('80.0') первой отображается строчка ‘77.0’? Какой нужно передать параметр, чтобы первой шла строчка ‘80.0’?
vanvanov
Т.е. пустые строки для него не проблема (как и определение конечного элемента).
vanvanov
Я вас не понял. Вы имеете в виду, что полная стоимость разработки интерфейса вылилась в $300, а легкий ремонт - в $20? И никто не согласился даже на $20?
Отредактировано 4kpt_III (Март 25, 2015 02:02:57)
Офлайн
4kpt_IIIВ соответствии с выравниванием, указанным в .config. Додумывать что-то за программиста, IMO, не есть хорошо.
И куда он их поместит? Вверх окна? Или по-середине окна? Или внизу ока, чтобы было видно.
4kpt_IIIОднако, логично, если текст будет состоять из одних символов, а для посторонних объектов создавать отдельный фрейм.
В text могут храниться не только символы.
Далее. Есть такое понятие как tag. Как быть с ним. Указывать группу символов?Сложные проекты вроде BeautifulSoup создают свой собственный объект, который уже включает всю проанализированную информацию. Однако, с учетом того, что средствами Tkinter можно провести лишь минимальный анализ входных данных, то можно указывать и диапазон номеров символов, почему бы и нет? А если он претендует на анализ текста, то пусть создает свой soup и предлагает к нему парсер.
А если они повторяются по-тексту? Будет несколько 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()
Я говорил про Listbox. Как его отображать? Достраивать строки?Выравнивать текст согласно .config. Если текст не помещается - обрезать с соответствующего края.
Если это рабочий продукт для анализа, учета, получения данных или еще чего-нибудь подобного, то никто на внешний вид не даст и копейки.Да оно и понятно. Только я для себя пишу, чтобы было удобно пользоваться. Вот есть у нас на работе одна корпоративная программа - там скроллбар сделан с таким шагом, что одно смещение колесика мыши сдвигает пол-экрана, а создаваемые окна получаются произвольного размера, в том числе, слишком маленькие. Понятно, что кодерам все равно, может, даже и не все юзеры такое заметят и тем более отдадут $20 кодерам за исправление их же косяка, а вот мне неудобно.
Офлайн
vanvanov
В соответствии с выравниванием, указанным в .config
vanvanov
А если он претендует на анализ текста, то пусть создает свой soup и предлагает к нему парсер.
vanvanov
Сложные проекты вроде BeautifulSoup создают свой собственный объект
Отредактировано 4kpt_III (Март 25, 2015 10:20:35)
Офлайн
4kpt_IIIИмелся в виду метод .config, синоним .configure. Например, чтобы можно было сделать что-нибудь по типу: txt.config(align='bottom') или .tag_config('tag',align='bottom'). Сейчас такой возможности почему-то нет.
Для GUI дополнительный config. Простите, я пас.
Он не претендует на анализ. С чего Вы это взяли?Есть .search, linestart, lineend и прочие вещи.
Офлайн
vanvanov
Не троллинга ради, действительно будет полезно узнать, как сделать определенную строку первой в видимом пространстве окна.
Офлайн
4kpt_III
А, я понял. yview действительно делает строчку первой, но только если имеется достаточно строк для заполнения экрана.
Пойду дальше разбираться со скроллингом в своем коде.
Отредактировано vanvanov (Март 25, 2015 12:34:28)
Офлайн
4kpt_III
Вроде бы получилось, как я хотел, но есть одна проблема: системные панели могут перекрывать окно Tkinter.
Так выглядит проблемный участок на полный экран без панелей:
А вот так - с панелью tint2:
Что можете посоветовать тут сделать? Мне хотелось бы, чтобы выделяемый текст можно было прочитать.
Отредактировано vanvanov (Апрель 8, 2015 21:54:13)
Офлайн
Контролировать размер окна исходя из размера шрифта и количества строк, которые влезают. Только так.
Офлайн