Форум сайта python.su
Доброго времени суток друзья!!!
Помогите найти мою ошибку, а то я уже который день ломаю на дней голову.
Суть проблемы в следующем при закрытии программы PyCharm версий 2020.1,Выдает следующую ошибку:
C:\ForChildrens\Scripts\python.exe CUsers/mikki/PycharmProjects/ForChildrens/PaddleBall.py
Traceback (most recent call last):
File “C:\Users\mikki\PycharmProjects\ForChildrens\PaddleBall.py”, line 28, in <module>
ball.draw()
File “C:\Users\mikki\PycharmProjects\ForChildrens\PaddleBall.py”, line 10, in draw
self.canvas.move(self.id, 0, -1)
File “C:\Users\mikki\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py”, line 2917, in move
self.tk.call((self._w, ‘move’) + args)
_tkinter.TclError: invalid command name “.!canvas”
Process finished with exit code 1
from tkinter import * import random 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) def draw(self): self.canvas.move(self.id, 0, -1) tk = Tk() tk.title('Игра') tk.resizable(0, 0) tk.wm_attributes('-topmost', 1) canvas = Canvas(tk, width=500, height=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 1: ball.draw() tk.update_idletasks() tk.update() time.sleep(0.01) tk.mainloop() tk.destroy()
Отредактировано KImJon (Сен. 22, 2021 11:14:18)
Офлайн
в ГУИ программах нельзя слипать поток
https://realpython.com/python-sleep/#adding-a-python-sleep-call-with-guis
Офлайн
Простите не понял при чем здесь задержка?
Офлайн
можно по подробнее
Офлайн
KImJonЗадайтесь вопросом, как так получается, что в графическом приложении отдельные его части работают одновременно? В одной части окна у вас бегущая строка с каким-то текстом, в другом прогрессбар крутится, в третьем вы текст набираете, а при этом у вас еще курсор мыши по окну бегает и на все подряд можно нажимать и там еще звуки воспроизводятся, менюшки выпадают и пр. И что характерно, пока выпадает менюшка, прогрессбар продолжает крутиться, а курсор мигать. Сравните это с консольной программой. Вы выводите что-то на экран с помощью print, и пока этот вывод не закончится, программа не переходит на новую строку, она выполняется строго последовательно. Дело в том, что ГУИ программы устроены гораздо сложнее, чем это кажется. Вот этой строкой
Простите не понял при чем здесь задержка?
tk.mainloop()
Офлайн
KImJonЗадержка не при чём, проблема в вызове ball.draw() в цикле while 1: (ну и задержка там до кучи)
Простите не понял при чем здесь задержка?
from tkinter import * import random 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) def draw(self): self.canvas.move(self.id, 0, -1) def move_ball(obj): obj.draw() tk.after(10, lambda: move_ball(obj)) tk = Tk() tk.title('Игра') tk.resizable(0, 0) tk.wm_attributes('-topmost', 1) canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0) canvas.pack() tk.update() ball = Ball(canvas, 'red') move_ball(ball) # def handler(): # global run # run = False # tk.protocol("WM_DELETE_ WINDOW", handler) # run = True # while 1: # ball.draw() # tk.update_idletasks() # tk.update() # time.sleep(0.01) tk.mainloop() # tk.destroy()
Офлайн