【问题标题】:Label keeps running off edge of ScrollView screen x axis Kivy标签一直跑出 ScrollView 屏幕 x 轴 Kivy 的边缘
【发布时间】:2020-01-11 16:39:01
【问题描述】:

我正在创建一个聊天屏幕,每次按下发送按钮时都会在我的GridLayout 中添加一个Label。但是,当文本变得太长时,我的Labels 会从屏幕一侧跑出,我希望它们环绕并且文本进入新行,但这没有发生,我不知道为什么。

<ChatPage>:
    name: "chat_page"
    layout_content: layout_content

    NavigationLayout:
        id: nav_layout
        MDNavigationDrawer:
            NavigationDrawerIconButton:
                text: "Test"
                on_release: app.root.current = "login"

        FloatLayout:
            MDToolbar:
                pos_hint: {'top': 1}
                md_bg_color: 0.2, 0.6, 1, 1
                left_action_items: [['menu', lambda x: root.ids.nav_layout.toggle_nav_drawer()]]

            ScrollView:
                size_hint: 0.95, 0.6
                pos_hint: {"x": 0.025, "top" : 0.8, "bottom" : 0.5}
                do_scroll_x: False
                GridLayout:
                    id: layout_content
                    cols: 2
                    size_hint_y: None
                    spacing: 10
                    height: self.minimum_height
                    canvas:
                        Color:
                            rgba: (1, 1, 1, 1)
                        Rectangle:
                            size: self.size
                            pos: self.pos

            BoxLayout:
                TextInput:
                    id: msg
                    hint_text: "Type your message here"
                    pos_hint: {"x": 0, "top": 0.15}
                    size_hint: 0.75, 0.15
                Button:
                    text: "Send"
                    background_normal: ""
                    background_color: 0, 0.6, 0, 1
                    pos_hint: {"x": 0.75, "top": 0.15}
                    size_hint: 0.25, 0.15
                    on_release: root.btn_press()

<SmoothLabel>:
    size_hint: None, None
    size: self.texture_size
    padding: 10, 10
    multiline: True
    background_color: 0,0,0,0
    background_normal: ""
    back_color: 1,0,1,1
    border_radius: [6]
    canvas.before:
        Color:
            rgba: 0.2,0.6,1,1 #This changes the label colour
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: self.border_radius

py 文件

import kivy
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty, NumericProperty, ListProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivymd.theming import ThemeManager
import mysql.connector
from kivymd.uix.picker import MDDatePicker
from kivy.uix.scrollview import ScrollView

Window.clearcolor = (1,1,1,1)


class SmoothLabel(Label):
    pass


class ChatPage(Screen):
    layout_content = ObjectProperty(None)
    def btn_press(self):
        if self.ids.msg.text:
            lab1 = Label()
            self.layout_content.add_widget(SmoothLabel(text=self.ids.msg.text))
            self.layout_content.add_widget(lab1)
            self.ids.msg.text = ""
        else:
            pass


class WindowManager(ScreenManager):
    pass


class MyApp(App):
    theme_cls = ThemeManager()

    def build(self):
        kv = Builder.load_file("kivy.kv")
        sm = WindowManager()

        screens = [ChatPage(name="chat_page")]
        for screen in screens:
            sm.add_widget(screen)

        sm.current = "chat_page"
        return sm


if __name__ == '__main__':
    MyApp().run()

【问题讨论】:

    标签: python-3.x kivy kivy-language


    【解决方案1】:

    在您的 btn_press 方法中,更改:

    self.layout_content.add_widget(SmoothLabel(text=self.ids.msg.text))
    

    到:

    self.layout_content.add_widget(SmoothLabel(text=self.ids.msg.text, text_size=(self.layout_content.width, None)))
    

    添加text_size 允许Label 以指定的宽度换行。

    【讨论】:

    • 谢谢你,但是不管Label中有多少文本,它都会创建一个屏幕的整个宽度的Label。如何调整它,以便标签只会随着它包含的文本量而变宽。
    【解决方案2】:

    我应该坚持将您的新问题作为单独的帖子提交。但这是另一个可以解决您两个问题的答案:

    使用text_size 的概念以及使用kivy.core.text.Label 计算SmoothLabel 大小,可以创建调整大小的SmoothLabel

    SmoothLabel添加静态方法:

    class SmoothLabel(Label):
        @staticmethod
        def create_sized_label(**kwargs):
            max_width = kwargs.pop('max_width', 0)
            if max_width <= 0:
                # just create a SmoothLabel without a text_size
                return SmoothLabel(**kwargs)
    
            # calculate what the SmoothLabel size will be
            core_label = CoreLabel(padding=[10,10], **kwargs)  # use same padding as SmoothLabel
            core_label.refresh()
    
            if core_label.width > max_width:
                # width is too big, use text_size to force wrapping
                return SmoothLabel(text_size=(max_width,None), **kwargs)
            else:
                # width is OK, no need for text_size
                return SmoothLabel(**kwargs)
    

    然后在ChatPage中使用那个方法:

    class ChatPage(Screen):
        layout_content = ObjectProperty(None)
        def btn_press(self):
            if self.ids.msg.text:
                lab1 = Label()
    
                # calculate max allowable width in the GridLayout
                max_width = self.layout_content.width - self.layout_content.spacing[0] - self.layout_content.padding[0] - self.layout_content.padding[2]
    
                # specify font and font_size (so that the CoreLabel uses the same)
                self.layout_content.add_widget(SmoothLabel.create_sized_label(text=self.ids.msg.text, max_width=max_width, font_name='Roboto', font_size=15))
    
                self.layout_content.add_widget(lab1)
                self.ids.msg.text = ""
            else:
                pass
    

    【讨论】:

    • 谢谢,不幸的是,这没有奏效,长文本仍然导致Label 跑出屏幕边缘。我应该把这个作为一个单独的问题来问吗?
    • 您的 py 文件中是否包含 from kivy.core.text import Label as CoreLabel
    • 一开始我没有,但在收到无法识别 CoreLabel 的错误消息后,我认为我需要使用 Label 导入它。执行此操作后,它运行时没有任何错误,但只是没有停止 Label 和屏幕外的文本运行
    • 确保完全按照我上面评论中的说明导入它。
    • 抱歉,第一次没有正确导入。它大部分时间都有效,但尝试了大约 10 个不同大小的标签,但并非所有标签都正确包装。您在尝试多个不同尺寸的标签时遇到过这种情况吗?
    猜你喜欢
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多