Модуль черепахи не открывает окно

#python #python-turtle

Вопрос:

У меня есть упражнение в школе, где мы должны использовать sys модуль для чтения файла сценария, содержащего инструкции для turtle модуля. Файл сценария .trtl -это файл.

Он содержит следующую информацию, отформатированную следующим образом:

 Walk
100
Turn
90
Walk
50
Turn
90
Walk
100
Turn
90
Walk
50
 

Я попробовал этот код:

 import sys
import turtle


for idx, line in enumerate(sys.stdin):

move = 0

while (idx % 2) == 0:
    move = line


while (idx % 2) != 0:
    if line == "Walk":
        forward(move)

    elif line == "Turn":
        left(move)
 

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

Любая помощь будет очень признательна!

Комментарии:

1. Вы пробовали распечатать свои строки (с чем-то вроде print(f'->{line}<-') того, чтобы узнать точное значение строки? Это может помочь вам определить, есть ли скрытый символ, который вы не замечаете в конце вашей строки . 😉

2. @blackbrandt Мне кажется, я понимаю, что ты имеешь в виду. Теперь я вставляю «line = line.rstrip ()» в цикл, и теперь открывается окно! Спасибо! Однако Черепаха все еще не двигается.

3. Было слишком много проблем, которые я мог бы прокомментировать, поэтому я добавил ответ со всеми исправлениями.

Ответ №1:

Ваша проблема связана с двумя основными проблемами:

  1. При чтении строки из файла будет прочитана ВСЯ строка, включая символ новой строки в конце. Использование .rstrip() метода удалит это.
  2. Чтение строки из файла считывает строку. Вы должны принудить его к тому типу, который вам нужен. Например, когда вы читаете строку 100 , вы читаете в 4 байтах: '1', '0' '0' 'n' , а не число 100. Вам нужно будет добавить int() принуждение, а также убрать конец n этих строк.
  3. Прочитайте о разнице между if утверждением и while утверждением. if Оператор проверит логическое значение своего аргумента и решит, следует ли выполнять следующий блок кода или нет. while Цикл будет проходить по коду до тех пор, пока существует логический оператор truthy .

Есть еще несколько проблем с вашим кодом, на которые я укажу в комментариях.

Исправление вашего кода:

 import sys
import turtle

for idx, line in enumerate(sys.stdin):
    #Strip trailing character
    line = line.rstrip()
    #Change if to while
    if (idx % 2) == 0:
        #Coerce value to int instead of string
        move = int(line)
    # idx % 2 will either be 0 or not 0, no need to check twice.
    # If it is not 0, then this else statement will run
    else:
        #Now that line has been stripped of trailing chars, we can check
        
        if line == "Walk":
            forward(move)
        #Alternately, we can use
#       if line.startswith("Walk"):
        # and not have to do an rstrip
    
        elif line == "Turn":
            left(move)

 

Ответ №2:

Для развлечения, альтернатива подробному решению @blackbrandt ( 1), которое, хотя и лаконично, также легче расширить до дополнительных монадических операторов:

 import sys
import turtle

commands = {'Walk': turtle.forward, 'Turn': turtle.left}

for command, argument in zip(sys.stdin, sys.stdin):
    if method := commands.get(command.rstrip()):
        method(int(argument))

turtle.exitonclick()
 

введите описание изображения здесь

Комментарии:

1. Нашел функционального программиста. Это похоже на ввод кода в гольф 😉