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

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

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

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

像这样:

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

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

【问题讨论】:

    标签: python 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'))
        

        【讨论】:

          猜你喜欢
          • 2016-01-16
          • 2019-10-30
          • 2014-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多