Отобразить три точки в конце текста ярлыка Tkinter - PullRequest
0 голосов
/ 03 июля 2018

Есть ли способ показать три точки, например, многоточие, в свойстве CSS text-overflow?

Это образец этикетки:

Label(root, text = "This is some very long text!").pack()

enter image description here

И еще один со свойством width:

Label(root, text = "This is some very long text!", width = 15).pack()

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Нет, в tkinter нет ничего встроенного для этого. Вы можете получить тот же эффект, связавшись с событием <Configure>, которое срабатывает всякий раз, когда виджет меняет размер (например, когда он добавляется в окно или когда пользователь изменяет размер окна).

В связанной функции вы получаете шрифт и текст, используйте атрибут measure шрифта и начинаете обрезать символы до тех пор, пока метка не уместится.

Пример

import Tkinter as tk           # py2
import tkFont                  # py2
#import tkinter as tk           # py3
#import tkinter.font as tkFont  # py3

root = tk.Tk()

def fitLabel(event):
    label = event.widget
    if not hasattr(label, "original_text"):
        # preserve the original text so we can restore
        # it if the widget grows.
        label.original_text = label.cget("text")

    font = tkFont.nametofont(label.cget("font"))
    text = label.original_text
    max_width = event.width
    actual_width = font.measure(text)
    if actual_width <= max_width:
        # the original text fits; no need to add ellipsis
        label.configure(text=text)
    else:
        # the original text won't fit. Keep shrinking
        # until it does
        while actual_width > max_width and len(text) > 1:
            text = text[:-1]
            actual_width = font.measure(text + "...")
        label.configure(text=text+"...")

label = tk.Label(root, text="This is some very long text!", width=15)
label.pack(fill="both", expand=True, padx=2, pady=2)
label.bind("<Configure>", fitLabel)

tk.mainloop()
0 голосов
/ 03 июля 2018

Нет встроенного способа, но вы можете легко сделать свой собственный:

import tkinter as tk

class AyoubLabel(tk.Label):
    '''A type of Label that adds an ellipsis to overlong text'''
    def __init__(self, master=None, text=None, width=None, **kwargs):
        if text and width and len(text) > width:
            text = text[:width-3] + '...'
        tk.Label.__init__(self, master, text=text, width=width, **kwargs)

Теперь просто используйте AyoubLabel вместо Label.

Это не влияет на обновление Ярлыка после его создания или использования текстовой переменной, но вы можете добавить эти способности, если они вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...