在Kivy中的ScrollView中将文本对齐到标签边缘

5

我正在尝试使标签水平滚动,并希望按照以下代码设置halign:"right"valign:middle

ScrollView:

  Label:    
    id:maindisplay
    text:"0"
    font_size:"50sp"
    text_size: None ,self.height[1] #  Set the text wrap box height
    size_hint_x:None
    width: self.texture_size[0]

#Following part is not working
    halign: 'right'
    valign: 'middle'

enter image description here


它为什么不工作?预期结果是什么? - zeeMonkeez
它没有对齐和垂直对齐...它在水平滚动...但我们想要文本在右侧,为此我们使用了halign和valign,但它们没有产生输出。 - Nisarg
请确保您的标签确实位于您预期的位置,使用以下代码: canvas.before: Color: rgba:1,0,0,1 Rectangle: pos: self.pos size: self.size当我设置 text:"1\n123"时,它明显垂直居中和右对齐。 - zeeMonkeez
也许 text_size: self.width, self.height size_hint_x: 1 是你想要的? - zeeMonkeez
请检查编辑后的问题...您将了解我正在寻找什么。 - Nisarg
1个回答

3
关键点在于文本的宽度。如果将其设置为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()

尝试一下这个...请稍等。 - Nisarg
我已经让文本从右侧开始显示了,但现在它不再滚动了。 - Nisarg
你有什么办法可以获取右侧的文本并使其可以滚动? - Nisarg
不对,还是没有滚动...我的代码如下所示: ScrollView: scroll_x: 1 Label: canvas.before: Color: rgba:1,0,0,1 Rectangle: pos: self.parent.pos size: self.size id:maindisplay text:"1899897723" font_size:"50sp" text_size: max(self._label.content_width, self.parent.width), self.height size_hint_x: None width: max(self.texture_size[0], self.parent.width) halign: 'right' valign: 'middle' - Nisarg
请回答这个问题并确保正确,因为我今天给了你50个声望值...所以请帮我解决它。 - Nisarg
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接