【发布时间】: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] 获得正确的按钮文本。
【问题讨论】: