Kivy:按字母间隔更新标签文本不起作用

时间:2018-08-01 20:02:30

标签: python kivy

我极力尝试在Kivy Label中创建“打字机”效果。下面的文本“这是我的示例文本”应在每个字母之间以0.5的间隔填充标签字母。就像有人在打字机上打字一样。

但是我得到的结果很奇怪:不是得到想要的效果,而是在0.5之后添加整个字符串,仅此而已。看来我的for循环已被完全忽略。

知道我能做什么吗?

那是我的课程TestScreen(Screen):

def __init__ (self,**kwargs):
    super(TestScreen, self).__init__(**kwargs)

    my_box = FloatLayout()

    self.mylabel = Label(
            text='',
            font_size=26,
            pos_hint={'center_x': 0.5, 'center_y': 0.05})

    my_box.add_widget(self.mylabel)
    self.add_widget(my_box)

    for letter in 'That is my sample text':
        Clock.schedule_once(partial(self.setLetterByLetter, letter=letter), 1)

def setLetterByLetter(self, dt, letter):
    self.mylabel.text += letter
    return True

2 个答案:

答案 0 :(得分:1)

问题

  

获取从标签左上角开始的文本

解决方案-左上角的文本

在构造函数__init__()方法中添加以下内容。

def __init__(self, string, **kwargs):
    super(TestScreen, self).__init__(**kwargs)
    self.bind(size=self.setter('text_size'))
    self.halign = 'left'
    self.valign = 'top'

Text alignment and wrapping

  

Label具有halignvalign属性,以控制   它的文字。但是,默认情况下,文本图像(texture)仅   足够大以包含字符并位于中心   标签。 valign属性将无效,而halign将   仅当您的文本包含换行符时才起作用;单行文字   即使将halign设置为left(由   默认)。

     

为了使对齐属性生效,请设置   text_size,它指定其中的边界框的大小   文本对齐。例如,以下代码将此大小绑定到   标签的大小,因此文本将在小部件内对齐   界限。这还将自动将Label文本包装到   留在这个区域内。

Label:
    text_size: self.size
    halign: 'right'
    valign: 'middle'

输出-左上角的文本

Img01 - text in top-left corner Img02 - text in top-left corner

解决方案-文本居中

使用Clock.create_trigger()模拟打字机。

Triggered Events

  

触发事件是推迟回调的一种方式。它完全起作用   像schedule_once()和schedule_interval()一样,只是它没有   立即安排回调。而是安排回叫   使用它返回的ClockEvent。这样可以确保您可以   多次呼叫活动,但安排的时间不会超过   一旦。 Clock.schedule_once()并非如此

main.py

from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock


class TestScreen(Label):

    def __init__(self, string, **kwargs):
        super(TestScreen, self).__init__(**kwargs)
        self.font_size = 26
        self.string = string
        self.typewriter = Clock.create_trigger(self.typeit, 1)
        self.typewriter()

    def typeit(self, dt):
        self.text += self.string[0]
        self.string = self.string[1:]
        if len(self.string) > 0:
            self.typewriter()


class TestApp(App):
    title = "Kivy Typewriter"

    def build(self):
        return TestScreen("That is my Kivy Typewriter demo")


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

输出-文本居中

Img01 - text in center Img02 - text in center

答案 1 :(得分:0)

无需使用kwargs

要创建打字机效果,只需遵循以下代码。


def anything(str):

for letter in str:
    sys.stdout.write(letter)
    sys.stdout.flush()
    time.sleep(0.5)

anything("That is my sample text.")

我编写的代码在字符串中的每个字母之间给出了0.5秒的等待时间,并且只需要六行代码。