如何在kivy的gridlayout中使小部件跨越多个列/行

Posted

技术标签:

【中文标题】如何在kivy的gridlayout中使小部件跨越多个列/行【英文标题】:How to make a widget span multiple columns/rows in gridlayout in kivy 【发布时间】:2014-03-09 23:25:06 【问题描述】:

我想在 kivy 中创建一个带有网格中小部件的应用程序,并且我希望能够将一些小部件设置为更大 - 以占据网格中的多个单元格。

GridLayout 似乎是最合适的,但它似乎不支持将小部件放置在多个单元格中。

更具体地说,当将 columnspanrowspan 设置为大于 1 时,我希望行为类似于 Tkinter 的网格几何管理器。

像这样:

(widget)(widget)(widget)
( bigger widget )(widget)
...

我希望能够使用现有的 kivy 布局来执行此操作,而不必编写自己的布局类来处理此问题,但如果没有其他选择,这也可以。

【问题讨论】:

【参考方案1】:

这里的另一个选项是使用 1 列的 GridLayout,并使用方向 =“horizo​​ntal”的 BoxLayout 填充每一行。然后,您可以根据需要设置每个 BoxLayout(行)的格式。

有关 BoxLayout 的更多信息:http://kivy.org/docs/api-kivy.uix.boxlayout.html

【讨论】:

【参考方案2】:

我不认为 GridLayout 真的很合适,它只是不是为这种用途而设计的。

如果我个人必须这样做,我可能会制作自己的 Layout 类,它不需要非常复杂的 do_layout 方法。

一个可能的起点是我不久前创建的SparseGridLayout。您可以非常轻松地向其中添加列和行跨度属性...实际上,既然您已经给了我这个想法,我可能会自己添加它们!

如果您有一个充满小部件的大网格,这可能并不理想,在这种情况下,类似于 gridlayout 的东西可能会更好,或者如果跨越小部件采用特定模式,则可能是多个布局的组合。

【讨论】:

如何使小部件的列跨度大于库中的一列? bigger widget 在问题中。【参考方案3】:

假设您有一个GridLayout 和两个columns,并且您想要跨越第一个row。您可以添加两个FloatLayout,其中第一个FloatLayout 将包含您想要@987654326 的小部件@ 而第二个 Layout 将有 rowheight 值为零。这将归档一个跨度效果

这是一个.kv跨度效应的例子

GridLayout:
     cols:2

     FloatLayout:   # The first FloatLayout in the first column in the gridLayout
        size_hint:None,None
        size: 0,50

        BoxLayout:
           size_hint: None,None
           size: root.width-40,50
           pos_hint: 'x':.5,'center_y':.5

           BoxLayout:
              padding:0,0,5,0

              Label:
                 id:lbl_unknown
                 text:'Accession number :'

              TextInput:
                 text:''

     FloatLayout:  # The second FloatLayout in the second column of the gridLayout
         size_hint:None,None
         size:0,0

     Label:
        text:'Label 1:'
     TextInput:

     Label:
        text:'Label 2:'
     TextInput:

【讨论】:

【参考方案4】:

一个简单的解决方法是将 BoxLayout 对象打包到您想要的任何类型的父布局中,使用您更好的判断来决定每个后续 BoxLayout 的方向

(决定在我自己的几乎所有项目中使用盒子布局而不是任何网格布局)

这是我的课:

class AuthPage(BoxLayout):
    def __init__(self, **kwargs):
        super(AuthPage, self).__init__(**kwargs)

        self.orientation = 'vertical'

        self.add_widget(Label(text='Authenticate'))

        unameRow = BoxLayout(orientation='horizontal')
        unameRow.add_widget(Label(text='User Name'))
        unameRow.username = TextInput(multiline=False)
        unameRow.add_widget(unameRow.username)
        self.add_widget(unameRow)

        pwordRow = BoxLayout(orientation='horizontal')
        pwordRow.add_widget(Label(text='password'))
        pwordRow.password = TextInput(password=True, multiline=False)
        pwordRow.add_widget(pwordRow.password)
        self.add_widget(pwordRow)

        self.add_widget(Button(text='authenticate'))

【讨论】:

以上是关于如何在kivy的gridlayout中使小部件跨越多个列/行的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何在 kivy 中使标签加粗

Kivy:GridLayout 中的按钮有间隙

Kivy:制作表格小部件

KIVY python:在python代码中使按钮可点击

如何使小部件在颤动中相互浮动[关闭]

将 Kivy Widget 传递给另一个类