如何将Widget添加到Kivy布局中的特定位置

问题描述 投票:0回答:1

基本上在 Spinner 之后,我将为每个选项创建一个 Python 构建的小部件,以根据所选的“类型”收集输入数据。现在的问题是,当我像这样运行它时,标签被放置在屏幕中间,忽略已经放置的每个小部件。我需要控制它在现有布局中的放置位置。

这是Python部分

class NewTaskScreen(Screen):

    testlabel = Label(text="test label")

    #need to create elements in a certain position on the grid/box
    def selecttype(self, instance):
        self.add_widget(self.testlabel)


class TaskReminder(App):
     def build(self):
        # Create the screen manager
        sm = ScreenManager()
        #sm.add_widget(MenuScreen(name='menu'))
        sm.add_widget(NewTaskScreen(name='newtask'))

        return sm

还有 Kyvi 部分

<NewTaskScreen>:
      BoxLayout:
            orientation: 'vertical'
            Button:
                  text: "Back to menu"
                  font_size: 64
                  size: 100, 50
                  on_release: root.manager.current = 'menu'
            GridLayout:
                  cols:2
                  Label:
                        text: "Name:"
                  TextInput:
                        multiline:False
                  Label:
                        text: "Description:"
                  TextInput:
                        multiline:False
                  Label:
                        text: "Type:"
                  Spinner:
                        text: 'Constant'
                        values: 'Constant', 'Daily', 'Monthly', 'Yearly', 'OneOff'
                  Button:
                        text: 'test'
                        font_size: 64
                        size: 100, 50
                        on_release: root.selecttype(self)

我尝试更改 add_widget 方法上的索引变量,但唯一改变的是小部件是在所有内容的前面还是在所有内容的后面。我知道,如果我在 main 中调用的类是 GridLayout,那么 add_widget 方法将在调用后立即插入它来工作。示例:

class ExampleGrid(GridLayout):
    def __init__(self, **kwargs):
        super(ExampleGrid, self).__init__(**kwargs)

        self.cols = 2

        self.submit = Button(text="Submit", font_size=32)
        self.submit.bind(on_press=self.press)
        self.add_widget(self.submit)
    
    def press(self, instance):
        self.add_widget(Label(text="test label"))

class TestApp(App):
    def build(self):
        return ExampleGrid()

问题是我有点需要多个屏幕来实现未来的功能。 也许这很容易解决,但我已经搜索了几个小时的答案。 请帮忙。

python kivy widget
1个回答
0
投票

如果我正确理解你的问题,你想将

testlabel
添加到
GridLayout
。为此,只需将
id
添加到
GridLayout
:

<NewTaskScreen>:
      BoxLayout:
            orientation: 'vertical'
            Button:
                  text: "Back to menu"
                  font_size: 64
                  size: 100, 50
                  on_release: root.manager.current = 'menu'
            GridLayout:
                  id: grid

然后,在

selecttype()
方法中,使用新的
id
,如下所示:

def selecttype(self, instance):
    self.ids.grid.add_widget(self.testlabel)
© www.soinside.com 2019 - 2024. All rights reserved.