2017-08-10 108 views
0

如何更改BoxLayout小部件的大小,以便在向其添加更多内容时垂直滚动?您可以运行下面的脚本,但不断添加更多文本并单击发送以查看行为。如何在Kivy中添加更多内容时增加布局的大小?

此外,如果你可以,我也试图清除输入字段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

enter image description here

我已经解决了这两个您的烦恼。您可能想自行改善尺寸。

  1. 您不能使用BoxLayout,因为它总是需要其父部件的大小。我已经将它替换为GridLayout。有很多关于如何一起使用GridLayout和ScrollView的描述。如https://stackoverflow.com/a/19035264/6646710

  2. 下一个结算文字CA通过设置的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() 
+0

谢谢它的作品! @PalimPalim – Jeff