TypeError: объект 'type' не может быть подписан + итерация, поскольку 'A' не A - PullRequest
0 голосов
/ 26 мая 2019

Я очень новичок в программировании, и я пытаюсь написать программу на python3, которая находит конкретные картинки на экране. Картинки состоят из букв алфавита, и я пытаюсь написать цикл для всех букв вместо того, чтобы писать их каждый раз.

Мне удалось заставить его работать для отдельных букв, но когда я пытаюсь запустить его через все, он выдает ошибку

«Ошибка типа: объект« тип »не может быть подписан»

Не уверен, что это значит, но кроме того, при попытке изменить путь к файлу на каждой итерации он включает апострофы и, таким образом, портит путь к файлу.

ЭТО РАБОТАЕТ -

LETTERSONBOARD = [ ]

Letter_A =(list (pyautogui.locateAllOnScreen(r'C:\Users\Letter_A.png'))

LetA = [ ]

for a in Letter_A:

    LetAC.append(pyautogui.center(a))

for a in LetA:

    LETTERSONBOARD.append(a)

print (LetA)

ЭТО НЕ ...

ALPHABET = ['A', 'B', ..., 'Z']

LETTERSONBOARD = []

for xx in ALPHABET:

    Letter_[xx] =(list (pyautogui.locateAllOnScreen(r'C:\Users\Letter_'+str[xx]+'.png',))

    Let[xx] = []

    for aa in Letter_[xx]:

        Let[xx].append(pyautogui.center(aa))
    for bb in Let[xx]:

        LETTERSONBOARD.append(bb)

    print (Let[xx])

1 Ответ

0 голосов
/ 26 мая 2019

Ошибка TypeError: 'type' object is not subscriptable указывает на то, что вы пытаетесь использовать квадратные скобки для объекта, который не поддерживает это. Обычно «подписка» - это способ доступа к значениям словаря.

Я вижу в вашем коде, что вы используете Letter_[xx], но не вижу, где вы определили Letter_ в качестве словаря. Вы можете попытаться исправить это, добавив Letter_ = {} перед верхним циклом.


Несколько других советов:

  • Вы заполняете LETTERSONBOARD, но, кажется, вы никогда его не используете.
  • Вы создаете множество списков и словарей. Подумайте о том, что вам действительно нужно. Какая информация вас интересует, когда весь фрагмент кода будет запущен?
  • Подумайте об использовании правильных имен переменных, которые на самом деле говорят вам, что они содержат. Это сделает ваш код намного проще для понимания. Не только для других, но и для себя.

Вот ваш код, переписанный с лучшей структурой и именами переменных. Обратите внимание, что я не проверял это.

ALPHABET = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
FoundLetter = namedtuple("FoundLetter", ["letter", "center_x", "center_y"])
found_letters = []
for letter in ALPHABET:
  letter_image = "C:\\Users\\Letter_{}.png".format(letter)
  for found_letter in pyautogui.locateAllOnScreen(letter_image):
    center = pyautogui.center(found_letter)
    finding = FoundLetter(letter, center.x, center.y)
    found_letters.append(finding)

Теперь found_letters содержит список объектов, предлагающих поля letter, center_x и center_y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...