Создание измерительных / многострочных меток TKinter / TTK со словом Wrap

StackOverflow https://stackoverflow.com/questions/4011354

  •  25-09-2019
  •  | 
  •  

Вопрос

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

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

Я экспериментировал с ярлыком TKinter и виджетами сообщений и виджетом метки TTK без успеха. Похоже, что мне нужно жесткое кодовое значение Pixel Wraplength vscy vs. У этих элементов управления автоматически WordWrap, когда их текст достигает правого края их контейнеров. Конечно, менеджеры Geometry Tkinter могут помочь мне автоматически изменить размер моих ярлыков и обновлять свои значения обертывания?

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

Вот прототип того, как можно сделать то, что я описал выше. Он был вдохновлен советницей Брайана Окли, чтобы использовать текстовый виджет и следующий пост на StackoverFlow:В TKinter Python, как я могу сделать этикетку такую, чтобы вы могли выбрать текст с помощью мыши?

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()
Это было полезно?

Решение

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

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

Другие советы

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

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

Вот код:

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 )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top