关键点在于文本的宽度。如果将其设置为
None
,则宽度不受限制,如果文本比父元素宽,则可以滚动。但是,如果文本仅需父元素宽度的一小部分,则文本将居中显示在标签内(尽管多行仍将右对齐)。另一方面,如果
text_size
静态设置为有限值,则无法滚动未适合的文本,只能换行显示。笨拙的解决方法是将
text_size: 8000, self.height
(非常宽,不太可能发生)设置为文本大小,这样就可以滚动,但很丑陋(还可能意外地滚动到无内容显示的区域)。
相反,我们可以动态更改
text_width
。当
text
更改时,我们首先删除宽度约束。然后让标签更新其内容,并将
text_size
设置为刚好足以适应文本的宽度,但至少与父元素一样宽。
其他设置确保标签本身至少与其父元素一样宽(
width
)并且
ScrollView
从其右边缘开始(
scroll_x:1
)。
以下是完整示例:
from kivy.app import App
from kivy.lang import Builder
from kivy.config import Config
from kivy.clock import Clock
from kivy.properties import StringProperty, NumericProperty
kv = '''ScrollView:
scroll_x: 1
Label:
canvas.before:
Color:
rgba:1,0,0,1
Rectangle:
pos: self.parent.pos
size: self.size
id:maindisplay
text:"2"
font_size:"50sp"
text_size: None, self.height
size_hint_x: None
width: max(self.texture_size[0], self.parent.width)
halign: 'right'
valign: 'middle'
on_text: app.txt_cb(*args)
'''
class QApp(App):
txt = StringProperty("1")
num = NumericProperty(0)
def add_string(self, dt=0):
self.num += 1
self.txt += "%i" % self.num
self.root.ids.maindisplay.text = self.txt
def txt_cb(self, obj, text):
obj.text_size = (None, obj.height)
obj.texture_update()
obj.text_size = (max(obj._label.content_width, obj.parent.width), obj.height)
def build(self):
Clock.schedule_once(lambda dt:self.txt_cb(self.root.ids.maindisplay, ""), 0)
Clock.schedule_interval(self.add_string, .5)
return Builder.load_string(kv)
if __name__ == '__main__':
QApp().run()
canvas.before: Color: rgba:1,0,0,1 Rectangle: pos: self.pos size: self.size
当我设置text:"1\n123"
时,它明显垂直居中和右对齐。 - zeeMonkeeztext_size: self.width, self.height size_hint_x: 1
是你想要的? - zeeMonkeez