Python 根据文本更改标签大小

Python 根据文本更改标签大小,python,python-3.x,kivy,Python,Python 3.x,Kivy,我想在应用程序运行时向标签添加文本。它被放置在一个FloatLayout中,这个FloatLayout被放置在一个滚动视图中,这样我就可以滚动文本了。我希望FloatLayout的大小默认为1,1,并在添加文本时增加其高度。我应该使用尺寸暗示还是常规坐标系就足够了?无论如何,我都不能让它工作。当我做了一点测试后,我发现标签的text\u size属性在添加新文本时不会改变,但在调整窗口大小时会改变。这可能是因为我已将kv文件中的text\u size属性设置为等于标签的大小,以获得正确的文本对齐

我想在应用程序运行时向标签添加文本。它被放置在一个FloatLayout中,这个FloatLayout被放置在一个滚动视图中,这样我就可以滚动文本了。我希望FloatLayout的大小默认为1,1,并在添加文本时增加其高度。我应该使用尺寸暗示还是常规坐标系就足够了?无论如何,我都不能让它工作。当我做了一点测试后,我发现标签的
text\u size
属性在添加新文本时不会改变,但在调整窗口大小时会改变。这可能是因为我已将kv文件中的
text\u 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()
从kivy导入需要
要求(“1.9.1”)
导入字符串
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.core.window导入窗口
从kivy.effects.scroll导入ScrollEffect
从kivy.uix.screenmanager导入屏幕,屏幕管理器,非转换
从kivy.uix.label导入标签
从kivy.uix.textinput导入textinput
从kivy.uix.button导入按钮
从kivy.uix.scrollview导入scrollview
从kivy.uix.floatlayout导入floatlayout
尼克=“”
类MyScrollView(滚动视图):
通过
类文本标签(标签):
通过
Builder.load_字符串(“”)
:
#…画布说明
:
文本大小:self.size
''')
课堂聊天(屏幕):
通过
类聊天应用程序(应用程序):
def生成(自):
def开关_视图(*args,**kwargs):
全球尼克
尼克=tx1_简介文本
lb1_main.text=“与”+尼克聊天
Screens.current='main'
Window.size=(600500)
def msg_in(*args,**kwargs):
全球尼克
msg=tx1_main.text.strip(“\n”)
如果msg不在string.whitespace中:
lb2_main.text+=“{}:{}\n”。格式(尼克,味精)
tx1_main.text=“”
fl_布局1_main.size_hint_y+=1
Screens=ScreenManager(transition=nottransition())
chat=chat(name=“main”)
tx1_main=TextInput(大小提示=(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},
大小提示=(0.97,0.65),
do_scroll_x=False)
fl\U布局1\U主=浮动布局(大小\U提示\U y=1)
lb2_main=TextLabel(大小_提示=(0.99,0.99),
pos_hint={“center_x”:0.5,“center_y”:0.5},
valign=“top”,
颜色=(0,0,0,1))
chat.add_小部件(scr_view_main)
scr\u view\u main.add\u小部件(fl\u布局1\u main)
fl_布局1_main.add_小部件(lb2_main)
屏幕。添加_小部件(聊天)
返回屏幕
如果名称=“\uuuuu main\uuuuuuuu”:
ChatApp().run()

就我个人而言,我不喜欢
FloatLayout
,但使用是找到需要键入的内容和自动键入的内容的方法。我认为
BoxLayout
FloatLayout
更实用,更适合快速键入(只需玩
size\u hint
),如果你不在真正需要这种定位的地方工作,那么就没有必要了

第一个例子是带有滚动的简单标签,基本上都在
kv
中,所以最好保存它,并在需要时复制粘贴(或者学习如何操作)。第二个是滚动标签,周围有一些小部件,就像您提供的代码一样,您只需要在代码中实现它<代码>文本大小很重要,但您忘记了一件事-
高度
。当您传递
self.size
时,您从一开始传递的是大小,而不是
纹理大小
,您需要什么。由于
size\u hint\u y
为None,因此您可以使用
texture\u 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())
来自kivy.lang导入生成器
从kivy.base导入runTouchApp
从kivy.uix.scrollview导入scrollview
Builder.load_字符串(“”)
:
标签:
尺寸提示:无
文本大小:self.width,无
文本:'l或emi psum'*1000
高度:自身纹理大小[1]
''')
类ScrollLabel(ScrollView):通过
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()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.scrollview导入scrollview
Builder.load_字符串(“”)
:
方向:“垂直”
浮动布局:
滚动视图:
标签:
id:实验室
尺寸提示:无
文本大小:self.width,无
文本:“l或emi psum”*100
高度:自身纹理大小[1]
按钮:
尺寸提示:无
身高:100
发布时:root.ids.lab.text+='lorem'*100
''')
类框(BoxLayout):通过
类(我的应用程序):
def生成(自):
返回框()
我的().run()