【问题标题】:Why is only the last element of a list being accessed? [duplicate]为什么只访问列表的最后一个元素? [复制]
【发布时间】:2018-02-09 00:43:31
【问题描述】:

我正在尝试制作回合制战斗系统,但在尝试获取按钮以相对访问列表元素时遇到了问题(按钮列表中的按钮访问另一个中相同索引的元素列表)。但是,单击时,每个按钮仅访问列表的最后一个元素。以下是显示相同问题的简化示例代码:

from tkinter import *

root = Tk()

my_list = ['index 0', 'index 1', 'index 2']
buttons = []

for i in range(len(my_list)):
    buttons.append(Button(root, text='Button '+str(i), command=lambda: print(my_list[i])))
    buttons[i].pack()

我了解,由于我在循环中执行此操作,因此所有按钮都可能访问最后一个元素,因为它是 i 的最新值,但我想不出另一种方法来实现我的目标.更具体地说,从上面的示例代码中得出结论,my_list 表示角色可以采取的操作列表。 buttons 中的每个按钮对应于其中一个操作(单击按钮设置您在回合结束时采取的操作)。通常,我可以更明确地分配动作,但由于有多个战斗机,我选择使用循环并隐式执行,因为my_list 经常更改以反映每个不同战斗机的动作。

我不太清楚为什么会发生这种情况,我也想知道如何实现允许每个按钮访问其在my_list 中的相应元素的目标,因为它可能无法以这种方式完成。感谢您阅读,如果我可以为您澄清任何事情,请告诉我。

【问题讨论】:

    标签: python arrays python-3.x for-loop tkinter


    【解决方案1】:

    使用functools.partial 代替lambda

    from functools import partial
    # ...
    buttons.append(Button(root, text='Button '+str(i), command=partial(print, my_list[i])))
    

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2021-07-06
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多