如何将列表中的文本作为单独的 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 与相应的词相同,它会将该标签仅分配给该词。
我有一个列表:
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 与相应的词相同,它会将该标签仅分配给该词。