Есть ли способ связать членов сгенерированного цикла списка, которые являются объектами с конкретными значениями? - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь использовать 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 голосов
/ 23 октября 2019

Вы можете перебрать string.ascii_lowercase Теперь вы возвращаете массив, но он выглядит более питоническим для использования 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 возвращает

...