2014-06-24 113 views
1

我已经在python编码之前,但我还没有用过tkinter很多。我写了这段代码,我找不出为什么它不工作。我检查了互联网,但没有发现任何东西。这已经发生过,但不幸的是我找不到该程序。Tkinter画布部件

这是代码

from tkinter import * 
import time 
import threading 
import random 
C = Canvas() 
class ball(threading.Thread): 
    def run(self): 
     x = 1 
     y = 1 
     ball = C.create_oval(0,0,10,10,fill = "Green") 
     C.pack() 
     while True: 
      C.move(ball,x,y) 
      C.update() 
      time.sleep(0.03) 
      if C.coords(ball)[0] > 200: 
       x = x - random.randint(1,2) 
       if x > 2: 
        x = 2 
       elif x < -2: 
        x = -2 
      if C.coords(ball)[1] > 200: 
       y = y - random.randint(1,2) 
       if y > 2: 
        y = 2 
       elif y < -2: 
        y = -2 
      if C.coords(ball)[0] < 0: 
       x = x + random.randint(1,2) 
       if x > 2: 
        x = 2 
       elif x < -2: 
        x = -2 
      if C.coords(ball)[1] < 0: 
       y = y + random.randint(1,2) 
       if y > 2: 
        y = 2 
       elif y < -2: 
        y = -2 



for i in range(3): 
    class Child(ball): 
     pass 
    childball = Child() 
    childball.start() 
    time.sleep(1) 

它使每次返回不同的错误,例如

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "C:\Python33\lib\threading.py", line 901, in _bootstrap_inner 
    self.run() 
    File "C:/Python33/Game.py", line 35, in run 
    if C.coords(ball)[0] < 0: 
    File "C:\Python33\lib\tkinter\__init__.py", line 2299, in coords 
    self.tk.call((self._w, 'coords') + args))] 
_tkinter.TclError: bad option "35.0 34.0 45.0 44.0": must be addtag, bbox, bind, canvasx, canvasy, cget, configure, coords, create, dchars, delete, dtag, find, focus, gettags, icursor, index, insert, itemcget, itemconfigure, lower, move, postscript, raise, scale, scan, select, type, xview, or yview 

Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "C:\Python33\lib\threading.py", line 901, in _bootstrap_inner 
    self.run() 
    File "C:/Python33/Game.py", line 23, in run 
    if C.coords(ball)[0] > 200: 
    File "C:\Python33\lib\tkinter\__init__.py", line 2299, in coords 
    self.tk.call((self._w, 'coords') + args))] 
_tkinter.TclError: invalid command name "89.0 49.0 99.0 59.0" 

Exception in thread Thread-3: 
Traceback (most recent call last): 
    File "C:\Python33\lib\threading.py", line 901, in _bootstrap_inner 
    self.run() 
    File "C:/Python33/Game.py", line 23, in run 
    if C.coords(ball)[0] > 200: 
    File "C:\Python33\lib\tkinter\__init__.py", line 2299, in coords 
    self.tk.call((self._w, 'coords') + args))] 
    File "C:\Python33\lib\tkinter\__init__.py", line 2297, in <listcomp> 
    return [getdouble(x) for x in 
ValueError: could not convert string to float: 'coords' 

谁能帮助。

回答

0

除了创建窗口小部件的任何线程外,您都无法访问tkinter窗口小部件 - tkinter不能用于多线程。

如果你只是在做简单的动画,你不需要线程。 This answer给出了一个用tkinter的after方法做动画的例子。