有没有一种方法可以将循环生成列表的成员与具有特定值的对象相关联?

时间:2019-10-23 05:05:11

标签: python for-loop while-loop graphics

我正在尝试使用graphics.py制作可以用作按钮的简单图形。尽管我知道如何通过单独绘制每个对象并将其与字母或数字关联来实现此目的,但是我使用循环来生成对象。我不知道如何将每个创建的对象与特定的字母或数字相关联。

下面是一些我一直在尝试找到解决此问题的方法的代码。循环功能可用于创建图形以及检测其中的鼠标单击。我迷路的地方是如何为列表中的每个成员分配字母或数字的特定分配。下面的代码生成三个圆,我想分别将它们与字母A,B,C关联,以便在单击时将它们绘制在图形上方。

from graphics import*
import string
def main():
    window = GraphWin("Window", 400, 400)
    circles1 = keys(window)
    # line here to call upon function that draws labels over
    # the circles using ascii string removed for relevance
    # test for clicking circles
    while True:
        clickPoint=window.checkMouse()
        if clickPoint != None:
            for i in circles1:
                if mouse(clickPoint, i) == True:
                    i.undraw()
                    # i.undraw used to test while loop


def keys(window):
    # Define circles as an empty list
    circles = []
    x = 50
    for i in range(3):
        x += 50
        circle = Circle(Point(0+x, 100), 20)
        circle.setFill("black")
        circles.append(circle)
        circle.draw(window)
    return circles



def mouse(point, circle):
   x = point.getX()
   y = point.getY()
   radius = circle.getRadius()
   center = circle.getCenter()
   cx = center.getX()
   cy = center.getY()
   distance=(((cx-x)**2)+((cy-y)**2))**0.5
   if (distance < radius):
       return True
    else:
        return False

理想情况下,单击按钮会在其上方绘制分配给它的字母。谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以遍历string.ascii_lowercase 现在,您返回一个数组,但是使用generator

看起来更像Python
from graphics import*
import string

def keys(window):
    for letter, index in enumerate(string.ascii_lowercase):
        x = 50*(index+1)
        circle=Circle(Point(0+x,100),20)
        circle.setFill("black")
        # Do what you need with Letter
        circle.draw(window)
        yield circle

如果此代码令人困惑,建议您记录以下内容:

  • 生成器和yield关键字(某些资源here
  • enumerate功能(您可以检查here

请牢记这两点,您现在只需要string.ascii_lowercase将返回abcdefghijklmnopqrstuvwxyz。我会让你猜猜string.ascii_uppercase返回了什么