如何将小部件动态添加到网格?
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
来完成。这是kv
中rootWidget
规则的修改版本:
<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
中使用这些类时可能会导致错误。
【讨论】:
以上是关于如何将小部件动态添加到网格?的主要内容,如果未能解决你的问题,请参考以下文章