如何将小部件动态添加到网格?

Posted

技术标签:

【中文标题】如何将小部件动态添加到网格?【英文标题】:How do I dynamically add widget to grid? 【发布时间】:2021-12-05 05:03:15 【问题描述】:

我在顶部 boxlayout 中有一个按钮,我想在下面的网格布局中添加一个小部件。

这是我的 .py 文件代码

    class rootWidget(BoxLayout):
        pass
        
    class topWidget(BoxLayout):
        print("top part")
        
    class middelWidget(GridLayout):
        pass
        
    class bottomWidget(BoxLayout):
        pass
    
    class NewButton(Button):
        pass
    
    class mainkv(App):
        
        def newButt(self):
            print("button clicked")
            
            butt = NewButton(text="New Button")
                    
            middelWidget().add_widget(butt)
        
        def build(self):
            return rootWidget() 
      
    mainkv().run()

这是我的 .kv 文件

    <topWidget>:
        Button:
            text: 'CLick add to grid'
            on_press:
                app.newButt()
    <middelWidget>:
        cols: 6
        id: grid
        Button:
            text: 'middel Grid'
        
            
    <bottomWidget>:
        Button:
            text: 'bottom'  
        
    <rootWidget>:
        orientation: 'vertical'
        Button:
            text: 'Root'
        
        topWidget:
        
        middelWidget:
        
        bottomWidget: 

我没有收到任何错误,但它不起作用。 无法弄清楚缺少什么帮助非常感谢。

【问题讨论】:

【参考方案1】:

问题在于代码:

middelWidget().add_widget(butt)

正在创建middelWidget 的新实例,并将Button 添加到该新实例中。但是,middelWidget 的新实例不是您的 GUI 的一部分,因此没有任何反应。解决方法是使用 GUI 中已经存在的 middelWidget 实例。这可以使用ids 来完成。这是kvrootWidget 规则的修改版本:

<rootWidget>:
    orientation: 'vertical'
    Button:
        text: 'Root'
    
    topWidget:
    
    middelWidget:
        id: middle  # id for accessing middelWidget
    
    bottomWidget:  

那么newButt()方法可以是:

def newButt(self):
    print("button clicked")

    butt = NewButton(text="New Button")

    middle = self.root.ids.middle  # get a reference to the middelWidget instance
    middle.add_widget(butt)
    # middelWidget().add_widget(butt)

另外,你的类应该以大写字母开头。这不仅仅是为了外观,在kv 中使用这些类时可能会导致错误。

【讨论】:

以上是关于如何将小部件动态添加到网格?的主要内容,如果未能解决你的问题,请参考以下文章

在颤动中动态地将小部件添加到列的子项

在 PyQt5/Pyside2 中动态添加小部件到流布局

为啥添加到网格布局的动态按钮彼此之间有很大的距离?

如何有条件地将小部件添加到列表中?

netbeans:如何将小部件添加到 QT 变量

如何从我的应用程序将小部件添加到 Android 主屏幕?