_tkinter.TclError:命令名称无效" .14574424"

时间:2017-05-03 15:28:07

标签: python tkinter tkinter-canvas

我收到以下错误:

  

_tkinter.TclError:命令名称无效“.14574424”

我无法理解错误。我做错了什么?

# Import tkinter
from tkinter import *

class AnimationDemo:
    def __init__(self):
        window = Tk()       # Create a window
        window.title("Animation Demo")      # Set a title

        width = 250         # Width of the canvas
        canvas = Canvas(window, bg = "white", width = 250, height = 50)
        canvas.pack()

        x = 0           # Starting x position
        canvas.create_text(x, 30, text = "Message moving?", tags = "text")

        dx = 3
        while True:
            canvas.move("text", dx, 0)      # Move text dx unit
            canvas.after(100)           # Sleep for 100 milliseconds
            canvas.update()         # Update canvas
            if x < width:
                x += dx         # Get the current position for string
            else:
                x = 0       # Reset string position to the beginning
                canvas.delete("text")
                # Redraw text at the beginning
                canvas.create_text(x, 30, text = "Message moving?", tags = "text")
        window.mainloop()       # Create an event loop

AnimationDemo()     # Create GUI

1 个答案:

答案 0 :(得分:1)

正如Bryan所提到的,不是使用while循环,而是尝试使用.after()方法直接为文本制作动画:

import tkinter as tk

class AnimationDemo:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title("Animation Demo")

        # Create a canvas
        self.width = 250
        self.canvas = tk.Canvas(self.window, bg="white", width=self.width, 
                             height=50)
        self.canvas.pack()

        # Create a text on the canvas
        self.x = 0
        self.canvas.create_text(self.x, 30, text = "Message moving?", tags="text")
        self.dx = 3

        # Start animation & launch GUI
        self.animate_text()
        self.window.mainloop()

    def animate_text(self):
        # Move text dx unit
        self.canvas.move("text", self.dx, 0)
        if self.x < self.width:
            # Get the current position for string
            self.x += self.dx
        else:
            # Reset string position to the beginning
            self.x = 0
            self.canvas.delete("text")
            self.canvas.create_text(self.x, 30, text = "Message moving?", tags="text")
        self.window.after(100, self.animate_text)

# Create GUI
AnimationDemo()