在Kivy中将BoxLayout切换为垂直,并在Python代码中通过id获取小部件

时间:2014-07-10 00:37:17

标签: python user-interface kivy

我正在创建一个Accordion小部件,点击输入文本输入。

以下是python代码:

class LabelNavigatorWidget(BoxLayout):
    def create_accordion_widget(self):
        self.cleanup_root()
        root = Accordion(id='accordion_widget', orientation='vertical')
        for x in range(2):
            item = AccordionItem(title='Title %d' % x)
            item.add_widget(Label(text='Very big content\n' * 10))
            root.add_widget(item)
        self.add_widget(root)
        return root

    def cleanup_root(self):
        # Remove previous widget
        for child in self.children:
            if child.id == 'accordion_widget':
                self.remove_widget(child)

class LabelNavigatorApp(App):
    def build(self):
        return LabelNavigatorWidget()

if __name__ == "__main__":
    LabelNavigatorApp().run()

以下是kv代码:

<LabelNavigatorWidget>:
    BoxLayout:
        orientation: 'vertical'
        TextInput:
            id: label_input
            font_size: 30
            pos: 0, 0
            size_hint_y: None
            height: 50
            multiline: False
            text: ''
            on_text_validate: root.create_accordion_widget(); self.text = ''

它的外观如下:

Incorrect BoxLayout

  1. 因此,默认的BoxLayout是水平的,如何将其设置为垂直?
  2. 文本输入的初始位置位于BoxLayout的底部,如何让它位于顶部?
  3. 无论什么时候,我点击进入,它都会创建一个新的手风琴小部件 - 这就是为什么我在创建一个新小部件之前删除之前的小部件。但是,是否有更好的方法来获取子窗口小部件(比如id?)然后将其删除而不是遍历所有子项?

1 个答案:

答案 0 :(得分:2)

  

因此,默认的BoxLayout是水平的,如何将其设置为垂直?

与其他BoxLayout一样,只需设置orientation: 'vertical'

<LabelNavigatorWidget>:
    orientation: 'vertical'
    BoxLayout:
        orientation: 'vertical'
  

文本输入的初始位置位于BoxLayout的底部,如何让它位于顶部?

添加一个空小部件以填充剩余空间。

BoxLayout:
    orientation: 'vertical'
    TextInput:
        size_hint_y: None
        height: 50
        # ... and the rest
    Widget:
  

无论什么时候,我点击Enter,它都会创建一个新的手风琴小部件 - 这就是为什么我在创建一个新小部件之前删除之前的小部件。但是,是否有更好的方法来获取子窗口小部件(比如id?)然后将其删除而不是遍历所有子项?

您可以将对它的引用存储为属性,例如self.accordion_widget = AccordionWidget(...)然后self.remove_widget(self.accordion_widget)