Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся (Желательно, чтобы редактировать с GUI было нельзя)

Модератор: Модераторы разделов

Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся

Сообщение ddc »

Собственно нужно, чтобы отображался автоматически генерируемый в процессе исполнения программы текст, который можно копировать, но нельзя изменять. Задача усложняется за счёт того, что требуется обойтись стандартной поставкой Python.

Виджет Text не подходит, так как не из переменной берёт текст.
Виджет Entry не подходит, так как однострочный.
Виджет Label не выделяется.

На всякий случай: язык - python, модуль - Tkinter.
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся

Сообщение ddc »

Да, понятно, кто на этом форуме python'ом заведует... ;)
Да я собственно уже обсмотрел подобные ресурсы. Думал, может кто знает грамотный способ, который не знаю я?..
Пока приходит на ум только пара entry (одно из которых скрывается), и валидатор (который будет пропускать только изменения из кода). Но уж очень это криво и громоздко...
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся

Сообщение Liksys »

:)
Щас я сообржу, что можно сделать)))
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся

Сообщение Liksys »

ddc писал(а):
03.05.2007 18:55
Виджет Text не подходит, так как не из переменной берёт текст.

Как это?! o_O

Код: Выделить всё

import Tkinter
str = "Hello, Tkinter!"

tk = Tkinter.Tk()
text = Tkinter.Text(tk)
text.insert(Tkinter.END, str) # переменная
tk.mainloop()

У Text по-моему есть параметр типа рид-онли. Устанавливается так: text.config(parameter=value)
У меня, кстати, в стандартную установку Tkinter не входит. Вместо него - PyQt3. Мануально доустановил PyQt4 (чего и порекомендовал бы для больших програм, ибо Tkinter - довольно слабенький).
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся

Сообщение ddc »

Код: Выделить всё

import Tkinter
str = "Hello, Tkinter!"

tk = Tkinter.Tk()
text = Tkinter.Text(tk)
text.insert(Tkinter.END, str) # переменная
tk.mainloop()
Это хорошо, только надо ещё и обнулить. Так работает, но текст редактируется. Аудитория стопроцентно ламерская, сотрут к чертям и не поймут, как возвращать.

Liksys писал(а):
05.05.2007 10:55
У Text по-моему есть параметр типа рид-онли. Устанавливается так: text.config(parameter=value)
Там не "рид-онли", а "state: enabled/disabled". В первом случае редактируется, во втором - не редактируется, но и на insert и delete не реагирует. Потому я Text и отмёл...

Liksys писал(а):
05.05.2007 10:55
У меня, кстати, в стандартную установку Tkinter не входит.
Во-первых:

ddc@ddclpc

$ tar tf /usr/portage/distfiles/Python-2.4.4.tar.bz2 | grep Tkinter Python-2.4.4/Lib/lib-tk/Tkinter.py
Во-вторых, он точно входит в бинарник для Windows, по умолчанию устанавливается. Если пользователь догадается его отключить, то wxPython сможет скачать. А если нет - пользоваться ему Tkinter'овским GUI.
Хотя дальнейшие размышления на этот счёт показывают, что бессмысленно Tk-шную морду поддерживать.
А до PyKDE у меня руки пока не дошли...
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся

Сообщение Liksys »

Это если из сырцов ставить. У меня например в Fedora-6 этот пакет есть на диске, но он не ставится (даже при полной установке), поскольку считается устаревшим.

ddc писал(а):
05.05.2007 17:00
А до PyKDE у меня руки пока не дошли...
PyKDE - не стоит затачивать на KDE. Если хочешь действительно удобного инструментария и полной переносимости, то поставь PyQt4. И если программа опенсорсная, то никто не запрещает тебе таскать за собой инсталлятор Python, Qt4, PyQt4.
Для такого использования кроме Text ничего нет. Единственное, что приходит на ум, создать класс, наследоваться от Text, например так (код весьма примерный, на Tkinter уже год не писал):

Код: Выделить всё

class TextBrowser(Text) :
   def __init__(self, parent=None) :
      Text.__init__(self, parent) # вот тут не уверен, в Qt надо вызвать конструктор класса, а как в Tk - хз
      self.config(state=disabled)

   def setText(self, text) :
      self.config(state=enabled)
      self.delete() # укажи параметры, если есть
      self.insert(END, text)
      self.config(state=disabled)
Еще раз говорю, штука весьма примерная, но, думаю, общий смысл ясен ;)

А вообще, если не секрет, расскажи суть задачи. Может, придумаем получше решение.
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Какой выбрать виджет из Tkinter (python), чтобы показывал многострочный текст из переменной и выделялся

Сообщение ddc »

Liksys писал(а):
05.05.2007 22:17
А вообще, если не секрет, расскажи суть задачи. Может, придумаем получше решение.
Не секрет совершенно. Задолбало меня считать госпошлину и процент за пользование (это при подаче иска) на калькуляторе, вот я и написал себе на Python калькулятор госпошлины. Собственно, страница проект на SF.net и сайт проекта там же.

Программа получает данные: суд, цену иска и опционально дату исполнения обязательства - и считает цену иска и опционально опять же проценты. Соответственно, на выходе одна или две текстовых строки, пригодных к копированию в текстовый редактор. На wxPython всё оказалось проще: там есть соответствующие виджеты и всё отлично работает. А вот когда я попытался внести нужные изменения в версию на Tkinter (исторически первую), там не нашёл нужного виджета. Пока это всё писал, понял, что проблему высосал из пальца и обойдусь двумя виджетами Entry, один из каторых будет включаться, если проценты считаются.

Liksys писал(а):
05.05.2007 22:17
PyKDE - не стоит затачивать на KDE. Если хочешь действительно удобного инструментария и полной переносимости, то поставь PyQt4. И если программа опенсорсная, то никто не запрещает тебе таскать за собой инсталлятор Python, Qt4, PyQt4.
Ну, PyKDE - это для специальной версии только для KDE - для всего остального есть wxPython.
Спасибо сказали: