Kivy - 文本



Kivy 库中的“kivy.core.text”模块充当渲染文本的后端层。但是,只有在“kivy.uix.label.Label”控件无法提供令人满意的结果时才应使用它。

此模块有两个重要的用途:一是从核心 Label 对象派生纹理并将其应用于应用程序中的任何控件,二是将自定义字体应用于控件(如标签、按钮或文本输入(或任何具有文本属性的控件))的文本属性。

使用纹理

Label 控件(在“kivy.uix.label”模块中)在内存中加载时通常效率不高。为了克服这个问题,方法是创建一个 core.label 类的对象,并将其纹理与常规控件一起使用。

首先从“kivy.core.label”导入 Label 类(为避免混淆,将其命名为 CoreLabel)。

from kivy.core.text import Label as CoreLabel
cl=CoreLabel(text="Hi there!", font_size=50, color=(1, 0, 0, 1))

在此对象上调用 refresh() 方法以计算内容并生成纹理。

cl.refresh()

获取纹理和纹理大小。

texture = cl.texture
texture_size = list(texture.size)

现在可以将其与任何控件一起使用了。

示例

在以下代码中,我们将一个标签控件添加到垂直箱式布局中,并使用核心级别对象的纹理。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import *
from kivy.core.text import Label as CoreLabel
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.core.window import Window

Window.size = (720,400)
   class CoreLabelApp(App):
      def build(self):
         cl=CoreLabel(text="Hi there!", font_size=50, color=(1, 0, 0, 1))
         cl.refresh()
         texture = cl.texture
         main=BoxLayout(orientation='vertical')
         l=Label()
         texture_size = list(texture.size)
         l.canvas.add(Rectangle(texture=texture, size=texture_size))
         main.add_widget(l)
         return main
         
CoreLabelApp().run()

输出

它将产生以下输出 -

Kivy Text

自定义字体

所有具有文本属性的控件都使用根据 Kivy 安装的 config.ini 文件中的设置的默认字体集进行渲染。

default_font = ['Roboto', 'data/fonts/Roboto-Regular.ttf',
'data/fonts/Roboto-Italic.ttf', 'data/fonts/Roboto-Bold.ttf',
'data/fonts/Roboto-BoldItalic.ttf']

但是,您可能希望使用特定字体在任何控件上显示文本,它可能是标签、文本输入框或按钮。为此,您需要下载相关的字体文件(True Type 字体由 .ttf 文件表示)并将其放置在应用程序文件夹中。

为了使这些字体可供我们的应用程序使用,必须在应用程序中注册它们。为此,调用 LabelBase 类的 register() 方法。LabelBase 是由您的操作系统使用的特定字体渲染器使用的抽象类。

register() 是一个静态方法,具有以下参数 -

register(name, fn_regular, fn_italic=None, fn_bold=None,
fn_bolditalic=None)

其中“name”是在程序中引用字体的字体名称,“fn_regular”参数是字体的 TTF 文件。

下载 Consolas 字体和 Monotype Corsiva 字体的 TTF 文件,并将它们存储在应用程序文件夹中。

示例

在以下程序中,我们在三个文本输入框中显示相同的字符串。第一个框以默认字体渲染文本。第二个框使用 Monotype Corsiva,第三个框应用 Consolas 字体。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.core.text import LabelBase
from kivy.core.window import Window

Window.size = (720,400)
class CustomFontApp(App):
   def build(self):
      main=GridLayout(cols=1)
      LabelBase.register(name='font1', fn_regular='consolas.ttf')
      LabelBase.register(name='font2', fn_regular='MonotypeCorsivaFont.ttf')
      txt='Simple Is Better Than Complicated'
      t1=TextInput(text=txt, halign='center', font_size=48)
      t2=TextInput(
         text=txt, halign='center',
         font_name='font2', font_size=48
      )
      t3=TextInput(
         text=txt, halign='center',
         font_name='font1', font_size=48
      )
      main.add_widget(t1)
      main.add_widget(t2)
      main.add_widget(t3)
      return main
   
CustomFontApp().run()

输出

它将生成以下输出窗口 -

Kivy Text Font
广告