【问题标题】:Accessing Label's texture_size property in Kivy在 Kivy 中访问 Label 的 texture_size 属性
【发布时间】:2016-04-09 13:22:05
【问题描述】:

我想为 Kivy 的TextInput 实现换行功能。我在我的包装函数中创建了一个Label 并检查它的纹理大小以查看该行是否需要包装。但无论文本如何,texture_size 属性都会返回 [0,0]。所以我整理了一些测试代码来调查:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button

class Test(App):
    def build(self):
        def f(a):
            print(l.texture_size)
        l = Label(text="Random text")
        t = Button(on_press = f)
        print(l.texture_size)
        return t

Test().run()

texture_sizebuild 方法打印时返回[0,0],但按钮打印正确的值。在我的情况下,按钮不是一个选项,我想创建一个Label,获取它的纹理大小并几乎删除它。也许有更好的方法来确定特定字体的像素文本大小?或者,如果不是,为什么它不在build 方法中打印正确的值?

【问题讨论】:

  • 有一个用于将文本实际渲染到纹理的内部类。我会发现(可能是 kivy.core.text.something)并用它来渲染然后检查纹理大小。如果没有立即创建纹理,您可能会遇到时间问题。

标签: python python-3.x kivy


【解决方案1】:

设置text属性后,必须刷新核心标签并检查其纹理大小:

my_label = Label()
my_label.text = 'hello'
my_label._label.refresh()
print my_label._label.texture.size
>>> (33, 18)

my_label.text = 'goodbye'
my_label._label.refresh()
print my_label._label.texture.size
>>> (57, 18)

请记住,这会访问受保护的属性,因此无法保证此 API 在未来版本中保持一致。

此外,我们最近将PR to add text wrapping support for long lines 合并到TextInput。你可以试试development version of Kivy 看看它是否能满足你的需要!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-16
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多