【问题标题】:How to return the text of a clicked button which was created in a for loop?如何返回在 for 循环中创建的单击按钮的文本?
【发布时间】:2021-05-16 16:17:52
【问题描述】:

示例:

.py 代码:

class PokemonWindow(Screen):
    form_button = ObjectProperty(None)
    type_grid = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(PokemonWindow, self).__init__(**kwargs)
        self.searched_pokemon_forms = ["Normal", "Purified", "Shadow"]
            
    def create_form_buttons(self):
        for text in self.searched_pokemon_forms:
            self.form_button = Button(text=text, on_press=self.get_text)
            self.type_grid.add_widget(self.form_button)

    def get_text(self, *args):
        return self.form_button.text

和 .kv 代码:

<PokemonWindow>:
    name: "pokemonWindow"
    type_grid: type_grid

    MDGridLayout:
        id: type_grid
        rows: 2
        cols: 4
        size_hint_x: .8
        size_hint_y: .05
        pos_hint: {"x": .1, "y": .8}

目标: 如果我单击此示例中的三个按钮之一,我想获取我单击的特定按钮的文本,以将其用于另一种方法。

问题: 我面临的问题是,无论我点击哪个按钮,我总是得到相同的文本。我认为这是因为 ObjectProperty 在 for 循环的每次迭代中都会被覆盖。

当然有一个聪明的方法来解决这个问题,但我现在想不通。谁能向我解释实现我的目标的最佳方法是什么?

编辑: 好的,既然我可能无法获得按钮的文本,我将解释为什么我想要文本。也许有人知道解决我的问题的更好方法。

有一个文本输入,您不能将口袋妖怪名称作为字符串输入,然后单击搜索按钮,它将在 .json 文件中搜索输入的字符串并返回一个包含 sub_lists 的列表,该列表存储该口袋妖怪的信息及其“形式”(阴影、净化、正常等)。该列表将如下所示:

self.information = [['Normal', 143, 'Snorlax', ['Normal']], ['Purified', 143, 'Snorlax', ['Normal']], ['Shadow', 143, 'Snorlax', ['Normal']]]

第一个值是表单,第二个值是 pokedex id,第三个值是名称,第四个值是 sub_list 的 sub_list,其中包含 pokemon 的类型。

将创建另一个列表 (self.searched_pokemon_forms),该列表仅存储 pokemon 的形式,如上所示。此列表的长度定义了将要创建的按钮的数量,并且每个按钮都将包含文本形式的表单(字符串)。

如果我现在单击一个按钮,我希望能够检索存储在较长列表(self.information)中的信息,并使用它来创建一组显示这些信息的标签,例如

按下带有文本(表单)“Normal”的按钮,现在我想获取 id (143)、名称 ("Snorlax") 和类型 (["Normal"])。

我希望这有助于阐明我的目标。

编辑 2:我终于在没有将 self.get_text() 方法放入 App 类的情况下让它工作,但很高兴知道,所以谢谢@SHINJI.K。

我只需要将值添加到这样的列表中:

    def get_text(self, button):
        if len(self.text_list) != 0:
            del self.text_list[:]
        self.text_list.append(button.text)

现在我总是可以使用self.text_list[-1] 获得正确的按钮文本。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    self.form_button 将始终为“Shadow”,因为它是 self.searched_pokemon_forms 中的最后一项

    您可能只想修改get_text() 以引用单击的按钮,而不是使用self.form_button

        def get_text(self, button):
            return button.text
    

    单击绑定到 get_text() 的任何按钮后,该按钮将作为button 传递给函数。然后,您可以使用此引用访问单击按钮的文本属性。

    回调函数返回值是没有意义的,因为当它被调用时你无法检索它。我建议您只需在回调函数中使用button.text 做您想做的事情。

    【讨论】:

    • 感谢您的回答。我不确定我是否理解您对实例的含义。如果无法获取单击按钮的文本,我将更新我的问题。在创建之后。
    • 当一个按钮被点击时,它会将一个对自身的引用传递给回调函数。因此,instance 参数是对您单击的按钮的引用。 instance.text 实际上是您想要的文本。也许我应该将参数命名为button 以使其更清晰。
    • 非常感谢,我现在能够让它工作,但我认为它不会像我希望的那样工作。因为如果我想做这样的事情,我认为我不能使用该功能:form = self.get_text(),对吧?
    • 我能想到的一种解决方法是将您的回调函数迁移到您的 App 类。您可以使用App.get_running_app() 访问您的应用程序类,因此您可以选择这样做:self.form_button = Button(text=text, on_press=App.get_running_app().get_text)
    • 您可以在 PokemonWindow() 中定义另一个函数,并在 App 类的回调中调用它。您可以在 PokemonWindow 中执行回调,并在其中调用函数或修改 App 类的属性。最后,您可以在两个类之外进行回调,然后从外部修改它们。
    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2021-11-24
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多