В Python turtle, с отключенным трассировщиком, есть ли способ обновить экран без использования screen.update ()? - PullRequest
0 голосов
/ 02 августа 2020

Я новичок в программировании на Python. Примерно три недели go я закончил клон тетриса, используя модуль черепахи, чтобы проверить свои навыки. У меня создалось впечатление, что когда я отключил трассировщик анимации, мне пришлось вручную обновить окно с помощью метода update(). Вчера, кодируя клон змеи с помощью модуля черепахи, мне пришлось объяснять другу, почему я вручную обновляю экран. Для доказательства я открыл тетрис и закомментировал методы update(), чтобы показать, что игра не будет работать. К моему удивлению, это действительно сработало, и я не могу понять, как это было, поскольку даже мой змеиный код не работал бы без метода update().

Вот часть основного l oop кода тетриса:

while not game_over:

if not current_piece.does_piece_fit(starting_row + 2, starting_column, current_piece.current_piece):
    game_over = True
wn.update()
movement()
marco.update_grid()
marco_next.show_next_piece(next_piece)
show_score()
current_piece.proyeccion()
marco_next.show_text(x_text_next_piece, y_text_next_piece, "Next Piece:", normal_style)
marco_next.show_text(x_text_hold, y_text_hold, "Hold:", normal_style)
show_instructions(x_text_instructions, y_text_instructions, instructions_text, smaller_style)

if holding:
    marco_hold.show_hold_piece(hold_piece)

Если строка wn.update() закомментирована, она не должна работать, но почему-то работает. Код немного длинноват, и я новичок на этом сайте, поэтому я не знаю, может ли его публикация полностью считаться плохой или грубой с моей стороны. Спасибо, что прочитали это, извините за плохой английский sh и запутанный код.

1 Ответ

0 голосов
/ 03 августа 2020

Некоторые команды turtle вызывают update() независимо от того, вызываете ли вы его. Некоторые, например, end_fill(), делают это напрямую, некоторые, например, dot(), делают это косвенно из-за других методов, которые они вызывают:

from turtle import *

tracer(False)

dot(100)  # change 'dot' to 'forward' and run again

done()

Если вы запустите вышеуказанное, вы получите точку, несмотря на tracer(False) вызов. Если вы измените dot на forward, вы получите пустой экран, если не закомментируете вызов tracer.

Мои практические правила для update() следующие:

  • не думайте, что кто-то позвонит вам

  • не думайте, что вы единственный, кто его называет

Это верно не только для Python черепахи. Мой совет: верните свои update() звонки туда, где вы считаете, что они вам нужны, иначе будущее обновление turtle может сломать ваш код.

...