Элемент пользовательского интерфейса с однострочным вводом текста, который переносит текст в Tkinter?

Мой пользовательский интерфейс должен принимать одну строку текста. Однако, если длина текста превышает ширину элемента пользовательского интерфейса, текст должен переноситься на следующую строку.

Класс Tkinter Entry дает то, что я ищу, в отношении принятия одной строки текста. Однако, если текст превышает ширину элемента, текст не переносится. Вместо этого он прокручивается влево. Это не позволяет пользователю увидеть, какими были первые несколько символов.

Класс Tkinter Text поддерживает перенос слов, но также позволяет пользователю вводить перевод строки. Мой текст нужно вводить одной строкой.

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

Какие у меня варианты?


person Rich Apodaca    schedule 13.09.2014    source источник


Ответы (1)


Такого виджета нет, но можно сделать так:

import tkinter as tk

class ResizableText:
    def __init__(self, text_max_width=20):
        self.text_width = text_max_width
        self.root = tk.Tk()

        self.text = tk.Text(self.root, width=self.text_width, height=1)
        self.text.pack(expand=True)

        self.text.bind("<Key>", self.check_key)
        self.text.bind("<KeyRelease>", self.update_width)

        self.root.mainloop()

    def check_key(self, event):
        # Ignore the 'Return' key
        if event.keysym == "Return":
            return "break"

    def update_width(self, event):
        # Get text content; ignore the last character (always a newline)
        text = self.text.get(1.0, tk.END)[:-1]
        # Calculate needed number of lines (=height)
        lines = (len(text)-1) // self.text_width + 1
        # Apply changes on the widget
        self.text.configure(height=lines)
person TidB    schedule 13.09.2014
comment
Думаю, эта основная идея сработает. Это довольно гибко. Например, можно сделать перенос по границам слова, ограничить длину текста или выполнить другие сложные проверки. Спасибо! - person Rich Apodaca; 13.09.2014