Игра Пинг-понг

Kim Jon

Новичок
Пользователь
Авг 1, 2021
16
0
1
1. Операционная система - Windows 10
2. PyCharm 2020.1 на компиляторе 3.8
3. Библиотеки Random, Tkinter и Time
Здравствуйте друзья!
И снова обращаюсь к Вам за помощью. Опять с книги пишу пример программы под названием: "Прыг-скок", Все работает но только при закрытии окна,компилятор выдает вот такую ошибку (скриншот ниже)
prigskok_eror.png
На этот раз я перепроверил всю табуляцию несметное количество раз Отступы синтаксис и.т.д. и снова не могу понять на что грешить. вроде все сделано правильно по логике вещей она не должна ругаться на функцию: "draw"
Также выкладываю листинг программы:

Python:
import random
from tkinter import *
import time

class Ball:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-3, -2, -1, 1, 2, 3]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()

    def draw(self):
        self.canvas.move(self.id, self.x, self.y)
        pos = self.canvas.coords(self.id)
        if pos[1] <= 0:
            self.y = 1
        if pos[3] >= self.canvas_height:
            self.y = -1

tk = Tk()
tk.title("Игра")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, height=500, width=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

ball = Ball(canvas, 'red')

while 1:
    ball.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

tk.mainloop()

Заранее благодарю Вас за помощь!
.
 

Вложения

  • prigskok_eror.png
    prigskok_eror.png
    31,9 КБ · Просмотры: 1

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
460
83
это происходит, потому что при закрытии окна все виджеты уничтожаються, а вы пытаетесь к ним обратиться...
вы можете определить, должен ли цикл while останавливаться в обработчике события кнопки закрытия окна...
например так
Python:
import random
from tkinter import *
import time


class Ball:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-3, -2, -1, 1, 2, 3]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()

    def draw(self):
        self.canvas.move(self.id, self.x, self.y)
        pos = self.canvas.coords(self.id)
        if pos[1] <= 0:
            self.y = 1
        if pos[3] >= self.canvas_height:
            self.y = -1


tk = Tk()
tk.title("Игра")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, height=500, width=400, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

ball = Ball(canvas, 'red')


def handler():
    global run
    run = False


tk.protocol("WM_DELETE_WINDOW", handler)
run = True

while run:
    ball.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

# tk.mainloop()
tk.destroy()
 

Kim Jon

Новичок
Пользователь
Авг 1, 2021
16
0
1
Теперь когда я хочу закрыть окно оно не закрывается
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
460
83
Не может быть, у меня закрывается, у вас нет....

Win 10 нет под рукой нет, попробовать не могу, на win 7 работает...
 

Kim Jon

Новичок
Пользователь
Авг 1, 2021
16
0
1
А есть другие варианты решения данной задачи?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
460
83
А есть другие варианты решения данной задачи?
на win 10 тоже работает...
 

Kim Jon

Новичок
Пользователь
Авг 1, 2021
16
0
1
Тогда подскажите пожалуйста что нужно посмотреть в PyCharm? Может причина в нем.....
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
460
83
Запустите без пайчарма...
Дело в коде...
Покажите код, который вы запускаете...
 
Последнее редактирование:

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