我正在尝试使用 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
理想情况下,单击按钮将在其上方绘制分配给它的字母。感谢您的任何帮助
你可以迭代string.ascii_lowercase
现在,你返回一个数组,但它看起来更pythonic,使用generator
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
关键字(此处提供一些资源) enumerate
功能(您可以在此处查看)
考虑到这两件事,您现在只需要string.ascii_lowercase
返回abcdefghijklmnopqrstuvwxyz
。我会让你猜猜string.ascii_uppercase
回报