Kivy 简明教程
Kivy - Text
Kivy 库中的“kivy.core.text”模块作为渲染文本的后端层。但是,仅当“kivy.uix.label.Label”窗口小部件不能给出令人满意的结果时才应使用它。
此模块有两个重要的用途:一是从核心 Label 对象获取纹理并将其应用到应用程序中的任何窗口小部件,二是将自定义字体应用于窗口小部件(如标签、按钮或文本输入(或任何具有文本属性的窗口小部件)的文本属性。
Using Texture
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)
现在,所有的小部件都可以使用了。
Example
在下面的代码中,我们将标签小部件添加到垂直框布局,并使用核心级别对象的纹理。
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()
Custom Fonts
所有拥有文本属性的小部件都使用 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']
不过,你可能想在文本中使用特定字体,这个文本位于任何小部件上,它可能是一个标签、TextInput 框或按钮。要实现此目的,你需要下载相关字体文件(真字体由 .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 文件,并把它们存储在应用程序文件夹中。
Example
在下面的程序中,我们在三个文本输入框中显示同一字符串。第一个框使用默认字体呈现文本。第二个框使用 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()