当在 Kivy 中添加更多内容时如何增加布局的大小?

How to increase the size of a layout when more content is added to it in Kivy?

如何更改 BoxLayout 小部件的大小,使其在添加越来越多的内容时垂直滚动?您可以 运行 下面的脚本,但继续添加更多文本并单击“发送”以查看行为。

此外,如果可以的话,我还尝试在发送文本后出于某种原因清除输入字段 messageInput.text widget.clear_widgets() 什么都不做。

from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.core.window import Window
import datetime as dt
from kivy.uix.scrollview import ScrollView
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout

Window.clearcolor = (252, 235, 233, 0)

class NotificationMsgs(BoxLayout):

    orientation = 'vertical'
    spacing = 10
    padding = [50, 10, 50, 10]

    def __init__(self, **kwargs):
        super(NotificationMsgs, self).__init__(**kwargs)

        selectMsgsList = ['default dummy text']
        selectCreatedList = ['2017-08-10 00:00:00']

        notifBox = BoxLayout(orientation='vertical')
        # notifBox.bind(minimum_height=notifBox.setter('height'))
        notifScrlv = ScrollView(size_hint=(1,1), do_scroll_x=False, do_scroll_y=True)
        notifScrlv.add_widget(notifBox)

        r = 0
        for _ in zip(selectMsgsList, selectCreatedList):
            myMessage = Label(text="[color=000000]" + selectMsgsList[r] + "[/color]", markup=True)
            dateCreated = Label(text="[color=000000]" + selectCreatedList[r] + "[/color]", markup=True)
            notifBox.add_widget(myMessage)
            notifBox.add_widget(dateCreated)
            r += 1

        self.add_widget(notifScrlv)

        messageInput = TextInput(hint_text='type message...', multiline=True, size_hint_y=None, height=120, padding=30)
        self.add_widget(messageInput)


        def send_notification(self):
            createdDatetimeText = dt.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")

            for _ in zip(selectMsgsList, selectCreatedList):
                myMessage = Label(text="[color=000000]" + messageInput.text + "[/color]", markup=True)
                dateCreated = Label(text="[color=000000]" + createdDatetimeText + "[/color]", markup=True)

                # messageInput.clear_widgets()
                notifBox.canvas.ask_update()
                notifScrlv.canvas.ask_update()

                notifBox.add_widget(myMessage)
                notifBox.add_widget(dateCreated)


        self.add_widget(Button(text='send', font_size=40, size_hint_y=None, height=120, on_press=send_notification, background_color=[0,0,1,1], border=[0,1,1,1]))


class NotificationDemoApp(App):
    def build(self):
        return NotificationMsgs()

    def on_pause(self):
        return True

# if __name__ == '__main__':
NotificationDemoApp().run()

我已经解决了你的两个问题。您可能想自行改进尺码。

  1. 您不能使用 BoxLayout,因为它总是采用其父窗口小部件的大小。我已将其替换为 GridLayout。有很多关于如何一起使用 GridLayout 和 ScrollView 的描述。比如

  2. 下一步清除文本可以通过将 TextInput 的文本 属性 设置为 ""

  3. 来实现

这是代码。我做了各种修改,看不懂的在评论里问。

from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.core.window import Window
import datetime as dt
from kivy.uix.scrollview import ScrollView
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout


Window.clearcolor = (252, 235, 233, 0)

class NotificationMsgs(BoxLayout):


    orientation = 'vertical'
    spacing = 10
    padding = [50, 10, 50, 10]

    def __init__(self, **kwargs):
        super(NotificationMsgs, self).__init__(**kwargs)

        selectMsgsList = ['default dummy text']
        selectCreatedList = ['2017-08-10 00:00:00']

        notifBox = GridLayout(cols=1, size_hint_y=None)
        notifBox.bind(minimum_height = notifBox.setter('height'))

        notifScrlv = ScrollView()
        notifScrlv.add_widget(notifBox)

        r = 0
        for _ in zip(selectMsgsList, selectCreatedList):
            myMessage = Label(text="[color=000000]" + selectMsgsList[r] + "[/color]", markup=True)
            dateCreated = Label(text="[color=000000]" + selectCreatedList[r] + "[/color]", markup=True)
            notifBox.add_widget(myMessage)
            notifBox.add_widget(dateCreated)
            r += 1

        self.add_widget(notifScrlv)

        messageInput = TextInput(hint_text='type message...', multiline=True, size_hint_y=None, height=120, padding=30)
        self.add_widget(messageInput)


        def send_notification(self):
            createdDatetimeText = dt.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")

            for _ in zip(selectMsgsList, selectCreatedList):
                myMessage = Label(text="[color=000000]" + messageInput.text + "[/color]", markup=True, size_hint_y=None, size=self.texture_size)
                dateCreated = Label(text="[color=000000]" + createdDatetimeText + "[/color]", markup=True)

                # messageInput.clear_widgets()
                notifBox.canvas.ask_update()
                notifScrlv.canvas.ask_update()

                notifBox.add_widget(myMessage)
                notifBox.add_widget(dateCreated)

            messageInput.text = ""

        self.add_widget(Button(text='send', font_size=40, size_hint_y=None, height=120, on_press=send_notification, background_color=[0,0,1,1], border=[0,1,1,1]))


class NotificationDemoApp(App):
    def build(self):
        return NotificationMsgs()

    def on_pause(self):
        return True

# if __name__ == '__main__':
NotificationDemoApp().run()