如何在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
似乎是最合适的,但它似乎不支持将小部件放置在多个单元格中。
更具体地说,当将 columnspan
或 rowspan
设置为大于 1 时,我希望行为类似于 Tkinter 的网格几何管理器。
像这样:
(widget)(widget)(widget)
( bigger widget )(widget)
...
我希望能够使用现有的 kivy 布局来执行此操作,而不必编写自己的布局类来处理此问题,但如果没有其他选择,这也可以。
【问题讨论】:
【参考方案1】:这里的另一个选项是使用 1 列的 GridLayout,并使用方向 =“horizontal”的 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
将有 row
和 height
值为零。这将归档一个跨度效果
这是一个.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中使小部件跨越多个列/行的主要内容,如果未能解决你的问题,请参考以下文章