Python Kivy boxlayout内部网格布局

Python Kivy boxlayout内部网格布局,python,kivy,Python,Kivy,我是编程新手,我正在用Kivy编写一个小应用程序。我被困了几天了。我最初想要的是GridLayout中的几个按钮,按钮文本在Python中动态添加。我想把按钮上的文字分成几个部分 例如,在按钮的最左边应该是房间号,中间应该是用户的姓名,最右边应该是时间,在按钮的底部我想要一个最多40个字符的消息,用户可以添加。由于信息是动态添加的,我发现在一个按钮上很难做到不干扰按钮上添加的其他信息的位置。此外,在按下任何按钮时,我希望能够更改按钮的背景颜色 因此,我的解决方案是通过首先创建一个带有画布的Box

我是编程新手,我正在用Kivy编写一个小应用程序。我被困了几天了。我最初想要的是GridLayout中的几个按钮,按钮文本在Python中动态添加。我想把按钮上的文字分成几个部分

例如,在按钮的最左边应该是房间号,中间应该是用户的姓名,最右边应该是时间,在按钮的底部我想要一个最多40个字符的消息,用户可以添加。由于信息是动态添加的,我发现在一个按钮上很难做到不干扰按钮上添加的其他信息的位置。此外,在按下任何按钮时,我希望能够更改按钮的背景颜色

因此,我的解决方案是通过首先创建一个带有画布的BoxLayout来分隔按钮的不同部分,然后添加4个按钮,每个按钮的文本分别位于不同的按钮上(房间、名称、时间和用户消息)。我将按钮颜色的alpha值设置为0,使4个按钮看起来像一个按钮,并将其添加到GridLayout。我还需要能够动态更新画布的颜色,但不确定这是否可行

我已经能够在.kv文件中完成其中一些操作,但不能在Python中完成,因此我的问题如下:

  • 有没有更简单的方法
  • 如何在Python中实现这一点
  • 因为我需要在按下按钮时更改BoxLayout的画布颜色,所以K如何跟踪所有BoxLayout并更改其颜色
  • 下面是我编写的.kv文件的一个示例

    ScreenManagement:
        Screen:
            ScrollView:
                orientation: 'vertical'
                GridLayout:
                    spacing:10
                    id:grid
                    row_default_height:230
    
                    cols:1
                    size_hint_y:None
    
                    BoxLayout:
                        orientation: 'vertical'
    
                        canvas:
                            Color:
                                rgb:0,1,0
                            Rectangle:
                                pos:self.pos
                                size:self.size
                        Button:
                            background_color:0,1,0
    
                        Button:
                            text:
    
                            background_color:1,1,0
                            text_size: self.size
                            #halign: 'left'
    
                    BoxLayout: #this box has 4 btn that looks like 1btn  
                        orientation: 'vertical'
                        canvas:
                            Color:
                                rgb:0,1,0
                            Rectangle:
                                pos:self.pos
                                size:self.size
                        Button:
                            background_color:(0,1,0,.1)
                        Button:
                            background_color:(0,1,0,.1)
    
                        Button:
                            background_color:(0,1,0,.1)
    
                        Label:
                            background_color:(0,1,0,1)
    
                    BoxLayout:
                        canvas:
                            Color:
                                rgb:1,1,1,1
                            Rectangle:
                                pos:self.pos
                                size:self.size
                        Button:  
                            background_color:(0,1,0,1)
    
                        Button:
                            background_color:(1,0,0,1)
    
    下面是Python代码,它没有实现我想要的功能

    class ScreenManagement(ScreenManager):
        def box(self):
            layout=self.ids.grid #gridlayout in .kv file
            layout.bind(minimum_height=layout.setter('height')) 
            for i in range(10):
                btn1=Button(background_color=(0,1,0,1), text=str(i))           
                lbl=Button(background_color=(0,1,0,1),text='label')         
                btn=Button(background_color=(0,1,0,1),text='label')         
    
    
                b=BoxLayout(height=10,text='chien',background_color=(1,0,01),orientation='vertical',size_hint_y=None)         
                with b.canvas.before:
                    b.color=Color(btn1.background_color)
                    b.rect=Rectangle(pos=bpos, size=self.ids.grid.size,orientation='horizontal')
                b.add_widget(btn1)
                b.add_widget(lbl)
                b.add_widget(btn)
                self.ids.grid.add_widget(b) #grid is a gridlayout in .kv file
    
    Class testApp(App):
        def build(self):
            pass
    
    if __name__ == '__main__':
        testApp().run()