Создание изменяемых размеров / многострочных ярлыков Tkinter / ttk с переносом слов - PullRequest
4 голосов
/ 25 октября 2010

Можно ли создать многострочную метку с переносом слов, размер которой синхронизируется с шириной его родителя? Другими словами, поведение WordPrap в блокноте при изменении ширины окна NotePad.

Вариант использования - это диалоговое окно, в котором необходимо представить блок многострочного текста (инструкции) полностью, без обрезания текста или использования полос прокрутки. В родительском контейнере будет достаточно вертикального пространства для размещения узкой ширины.

Я безуспешно экспериментировал с виджетами Tkinter Label и Message и виджетом ttk Label. Кажется, мне нужно жестко закодировать значение длины обтекания пикселя, чтобы эти элементы управления автоматически переносили слова, когда их текст достигает правого края своих контейнеров. Конечно, менеджеры геометрии Tkinters могут помочь мне автоматически изменить размеры моих этикеток и соответственно обновить их значения длины обертки?

Должен ли я вместо этого смотреть на виджет Текст? Если да, можно ли скрыть границу текстового виджета, чтобы я мог использовать его как многострочную метку с переносом слов?

Вот прототип того, как можно сделать то, что я описал выше. Он был вдохновлен советами Брайана Окли по использованию виджета «Текст» и следующего поста в Stackoverflow: Как в python's tkinter, как сделать так, чтобы вы могли выделять текст мышью?

from Tkinter import *
master = Tk()

text = """
If tkinter is 8.5 or above you'll want the selection background to appear like it does when the widget is activated. Comment this out for older versions of Tkinter.

This is even more text.

The final line of our auto-wrapping label that supports clipboard copy.
""".strip()

frameLabel = Frame( master, padx=20, pady=20 )
frameLabel.pack()
w = Text( frameLabel, wrap='word', font='Arial 12 italic' )
w.insert( 1.0, text )
w.pack()

# - have selection background appear like it does when the widget is activated (Tkinter 8.5+)
# - have label background color match its parent background color via .cget('bg')
# - set relief='flat' to hide Text control borders
# - set state='disabled' to block changes to text (while still allowing selection/clipboard copy)
w.configure( bg=master.cget('bg'), relief='flat', state='disabled' )

mainloop()

Ответы [ 3 ]

3 голосов
/ 11 мая 2016

Использование Message виджет :

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

2 голосов
/ 04 апреля 2012

Вот код:

entry = Label(self, text=text,
    anchor=NW, justify=LEFT,
    relief=RIDGE, bd=2)
def y(event, entry=entry):
  # FIXME: make this a global method, to prevent function object creation
  # for every label.
  pad = 0
  pad += int(str(entry['bd']))
  pad += int(str(entry['padx']))
  pad *= 2
  entry.configure(wraplength = event.width - pad)
entry.bind("<Configure>", y )
1 голос
/ 25 октября 2010

Нет, в Tk нет встроенной функции для автоматического переноса слов. Тем не менее, это выполнимо путем привязки к событию <Configure> метки и корректировки длины переноса. Эта привязка будет срабатывать при каждом изменении размера виджета.

Другой вариант, как вы предлагаете, это использовать текстовый виджет. Можно полностью отключить границу, если вы того пожелаете. Это всегда был мой выбор, когда я хочу завернутый в слова учебный текст.

...