如何将纯 python 中动态创建的按钮添加到用 Kivy 语言编写的 kivy 布局中?

Posted

技术标签:

【中文标题】如何将纯 python 中动态创建的按钮添加到用 Kivy 语言编写的 kivy 布局中?【英文标题】:How do I add buttons that are dynamically created in pure python to a kivy layout that is Written in Kivy Language? 【发布时间】:2016-05-04 19:20:54 【问题描述】:

我的问题是我需要根据可变数量的网格方块创建一个按钮网格,并将它们放置在网格布局上并使用屏幕管理器将它们显示在屏幕上。我知道如何使用简单的 for 循环在纯 python 中执行此操作,但是我用 kivy 语言为我的程序编写了布局,我不知道如何将按钮添加到网格布局中,因为我不知道如何在 kv 文件中正确引用它们。相关的python代码是:

def buildMap():
    index = 0
    for index in range(0, numberOfGridBlocks):
        mainMap.ids["Map"].add_widget(Button())
        index = index + 1
buildMap() 

kv文件的相关部分是:

ScreenManagement:
    MainMenuScreen:
    NewGameMenuScreen:
    JoinGameMenuScreen:
    TutorialMenuScreen:
    SettingsMenuScreen:
    MapScreen:

<MenuButton>:
    on_press: app.menuButtonPressed()
    size_hint_y: .125
    background_normal: "images/button.png"
    background_down: "images/buttonPressed.png"

<Button>:

<BoxLayout>:
    orientation: "vertical"
<MapLayout>:

<MapScreen>:
    name: "mapScreen"
    MapLayout:
        id: "Map"
        cols: 5

【问题讨论】:

您想为每个屏幕创建网格布局并在其中放置一些按钮? 是的,无需在 kv 文件中静态执行。换句话说,我知道我可以通过在父 MapLayout 下键入 Button: X 次来创建按钮,但它们需要通过可变次数生成,因此必须动态生成。 对不起,我看错了,只是在地图屏幕上。 【参考方案1】:

我希望这个例子能让你明白:

test.kv:

#:kivy 1.9.0
ScreenManager:
    MapScreen:

<MapScreen>:
    name: 'map'

    GridLayout:
        id: grid
        cols: 1

main.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.button import Button
from kivy.clock import mainthread

NUMBER_OF_BUTTONS = 5


class MapScreen(Screen):

    @mainthread
    def on_enter(self):
        for i in xrange(NUMBER_OF_BUTTONS):
            button = Button(text="B_" + str(i))
            self.ids.grid.add_widget(button)


class Test(App):
    pass


Test().run()

需要@mainthead 装饰器来稍微延迟函数,因此首先扫描kv 文件,使ids 列表可行。

【讨论】:

谢谢!这非常有帮助。供将来参考的兴趣点,如果在定义 on_enter 之前使用 builder 加载 kv 文件,则不需要 @mainthread。再次感谢!

以上是关于如何将纯 python 中动态创建的按钮添加到用 Kivy 语言编写的 kivy 布局中?的主要内容,如果未能解决你的问题,请参考以下文章

MFC SDI中 如何为动态创建的按钮添加消息处理函数

Python动态添加按钮分别管理[重复]

如何使用动态添加的按钮打开模态窗口 - 纯 JavaScript

如何从动态创建的按钮中获取属性?

如何将按钮动态添加到我的表单中?

如何在动态创建的行中添加日期选择器