当Kivy中添加了更多内容时,如何增加版面的大小?

2024-04-25 17:46:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果可以的话,我还尝试在文本出于某种原因发送之后清除输入字段messageInput.textwidget.clear\u小部件()什么也不做。你知道吗

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()

Tags: textfromimportselfaddtruedefwidget
1条回答
网友
1楼 · 发布于 2024-04-25 17:46:52

enter image description here

我已经解决了你的两个问题。您可能需要自己改进尺码。你知道吗

  1. 不能使用BoxLayout,因为它总是采用其父小部件的大小。我用它代替了网格布局。关于如何同时使用GridLayout和ScrollView,有很多描述。例如https://stackoverflow.com/a/19035264/6646710

  2. 接下来,可以通过将TextInput的text属性设置为“

这是密码。我做了各种各样的修改,如果你不能理解的话,可以在评论中问一下。你知道吗

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()

相关问题 更多 >