Получаю ошибку Traceback (most recent call last): File "D:\python\Охотник за пузырями.py", line 55, in <module> move_bubbles() File "D:\python

Иван python

Новичок
Пользователь
Июн 3, 2021
14
0
1
Система windows 10
версия python 3.3.3
Вот код
Python:
from tkinter import *
HEIGHT = 500
WIDTH = 800
window = Tk()
window.title('Bubble Blaster')
c = Canvas(window, width=WIDTH, height=HEIGHT, bg='darkblue')
c.pack()
ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red')
ship_id2 = c.create_oval(0, 0, 30, 30, outline='red')
SHIP_R = 15
MID_X = WIDTH / 2
MID_Y =HEIGHT / 2
c.move(ship_id, MID_X, MID_Y)
c.move(ship_id2, MID_X, MID_Y)
SHIP_SPD = 10
def move_ship(event):
    if event.keysym == 'Up':
        c.move(ship_id, 0, -SHIP_SPD)
        c.move(ship_id2, 0, -SHIP_SPD)
    elif event.keysym == 'Down':
        c.move(ship_id, 0, SHIP_SPD)
        c.move(ship_id2, 0, SHIP_SPD)
    elif event.keysym == 'Left':
        c.move(ship_id, -SHIP_SPD, 0)
        c.move(ship_id2, -SHIP_SPD, 0)
    elif event.keysym == 'Right':
        c.move(ship_id, SHIP_SPD, 0)
        c.move(ship_id2, SHIP_SPD, 0)
c.bind_all('<Key>', move_ship)
from random import randint
bub_id = list()
bub_r = list()
bub_speed = list()
MIN_BUB_R = 10
MAX_BUB_R = 30
MAX_BUB_SPD = 10
GAP = 100
def create_bubble():
    x = WIDTH + GAP
    y = randint(0, HEIGHT)
    r = randint(MIN_BUB_R, MAX_BUB_R)
    id1 = c.create_oval(x - r, y - r, x + r, y + r, outline='white')
    bub_id.append(id1)
    bub_r.append(r)
    bub_speed.append(randint(1, MAX_BUB_SPD))
def move_bubbles():
    for i in range(len(bub_id)):
        c.move(bub_id[i], -bub_speed[i], 0)
from time import sleep, time
BUB_CHANCE = 10
#MAIN GAME LOOP
while True:
    if randint(1, BUB_CHANCE) == 1:
        create_bubble()
    move_bubbles()
    window.update()
    sleep(0.01)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Когда задаете вопросы про ошибки старайтесь уточнять при каких условиях они возникают.
Например, в данном случае лучше было бы назвать вопрос "Получаю ошибку при выходе из программы" или как-то подобно.
Потому что если просто скопировать и запустить ваш код, то никаких ошибок не возникает.
Что касается самой ошибки _tkinter.TclError: invalid command name ".!canvas", то она возникает из-за того, что tkinter не может найти виджет с именем .!canvas чтобы выполнить его метод move(), так как окно приложения уже закрыто и виджетов тоже уже нет.
Чтобы ошибка не возникала можно, например, в момент закрытия окна устанавливать флаг и не продолжать выполнение главного цикла программы если данный флаг установлен.
Вот пример:
Python:
from tkinter import Tk, Canvas
from random import randint
from time import sleep


HEIGHT = 500
WIDTH = 800
window = Tk()
window.title('Bubble Blaster')
c = Canvas(window, width=WIDTH, height=HEIGHT, bg='darkblue')
c.pack()
ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red')
ship_id2 = c.create_oval(0, 0, 30, 30, outline='red')
SHIP_R = 15
MID_X = WIDTH / 2
MID_Y = HEIGHT / 2
c.move(ship_id, MID_X, MID_Y)
c.move(ship_id2, MID_X, MID_Y)
SHIP_SPD = 10


def move_ship(event):
    if event.keysym == 'Up':
        c.move(ship_id, 0, -SHIP_SPD)
        c.move(ship_id2, 0, -SHIP_SPD)
    elif event.keysym == 'Down':
        c.move(ship_id, 0, SHIP_SPD)
        c.move(ship_id2, 0, SHIP_SPD)
    elif event.keysym == 'Left':
        c.move(ship_id, -SHIP_SPD, 0)
        c.move(ship_id2, -SHIP_SPD, 0)
    elif event.keysym == 'Right':
        c.move(ship_id, SHIP_SPD, 0)
        c.move(ship_id2, SHIP_SPD, 0)


c.bind_all('<Key>', move_ship)

bub_id = list()
bub_r = list()
bub_speed = list()
MIN_BUB_R = 10
MAX_BUB_R = 30
MAX_BUB_SPD = 10
GAP = 100


def create_bubble():
    x = WIDTH + GAP
    y = randint(0, HEIGHT)
    r = randint(MIN_BUB_R, MAX_BUB_R)
    id1 = c.create_oval(x - r, y - r, x + r, y + r, outline='white')
    bub_id.append(id1)
    bub_r.append(r)
    bub_speed.append(randint(1, MAX_BUB_SPD))


def move_bubbles():
    for i in range(len(bub_id)):
        c.move(bub_id[i], -bub_speed[i], 0)


BUB_CHANCE = 10

# флаг закрытия окна
exitFlag = False


# функция, устанавливающая флаг
def on_quit():
    global exitFlag
    exitFlag = True
    window.destroy()


# привязка функции к событию закрытия окна
window.protocol("WM_DELETE_WINDOW", on_quit)


# MAIN GAME LOOP
while True:
    # проверка, если флаг установлен, то завершаем программу
    if exitFlag:
        break
    else:
        if randint(1, BUB_CHANCE) == 1:
            create_bubble()

        move_bubbles()
        window.update()
        sleep(0.01)
 
  • Мне нравится
Реакции: Иван python

Иван python

Новичок
Пользователь
Июн 3, 2021
14
0
1
Спасибо ошибка не появляется!
 

Форум IT Специалистов