如何将列表中的文本作为单独的 canvas.create_text 添加到 canvas

How to add text to canvas from a list as separate canvas.create_text

我有一个列表:

StoreItems = random.sample(set(['sword','pickaxe','toothpick','hammer','torch','saw']), 5)

以及将选择的这 5 个字符串添加到我的 canvas 并给它们绑定的附加行。

XBASE, YBASE, DISTANCE = 300, 320, 50
for i, word in enumerate(StoreItems):  
    canvas.create_text(
        (XBASE, YBASE + i * DISTANCE),
        text=word, activefill="Medium Turquoise", anchor=W, fill="White", font=('Anarchistic',40))

found = canvas.find_closest(XBASE, YBASE)
if found:
    canvas.itemconfig(found[0])
    canvas.bind('<1>', Buy)

问题是我需要为每个单词分配不同的标签绑定,而目前它为所有单词分配相同的绑定。所以我不能让点击 saw 与点击 toothpick.

有不同的结果

假设您的回调有一个 item 参数以及事件

def Buy(event,item):
    canvas.itemconfigure(item,fill="red")

然后您可以遍历商店中的商品,为每个商品创建一个独特的回调包装器,如下所示:

for item in StoreItems:
    def Buy_Wrapper(event, item = item):
        Buy(event, item)
    canvas.tag_bind(item,"<Button-1>",Buy_Wrapper)

或与 lambda 表达式内联的相同内容,但我个人认为它们难以阅读

for item in StoreItems:
    canvas.tag_bind(item,"<Button-1>",lambda event,item=item:Buy(event,item))

functools.partial 指定关键字参数:

from functools import partial
for item in StoreItems:
    canvas.tag_bind(item,"<Button-1>",partial(Buy,item=item))

这是我的解决方案:

StoreItems = random.sample(set(['sword','pickaxe','toothpick','hammer','torch','saw']), 5)
#Selects 5 Random strings from the list. ^

XBASE, YBASE, DISTANCE = 300, 340, 50
for i, word in enumerate(StoreItems):  
    canvas.create_text(
        (XBASE, YBASE + i * DISTANCE),
        text=word, activefill="Medium Turquoise", anchor=W, fill="White", font=('Anarchistic',40), tags=word)

canvas.tag_bind('sword', '<ButtonPress-1>', BuySword)
canvas.tag_bind('pickaxe', '<ButtonPress-1>', BuyPick)
canvas.tag_bind('toothpick', '<ButtonPress-1>', BuyTooth)
canvas.tag_bind('hammer', '<ButtonPress-1>', BuyHammer)
canvas.tag_bind('torch', '<ButtonPress-1>', BuyTorch)
canvas.tag_bind('saw', '<ButtonPress-1>', BuySaw)

通过设置 (tags=word) 并使 tag.bind 与相应的词相同,它会将该标签仅分配给该词。