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

6
如何设置kivy字体大小或标签大小,以适应所有手机设备屏幕?(适合的意思是不与边界、矩形甚至屏幕重叠)
我知道Kivy中的按钮和其他一些小部件具有size_hint。但是这个size_hint无法得到所需的结果。
此外,设置font_size可以解决问题,但使用它将很难自动化。现在一个接近的解决方案是,在cm中设置并获取Window.size,并在cm中使用font_size。
提前致谢。
4个回答

8

这其实是一个有趣的问题。

通常,您会将文本、字体、字体大小和限制文本的区域(在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()

远非理想,但完成了工作。

结果:

在此输入图片描述

在此输入图片描述


谢谢,这是开箱即用的。我尝试在Python 2中使用相同的概念,但似乎不起作用,只会出现空白。我的代码在帖子中。你的代码中是on_text还是on_texture - user7986928
1
@Arief,没有任何一行代码是正确的。我刚刚检查了一下,它在Python 2中也可以工作-不需要任何更改。on_text不是Image类的成员,而是当text属性更改时自动调用的函数。请阅读此链接以获取详细信息。 - Mikhail Gerasimov

7

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

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

1
此外,使用Window.size,您可以计算窗口的对角线,将其乘以自选因子(应介于0和1之间),然后用它来自动更新标签的字体大小{{link1:(单击此处查看另一篇stackoverflow文章,了解如何自动更新标签)}}。

0

这里有另一种选项,只使用普通的按钮(也可以是标签)。我用它来缩小字体大小以适应固定大小的小部件。需要一些时间来理解,但是标签文本是使用当前的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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接