【问题标题】:Change the label size depending on the text根据文本更改标签大小
【发布时间】:2016-03-07 06:12:10
【问题描述】:

我想在应用运行时向标签添加文本。它被放置在一个 FloatLayout 中,它被放置在一个 ScrollView 中,以便我可以滚动浏览文本。我希望 FloatLayout 默认大小提示为 1,1,并在添加文本时增加其高度。我应该使用尺寸提示还是常规坐标系就足够了?无论如何,我无法让它工作。当我做了一些测试时,我发现标签的text_size 属性不会在添加新文本时发生变化,但会在窗口大小调整时发生变化。这可能是因为我已将 kv 文件中的 text_size 属性设置为等于标签的大小以获得正确的文本对齐方式(左上角)。这是我的代码:

from kivy import require
require("1.9.1")

import string

from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.effects.scroll import ScrollEffect
from kivy.uix.screenmanager import Screen, ScreenManager, NoTransition
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout

nick = ''

class MyScrollView(ScrollView):
    pass

class TextLabel(Label):
    pass

Builder.load_string('''
<MyScrollView>:
    #...canvas instructions

<TextLabel>:
    text_size: self.size
''')

class Chat(Screen):
    pass        

class ChatApp(App):
    def build(self):
        def switch_view(*args, **kwargs):
            global nick
            nick = tx1_intro.text
            lb1_main.text = "Chat with " + nick
            Screens.current = 'main'
            Window.size = (600, 500)

        def msg_in(*args, **kwargs):
            global nick
            msg = tx1_main.text.strip("\n ")
            if msg not in string.whitespace:
                lb2_main.text += "{}: {}\n".format(nick, msg)
            tx1_main.text = ""
            fl_layout1_main.size_hint_y += 1

        Screens = ScreenManager(transition = NoTransition())

        chat = Chat(name = "main")

        tx1_main = TextInput(size_hint = (0.9, 0.155),
                             pos_hint = {"top":0.177,"center_x":0.465}) 

        scr_view_main = MyScrollView(pos_hint = {"top":0.87, "center_x":0.5},
                                   size_hint = (0.97, 0.65),
                                   do_scroll_x = False)

        fl_layout1_main = FloatLayout(size_hint_y = 1)

        lb2_main = TextLabel(size_hint = (0.99, 0.99),
                             pos_hint = {"center_x":0.5, "center_y":0.5},
                             valign = "top",
                             color = (0, 0, 0, 1))                  

        chat.add_widget(scr_view_main)
        scr_view_main.add_widget(fl_layout1_main)
        fl_layout1_main.add_widget(lb2_main)

        Screens.add_widget(chat)

        return Screens

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

【问题讨论】:

    标签: python python-3.x kivy


    【解决方案1】:

    就我个人而言,我不喜欢FloatLayout,但使用docs 是找出您需要输入的内容和自动输入内容的方法。我认为BoxLayoutFloatLayout 更实用,更适合快速打字(只是玩size_hint),如果你不从事真正需要这种定位的事情,那就没有必要了。

    第一个例子只是简单的滚动标签,基本上都在kv,所以最好保存它并在需要时复制粘贴它(或学习如何操作)。第二个是带有一些小部件的可滚动标签,就像您提供的代码一样,您只需将其实现到您的代码中即可。 text_size 很重要,但你忘了一件事 - height。当您传递self.size 时,您从一开始就传递大小,而不是texture_size,您需要的是什么。由于size_hint_y 为无,您可以使用texture_size 手动设置height,它会在您传递一些文本后自动更新。

    简单的可滚动标签:

    from kivy.lang import Builder
    from kivy.base import runTouchApp
    from kivy.uix.scrollview import ScrollView
    Builder.load_string('''
    <ScrollLabel>:
        Label:
            size_hint_y:None
            text_size:self.width,None
            text:'l or emi psum '*1000
            height:self.texture_size[1]
    ''')
    class ScrollLabel(ScrollView):pass
    runTouchApp(ScrollLabel())
    

    周围的东西:

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.scrollview import ScrollView
    Builder.load_string('''
    <Box>:
        orientation: 'vertical'
        FloatLayout:
            ScrollView:
                Label:
                    id: lab
                    size_hint_y: None
                    text_size: self.width, None
                    text: 'l or emi psum '*100
                    height:self.texture_size[1]
        Button:
            size_hint_y: None
            height: 100
            on_release: root.ids.lab.text+='lo rem '*100
    ''')
    class Box(BoxLayout): pass
    class My(App):
        def build(self):
            return Box()
    My().run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多