Python tkinter и черепаха ошибки после остановки программы - PullRequest
0 голосов
/ 13 октября 2018

извините, что беспокою кого-либо, но когда я запускаю свой код (моя первая попытка в реальной игре), все работает нормально, но после того, как я закрываю его, печатаются некоторые ошибки, и я не могу найти кого-то еще с моей проблемой.Мои файлы называются Space Invaders.py, я использую Pycharm (эти ошибки также происходят с IDLE).Это мой код:

import turtle
import math

print("------------Space Invaders - Python------------")
print("-------------GAME NOT YET COMPLETED------------")
print("This console is simply a status readout.")

wn = turtle.Screen()
wn.bgcolor("black")
wn.title("Space Invaders")


borderPen = turtle.Turtle()
borderPen.speed(0)
borderPen.color("white")
borderPen.penup()
borderPen.setposition(-400, -400)
borderPen.pendown()
borderPen.pensize(3)
for i in range(4):
    borderPen.fd(800)
    borderPen.lt(90)
borderPen.hideturtle()


player = turtle.Turtle()
player.setheading(90)
player.shape("triangle")
player.color("blue")
player.penup()
player.speed(0)
player.setposition(0, -350)


enemy = turtle.Turtle()
enemy.color("red")
enemy.shape("circle")
enemy.penup()
enemy.speed(0)
enemy.setposition(-300, 250)

movementStepE = 2
movementStepEY = -15
movementStepP = 5 


def move_left():
    x = player.xcor()
    new_x = x - movementStepP
    if new_x < -380:
        new_x = -380
    player.setx(new_x)


def move_right():
    x = player.xcor()
    new_x = x + movementStepP
    if new_x > 380:
        new_x = 380
    player.setx(new_x)


def distancepyth(x1, x2, y1, y2):
    pyth = math.sqrt((x1 - x2) ** 2) + (y1 - y2 ** 2)
    return(pyth)


turtle.listen()
turtle.onkeypress(move_left, "Left")

turtle.onkeypress(move_right, "Right")

new_y = 250  # 250
while True:

    x = enemy.xcor()
    y = enemy.ycor()
    new_x = x + movementStepE
    if new_x > 380:
        movementStepE = movementStepE * -1
        new_y = y + movementStepEY
        new_x = 380
    elif new_x < -380:
        movementStepE = movementStepE * -1
        new_y = y + movementStepEY
        new_x = -380
    enemy.setposition(new_x, new_y)

turtle.done()

print("-------PROGRAM TERMINATED INTENTIONALLY-------")

и это ошибки:

Traceback (most recent call last):
  File "C:/Users/Noname Antilabelson/PycharmProjects/Space Invaders Game/Code/Space Invaders.py", line 97, in <module>
    enemy.setposition(new_x, new_y)
  File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 1776, in goto
    self._goto(Vec2D(x, y))
  File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 3158, in _goto
    screen._pointlist(self.currentLineItem),
  File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\turtle.py", line 755, in _pointlist
    cl = self.cv.coords(item)
  File "<string>", line 1, in coords
  File "C:\Users\Noname Antilabelson\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 2469, in coords
    self.tk.call((self._w, 'coords') + args))]
_tkinter.TclError: invalid command name ".!canvas"

Извините, если я сделал что-то глупое, ваша помощь будет принята с благодарностью!С уважением, Джейкоб Саттон

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вы также можете поместить оператор try catch вокруг него, например, так:

while True:
    try:
        x = enemy.xcor()
        y = enemy.ycor()
        new_x = x + movementStepE
        if new_x > 380:
            movementStepE = movementStepE * -1
            new_y = y + movementStepEY
            new_x = 380
        elif new_x < -380:
            movementStepE = movementStepE * -1
            new_y = y + movementStepEY
            new_x = -380
            enemy.setposition(new_x, new_y)
    except: #For more accuracy on catching, try something like 'except _tkinter.TclError:'
        break #if error raised

turtle.done()
print("-------PROGRAM TERMINATED INTENTIONALLY-------")

Пожалуйста, имейте в виду, что без чего-то вроде 'кроме _tkinter.TclError:' тогда любые ошибки просто закроютокно.

0 голосов
/ 13 октября 2018

Как вы отметили в своем комментарии, while True: - это ваша проблема, так как ей нет места в среде, управляемой событиями, такой как черепаха.Закрытие окна - это событие, которое запускается асинхронно с вашим основным циклом.Чтобы сделать его синхронным, мы можем использовать событие ontimer().Я внес это изменение в ваш код ниже, а также добавил другие идиомы черепахи и очистку кода:

from turtle import Screen, Turtle

print("------------Space Invaders - Python------------")
print("-------------GAME NOT YET COMPLETED------------")
print("This console is simply a status readout.")

def move_left():
    new_x = player.xcor() - movementStepP

    if new_x < -380:
        new_x = -380

    player.setx(new_x)

def move_right():
    new_x = player.xcor() + movementStepP

    if new_x > 380:
        new_x = 380

    player.setx(new_x)

def move_enemy():
    global new_y, movementStepE

    new_x = enemy.xcor() + movementStepE

    if new_x > 380:
        movementStepE *= -1
        new_y += movementStepEY
        new_x = 380
    elif new_x < -380:
        movementStepE *= -1
        new_y += movementStepEY
        new_x = -380

    enemy.setposition(new_x, new_y)

    screen.ontimer(move_enemy, 50)

movementStepE = 2
movementStepEY = -15
movementStepP = 5

screen = Screen()
screen.bgcolor("black")
screen.title("Space Invaders")

borderPen = Turtle(visible=False)
borderPen.speed("fastest")
borderPen.color("white")
borderPen.pensize(3)

borderPen.penup()
borderPen.setposition(-400, -400)
borderPen.pendown()

for _ in range(4):
    borderPen.forward(800)
    borderPen.left(90)

player = Turtle("triangle")
player.speed("fastest")
player.setheading(90)
player.color("blue")
player.penup()
player.setposition(0, -350)

enemy = Turtle("circle")
enemy.speed("fastest")
enemy.color("red")
enemy.penup()
enemy.setposition(-300, 250)

screen.onkeypress(move_left, "Left")
screen.onkeypress(move_right, "Right")
screen.listen()

new_y = 250

move_enemy()

screen.mainloop()

print("-------PROGRAM TERMINATED INTENTIONALLY-------")

С этим изменением консоль показывает:

> python3 test.py
------------Space Invaders - Python------------
-------------GAME NOT YET COMPLETED------------
This console is simply a status readout.
-------PROGRAM TERMINATED INTENTIONALLY-------
>

Даже когдаВы закрываете окно, пока противник находится в движении.

...