Как изменить положение списка с помощью функции onkey в python

Я хочу изменить форму черепахи со списком, который был создан shapes = ["square", "triangle", "circle"] с помощью функции onkey. Я имею в виду, что всякий раз, когда я нажимаю кнопку, например h, как мне сделать так, чтобы она проходила через каждую из фигур всякий раз, когда я нажимаю h. Для этого я буду использовать функцию turtle.shape ().

Что я сделал до сих пор, так это создал список фигур, но я понятия не имею, как добиться следующего, чего я хочу достичь.

  def turtle1 ():
   shapes = ["square", "triangle", "circle", "pentagon", "star", "octagon"]
   shapeiter = itertools.cycle(shapes)
   next(shapeiter)
   1
   shape(next(shapeiter))
   next(shapeiter)
   2
   shape(next(shapeiter))
   next(shapeiter)
   3
   shape(next(shapeiter))
   next(shapeiter)
   4
   shape(next(shapeiter))
   next(shapeiter)
   5
   shape(next(shapeiter))
   next(shapeiter)
   6
   shape(next(shapeiter))


 onkey(turtle1, "h")

person Hayden    schedule 30.08.2012    source источник


Ответы (2)


itertools.cycle() позволит вам циклически повторять последовательность бесконечно.

>>> t = itertools.cycle((1, 2, 3))
>>> next(t)
1
>>> next(t)
2
>>> next(t)
3
>>> next(t)
1
>>> next(t)
2
person Ignacio Vazquez-Abrams    schedule 30.08.2012
comment
Могу ли я заменить цифры фигурами? - person Hayden; 30.08.2012
comment
Вы бы заменили аргумент функции любой последовательностью, которую вы хотите прокрутить, например. shapeiter = itertools.cycle(shapes). Просто убедитесь, что вы вызываете функцию только один раз. - person Ignacio Vazquez-Abrams; 30.08.2012
comment
Хорошо, позвольте мне поэкспериментировать с этим, и я опубликую свои выводы. - person Hayden; 30.08.2012
comment
Я пытался сделать то, что в отредактированном посте, но, похоже, не работает. - person Hayden; 30.08.2012
comment
next() возвращает значение. Вам нужно что-то сделать с этим значением. - person Ignacio Vazquez-Abrams; 30.08.2012
comment
Итак, после следующего (формирователя)|1 я должен перейти к форме (формы (1)) затем к следующему (формирователю)|2 формы (формы (2))? - person Hayden; 30.08.2012
comment
Нет. Вы берете значение, возвращенное next(), и передаете его turtle.shape(). - person Ignacio Vazquez-Abrams; 30.08.2012
comment
Извините, я не знаю, как это сделать. - person Hayden; 30.08.2012
comment
Итак, я сделал то, что вы сказали, и он циклически проходит по списку, но останавливается только на том, что в конце. - person Hayden; 30.08.2012
comment
Это никогда не должно останавливаться. Это то, что делает itertools.cycle(). Вам нужно вызывать next() только один раз при каждом нажатии клавиши. - person Ignacio Vazquez-Abrams; 30.08.2012
comment
Я переработал код @Hayden, используя ваш подход itertools.cycle(), чтобы попытаться окончательно решить этот вопрос. Он работает, как и ожидалось, но исходные списки форм @Hayden недействительны, поэтому он был заменен на turtle.getshapes(). - person cdlane; 05.12.2016

Этот вопрос, похоже, не имеет надлежащего закрытия, поэтому я попытаюсь сделать это.

Ниже приведена переработка с использованием решения @IgnacioVazquez-Abrams на основе itertools.cycle(). В исходном коде @Hayden перечислены формы, которые не обязательно являются допустимыми, что могло привести к преждевременному завершению его кода. Я использовал turtle.getshapes() для получения допустимых форм, а также изменил заголовок окна, указав имя формы:

import turtle
import itertools

def reshape():
    turtle.shape(next(shape_iterator))

    turtle.title(turtle.shape())

screen = turtle.Screen()

shape_iterator = itertools.cycle(screen.getshapes())

screen.onkey(reshape, "h")

screen.listen()

reshape()

screen.mainloop()

Нажмите на окно, чтобы сделать его активным, а затем введите «h», чтобы просмотреть все встроенные формы черепах.

person cdlane    schedule 05.12.2016