2014-07-21 15 views
0

我有一個文本標籤,需要它的font_size以適合某個矩形。我想我應該在像素像這樣(公式)得到大小:我如何在Kivy中使用標籤中的文字?

#與設備無關的像素

PX = DP *密度

#規模無關的像素

PX = SP *密度* fontscale

#點數

PX = PT * DPI/72

但問題是,我不能讓dpi, density, fontscale等,它說:

TypeError: 'float' object is not callable 

而且似乎還有可以容納文本沒有內置的功能。

+0

展完整的錯誤信息。有問題的行數 - 在代碼中標記此行。 – furas

+1

錯誤意味着你使用了一些浮點型變量'somename'作爲函數'somename()' – furas

+0

@furas我不好,我必須在沒有'()'的情況下使用它,儘管文檔中有其他說明。但無論如何,這是適合文本的好方法嗎? – Necronomicron

回答

1

我想,我找到了解決方案。

class BlockLabel(Label): 
    scale_factor = .9 
    factor = dimension = None 

    def on_texture_size(self, *args): 
     if not self.factor: 
      self.factor = [self.font_size/self.texture_size[0], self.font_size/self.texture_size[1]] 
     if not self.dimension: 
      self.dimension = 1 if self.texture_size[0] * self.size[1] < self.texture_size[1] * self.size[0] else 0 
     self.font_size = self.size[self.dimension] * self.scale_factor * self.factor[self.dimension] 

我測試過它只是廣場上(我指的是方碑文)現在,但它應該在矩形工作了。此外,如果有只有廣場,self.size可以這樣刪除:

self.dimension = 1 if self.texture_size[0] < self.texture_size[1] else 0 

而且我只有一個行文本測試此代碼,我不知道這是否適用於多行文本正確,但它應該。

1

我建立在@Necronomicron答案,以便此代碼在矩形上工作。問題(至少對我來說)是font_size的計算沒有考慮到標籤的寬度,所以如果它太小,字母就不會在裏面。

我把它改爲:

def on_texture_size(self, *args): 
    try: 
     if not self.factor: 
      self.factor = [self.font_size/self.texture_size[0], self.font_size/self.texture_size[1]] 

     self.font_size0 = self.size[0] * self.scale_factor * self.factor[0] 
     self.font_size1 = self.size[1] * self.scale_factor * self.factor[1] 

     if self.font_size0 < self.font_size1: 
      self.font_size = self.font_size0 
     else: 
      self.font_size = self.font_size1 
    except ZeroDivisionError: 
     pass 

這樣選擇的字體大小總是最小,確保了文本適合垂直和水平。我也沒有這個標籤(或按鈕在我的情況)後創作:

button1.bind(size=lambda x, y: button1.on_texture_size()) 

,使文本FONT_SIZE每一次更新按鈕的大小變化(當屏幕尺寸的變化,例如)

相關問題