Питон - остановить черепаху от холста - PullRequest
0 голосов
/ 08 марта 2019

Я делаю программу, используя tkinter. У меня есть холст и черепаха внутри холста. В настоящее время черепаха перемещается по экрану с помощью клавиш со стрелками, однако я хочу, чтобы она не смогла покинуть границы холста. Вот мой текущий код

canvas = Tk.Canvas(master=self, width=300, height=300)
canvas.grid(row=2, column=2, columnspan=3, padx=50)

canvas.focus_set()

t = turtle.RawTurtle(canvas)
t.setheading(90)

left_bound = -(canvas.winfo_width() / 2)
right_bound = canvas.winfo_width() / 2
top_bound = canvas.winfo_height() / 2
bottom_bound = -(canvas.winfo_height() / 2)

tx = t.xcor()
ty = t.ycor()

if tx > right_bound or tx < left_bound:
    t.undo()
if ty > top_bound or ty < bottom_bound:
    t.undo()

def move_forward_keys(_):
   t.forward(10)

def move_left_keys(_):
   t.left(20)

def move_right_keys(_):
   t.right(20)

def move_back_keys(_):
   t.back(10)

canvas.bind("<Up>", move_forward_keys)
canvas.bind("<Left>", move_left_keys)
canvas.bind("<Right>", move_right_keys)
canvas.bind("<Down>", move_back_keys)

Это может быть потому, что я делаю что-то не так, но сейчас это мой код. Который, я думаю, должен работать, потому что, если он уходит, он должен отменить свое последнее действие.

Спасибо

1 Ответ

0 голосов
/ 08 марта 2019

Проблема в том, что этот код:

tx = t.xcor()
ty = t.ycor()

if tx > right_bound or tx < left_bound:
    t.undo()
if ty > top_bound or ty < bottom_bound:
    t.undo()

находится на верхнем уровне вашего файла, когда он должен быть встроен в функции move_forward_keys() и move_back_keys():

CURSOR_OFFSET = 6  # cursor hotspot closer to front than back

canvas = Tk.Canvas(master=self, width=300, height=300)
canvas.grid(row=2, column=2, columnspan=3, padx=50)

canvas.focus_set()

t = turtle.RawTurtle(canvas)
t.setheading(90)

left_bound = -(canvas.winfo_width() / 2)
right_bound = canvas.winfo_width() / 2
top_bound = canvas.winfo_height() / 2
bottom_bound = -(canvas.winfo_height() / 2)

def move_forward_keys(_):
    t.forward(9)
    tx, ty = t.position()

    if tx > right_bound or tx < left_bound:
        t.undo()

    if ty > top_bound or ty < bottom_bound:
        t.undo()

def move_left_keys(_):
    t.left(20)

def move_right_keys(_):
    t.right(20)

def move_back_keys(_):
    t.back(9)
    tx, ty = t.position()

    if tx > right_bound - CURSOR_OFFSET or tx < CURSOR_OFFSET + left_bound:
        t.undo()

    if ty > top_bound - CURSOR_OFFSET or ty < CURSOR_OFFSET + bottom_bound:
        t.undo()

canvas.bind("<Up>", move_forward_keys)
canvas.bind("<Left>", move_left_keys)
canvas.bind("<Right>", move_right_keys)
canvas.bind("<Down>", move_back_keys)
...