2014-06-24 111 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方法做動畫的例子。