我极力尝试在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
答案 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'
Label具有halign和valign属性,以控制 它的文字。但是,默认情况下,文本图像(texture)仅 足够大以包含字符并位于中心 标签。 valign属性将无效,而halign将 仅当您的文本包含换行符时才起作用;单行文字 即使将halign设置为left(由 默认)。
为了使对齐属性生效,请设置 text_size,它指定其中的边界框的大小 文本对齐。例如,以下代码将此大小绑定到 标签的大小,因此文本将在小部件内对齐 界限。这还将自动将Label文本包装到 留在这个区域内。
Label: text_size: self.size halign: 'right' valign: 'middle'
使用Clock.create_trigger()
模拟打字机。
触发事件是推迟回调的一种方式。它完全起作用 像schedule_once()和schedule_interval()一样,只是它没有 立即安排回调。而是安排回叫 使用它返回的ClockEvent。这样可以确保您可以 多次呼叫活动,但安排的时间不会超过 一旦。 Clock.schedule_once()并非如此
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()
答案 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秒的等待时间,并且只需要六行代码。