_tkinter.TclError: invalid command name “.4302957584”
Lors de la fermeture de l'python 3 programme, j'ai une drôle d'exception dans la console.
Le Python 3 code:
from tkinter import *
from random import randint
# Return a random color string in the form of #RRGGBB
def getRandomColor():
color = "#"
for j in range(6):
color += toHexChar(randint(0, 15)) # Add a random digit
return color
# Convert an integer to a single hex digit in a character
def toHexChar(hexValue):
if 0 <= hexValue <= 9:
return chr(hexValue + ord('0'))
else: # 10 <= hexValue <= 15
return chr(hexValue - 10 + ord('A'))
# Define a Ball class
class Ball:
def __init__(self):
self.x = 0 # Starting center position
self.y = 0
self.dx = 2 # Move right by default
self.dy = 2 # Move down by default
self.radius = 3
self.color = getRandomColor()
class BounceBalls:
def __init__(self):
self.ballList = [] # Create a list for balls
window = Tk()
window.title("Bouncing Balls")
### Create Canvas ###
self.width = 350
self.height = 150
self.canvas = Canvas(window, bg = "white", width = self.width, height = self.height)
self.canvas.pack()
### Create Buttons ###
frame = Frame(window)
frame.pack()
btStop = Button(frame, text = "Stop", command = self.stop)
btStop.pack(side = LEFT)
btResume = Button(frame, text = "Resume", command = self.resume)
btResume.pack(side = LEFT)
btAdd = Button(frame, text = "Add", command = self.add)
btAdd.pack(side = LEFT)
btRemove = Button(frame, text = "Remove", command = self.remove)
btRemove.pack(side = LEFT)
self.sleepTime = 20
self.isStopped = False
self.animate()
window.mainloop()
def stop(self): # Stop animation
self.isStopped = True
def resume(self):
self.isStopped = False
self.animate()
def add(self): # Add a new ball
self.ballList.append(Ball())
def remove(self):
self.ballList.pop()
def animate(self):
while not self.isStopped:
self.canvas.after(self.sleepTime)
self.canvas.update()
self.canvas.delete("ball")
for ball in self.ballList:
self.redisplayBall(ball)
def redisplayBall(self, ball):
if ball.x > self.width or ball.x < 0:
ball.dx = -ball.dx
if ball.y > self.height or ball.y < 0:
ball.dy = -ball.dy
ball.x += ball.dx
ball.y += ball.dy
self.canvas.create_oval(ball.x - ball.radius, ball.y - ball.radius, \
ball.x + ball.radius, ball.y + ball.radius, \
fill = ball.color, tags = "ball")
BounceBalls()
Voici le plein de sperme:
/Library/Frameworks/Python.framework/Versions/3.3/bin/python3 "/Users/narek_a/Dropbox/Python/PycharmProjects/Introduction to Programming/Chapter 10.py"
Traceback (most recent call last):
File "/Users/narek_a/Dropbox/Python/PycharmProjects/Introduction to Programming/Chapter 10.py", line 446, in <module>
BounceBalls()
File "/Users/narek_a/Dropbox/Python/PycharmProjects/Introduction to Programming/Chapter 10.py", line 407, in __init__
self.animate()
File "/Users/narek_a/Dropbox/Python/PycharmProjects/Introduction to Programming/Chapter 10.py", line 428, in animate
self.canvas.delete("ball")
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 2344, in delete
self.tk.call((self._w, 'delete') + args)
_tkinter.TclError: invalid command name ".4302957584"
Process finished with exit code 1
Pourquoi ces exceptions causé?
Avez-vous ce code à partir de ce livre? C'est la mauvaise façon de faire de l'animation dans Tkinter, et est de contribuer au problème. Vous pouvez effectuer une recherche dans ce site pour savoir comment animer dans Tkinter.
Oui je l'ai fait. Le livre montre l'exemple de code et vous avez juste à taper dessus.
c'est bien dommage. C'est un mauvais exemple. :-\
double possible de Obtenir tkinter.tclerror lors de la fermeture de python de la tortue avant de il terminé de dessiner
Oui je l'ai fait. Le livre montre l'exemple de code et vous avez juste à taper dessus.
c'est bien dommage. C'est un mauvais exemple. :-\
double possible de Obtenir tkinter.tclerror lors de la fermeture de python de la tortue avant de il terminé de dessiner
OriginalL'auteur narzero | 2013-04-17
Vous devez vous connecter pour publier un commentaire.
Principale de l'application de la boucle
window.mainloop
ne sera jamais exécutée sans appuyer surstop
bouton. Il est la source de votre problème. Réécriture d'animation en boucle:update
est complètement inutile dans cet exemple.OriginalL'auteur kalgasnik
Lorsque vous quittez le programme, les fenêtres sont détruits. Cette destruction qui se passe après la boucle d'événements d'avis que l'application a quitté. La voie que vous avez votre code structuré, cela se produit lorsque vous appelez
self.update()
. Immédiatement après l'appel, et après les widgets ont été détruits, ce que vous appelezself.canvas.delete("ball")
. Depuis le widget a été détruit dans la déclaration précédente, vous obtenez le message d'erreur.La raison pour laquelle l'erreur est tellement énigmatique, c'est que Tkinter est juste un wrapper autour de tcl/tk interprète. Les savoirs traditionnels widgets sont nommés avec un point, suivi par certains caractères, et le widget noms sont également des commandes tcl. Lorsque vous appelez la
delete
méthode de la toile, Tkinter, se traduit par le canevas de référence à l'intérieur des savoirs traditionnels nom du widget /tcl commande. Parce que le widget a été détruit, les savoirs traditionnels ne pas reconnaître qu'en tant que connu de commande et renvoie une erreur.La solution va vous obliger à refaire votre animation de la logique. Vous ne devriez pas avoir votre propre animation en boucle. Au lieu de cela, vous devez utiliser le Tkinter eventloop (
mainloop()
) comme votre animation en boucle. Il y a quelques exemples sur ce site pour vous montrer comment (par exemple: https://stackoverflow.com/a/11505034/7432)OriginalL'auteur Bryan Oakley