3 回答

TA貢獻1804條經驗 獲得超2個贊
您絕對不應在GUI程序中放入無限循環(huán)-已經有無限循環(huán)在運行。如果您希望球獨立運動,只需退出循環(huán)并讓該move_ball方法在事件循環(huán)上對其本身進行新調用。這樣,您的球將繼續(xù)永遠移動(這意味著您應該在其中進行某種檢查以防止這種情況發(fā)生)
我已通過刪除無限循環(huán),稍微減慢了動畫速度以及對它們的移動方向使用了隨機值來對您的程序進行了一些修改。所有這些更改都在move_ball方法內部。
from Tkinter import *
from random import randint
class Ball:
def __init__(self, canvas, x1, y1, x2, y2):
self.x1 = x1
self.y1 = y1
self.x2 = x2
self.y2 = y2
self.canvas = canvas
self.ball = canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill="red")
def move_ball(self):
deltax = randint(0,5)
deltay = randint(0,5)
self.canvas.move(self.ball, deltax, deltay)
self.canvas.after(50, self.move_ball)
# initialize root Window and canvas
root = Tk()
root.title("Balls")
root.resizable(False,False)
canvas = Canvas(root, width = 300, height = 300)
canvas.pack()
# create two ball objects and animate them
ball1 = Ball(canvas, 10, 10, 30, 30)
ball2 = Ball(canvas, 60, 60, 80, 80)
ball1.move_ball()
ball2.move_ball()
root.mainloop()

TA貢獻1865條經驗 獲得超7個贊
此功能似乎是罪魁禍首
def move_ball(self):
while True:
self.canvas.move(self.ball, 2, 1)
self.canvas.after(20)
self.canvas.update()
調用時,您故意將自己置于無限循環(huán)中。
ball1.move_ball() # gets called, enters infinite loop
ball2.move_ball() # never gets called, because code is stuck one line above

TA貢獻1810條經驗 獲得超4個贊
它唯一移動一個,因為程序一次只讀取一個變量。如果將程序設置為在球到達某個位置(例如畫布的末端)時讀取,則可以對程序進行編碼以讀取下一行并觸發(fā)第二個球移動。但是,這一次只能移動一個。
您的程序實際上停留在行上:
ball1.move_ball()
而且它永遠不會行:
ball2.move_ball()
因為對循環(huán)的結束位置沒有限制。
否則,“ sundar nataraj”的回答將成功。
添加回答
舉報