如何设置字体大小或标签大小以适合所有设备

时间:2017-12-19 09:10:37

标签: python python-2.7 kivy

如何设置kivy字体大小或标签大小,使其适合所有手机设备屏幕? (通过均值拟合不会与边界,矩形甚至屏幕重叠)

我知道Kivy中的按钮和其他一些小部件有size_hint。这个font_size没有给出期望的结果。

此外,设置Window.size可以解决问题,但使用它自动化将很困难。现在,关闭解决方案是在 cm 中设置并获取font_size,并在 cm 中使用#plot the data ggplot(data=transfer_data, aes(x=DATE_OF_TRANSFER, y=NUMBER_OF_TRANSFERS, colour = region)) + geom_point() + geom_smooth() + scale_colour_manual(values=c("green", "blue", "red", "orange"))

提前致谢。

4 个答案:

答案 0 :(得分:2)

这实际上是一个有趣的问题。

通常,您将文本,字体,字体大小和区域限制为将文本(kivy标签中的text_size)限制为渲染器,并从中获取某种大小的纹理。你想要的是知道标签的纹理大小以获得字体大小。我想这在理论上是可行的,但你需要在Kivy中手动完成所有计算。

我们可以做一些解决方法吗?我们可以使用一些非常大的并且缩放最终纹理来匹配给定的大小,而不是尝试计算字体大小。例如,使用Kivy的Image小部件可以轻松完成定量保持的缩放。概念验证(Python 3):

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.uix.label import Label


class MyLabel(Image):
    text = StringProperty('')

    def on_text(self, *_):
        # Just get large texture:
        l = Label(text=self.text)
        l.font_size = '1000dp'  # something that'll give texture bigger than phone's screen size
        l.texture_update()
        # Set it to image, it'll be scaled to image size automatically:
        self.texture = l.texture


class RootWidget(BoxLayout):
    pass


class TestApp(App):
    def build(self):
        return MyLabel(text='Test test test')


if __name__ == '__main__':
    TestApp().run()

远非理想,但有工作。

结果:

enter image description here

enter image description here

答案 1 :(得分:1)

要在调整窗口大小时缩放按钮或标签的字体,我使用 font_size 在 kv 文件中,将 self.width 除以某个数字:

Label:
            size_hint: 1, 0.1
            text: "Some label text"
            font_size: self.width/20

答案 2 :(得分:0)

这是另一个仅使用普通Button(也可以是Label)的选项。我正在使用它来减小字体大小以适合固定大小的小部件。花了一段时间才知道,但是标签文本使用当前的font_size绘制在纹理“对象”上,因此,设置标签文本后,texture_size将显示该文本的宽度。如果它比所讨论的小部件宽,请减小尺寸并重试。您可以做相反的操作来增加font_size来填充父对象。这是一些工作代码的片段,希望足以理解要点:

# for long names, reduce font size until it fits in its widget
m=self.defaultTextHeightMultiplier
self.keypad.ids.nameButton.font_size=self.keypad.ids.nameButton.height*m
self.keypad.ids.nameButton.texture_update()
while m>0.3 and self.keypad.ids.nameButton.texture_size[0]>self.keypad.ids.nameButton.width:
    m=m-0.05
    self.keypad.ids.nameButton.font_size=self.keypad.ids.nameButton.height*m
    self.keypad.ids.nameButton.texture_update()

或使其成为一个单独的功能:

def setTextToFit(self,widget,text):
    widget.text=text
    # for long names, reduce font size until it fits in its widget
    m=self.defaultTextHeightMultiplier
    widget.font_size=widget.height*m
    widget.texture_update()
    while m>0.3 and widget.texture_size[0]>widget.width:
        m=m-0.05
        widget.font_size=widget.height*m
        widget.texture_update()

可以通过模拟do-while循环来缩短该代码;可以这样称呼它:

self.setTextToFit(self.keypad.ids.nameButton,theText)

答案 3 :(得分:0)

此外,使用Window.size,您可以计算Window的对角线,将其乘以自选因子(应在0到1之间),然后使用它自动更新标签的字体大小(click here to see another stack overflow article on how to automatically update your label)