Рассчитать размер текстовой строки в pygtk pango для заполнения текста

Я ищу метод для предварительного расчета ширины текстовой строки переменной длины с помощью python gtk/pango. Я хочу использовать его для настройки размера текста, автоматически заполняющего заданное пространство, для графического интерфейса, который может отображаться с разными разрешениями, а текст меток или кнопок или чего-либо еще должен подстраиваться под заданное разрешение, чтобы использовать максимально возможный размер шрифта без торможения границы.

Теперь у меня есть обходной путь, но это медленный метод, и я думаю, что должно быть что-то лучше:

def ButtonSchriftAnpassen(self, AktiverButton, InBox):
    '''function to set up fint size of directory/category buttons to use  max. amount of available space'''
    if InBox == True:
        AktiverButton.show()

        GewollteBreite = AktiverButton.get_parent().get_allocation()[2]
        GewollteHoehe = AktiverButton.size_request()[1]
        MaximaleBreite = GewollteBreite
    elif AktiverButton.get_label() == "HOME" or AktiverButton.get_label() == "Hauptmenue":
        #print AktiverButton.get_label()
        GewollteBreite = AktiverButton.size_request()[0]
        GewollteHoehe = AktiverButton.size_request()[1]
        MaximaleBreite = GewollteBreite -(0.2*GewollteBreite)#* 1000

    else:
        GewollteBreite = AktiverButton.size_request()[0]
        GewollteHoehe = AktiverButton.size_request()[1]
        MaximaleBreite = GewollteBreite # -(0.4*GewollteBreite)#* 1000

    Schriftgroessenfaktor = GewollteHoehe * 1000

    TempLabel = gtk.Label(AktiverButton.get_label())
    TempPangoliste = pango.AttrList()
    XTemp = pango.AttrSize(Schriftgroessenfaktor, start_index=0, end_index=-1)
    TempPangoliste.insert(XTemp)
    TempLabel.set_attributes(TempPangoliste)
    AbmessungenTempLabel = TempLabel.get_layout().get_pixel_size()

    while AbmessungenTempLabel[0] > MaximaleBreite:
        Schriftgroessenfaktor = Schriftgroessenfaktor - 1000
        XTemp = pango.AttrSize(Schriftgroessenfaktor, start_index=0, end_index=-1)
        TempPangoliste.insert(XTemp)
        TempLabel.set_attributes(TempPangoliste)
        AbmessungenTempLabel = TempLabel.get_layout().get_pixel_size()

    x = XTemp

    Pangoliste = pango.AttrList()

    Pangoliste.insert(x)
    AktiverButton.child.set_attributes(Pangoliste)

Он создает временную невидимую метку, устанавливает параметры и сжимает ее до тех пор, пока измеренное расширение больше максимального. разрешенный размер.

Если есть какая-то другая функция для получения этого «наполнения» текста, я был бы признателен услышать.


person user2350814    schedule 04.05.2013    source источник


Ответы (1)


Вы просто визуализируете строку с помощью pango, а затем получаете размер.

Пример:

def get_pango_string_size(str, font_name=TEXT_FONT):   
    label           = gtk.Label()
    pango_layout    = label.get_layout()    
    pango_layout.set_markup(str)    
    pango_font_desc = pango.FontDescription(font_name)    
    pango_layout.set_font_description(pango_font_desc)    
    return pango_layout.get_pixel_size()

(Взято с http://python.6.x6.nabble.com/Getting-string-with-in-pixels-td1944346.html)

person kjyv    schedule 20.04.2014