2013-05-04 109 views
0

我正在尋找一種方法,用python gtk/pango預先計算可變長度的文本字符串的寬度。 我想用它來調整文本大小自動填充給定的空間,對於可以以不同分辨率顯示的GUI以及標籤或按鈕的文本或任何應該調整到給定分辨率的GUI,以便使用最大可能的字體大小而無需制動邊界。計算pygtk 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) 

它建立一個臨時的隱形標籤設置參數,只要測得的延伸縮小它大於最大值。允許的大小。

如果還有一些其他功能可以獲得文本的「填充」,我很樂意聽到。

回答

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兩者)​​