tkinter:具有不同运动模式的对象



我正在做一个模拟,其中同一类的一些立方体随机移动。我的目标是在它们满足某些特征(例如它们的物体编号(时,给它们另一种移动模式。

我的问题:

如果它们满足特性,我如何"关闭"第一个移动模式并激活下一个?

下面是一个非常简化的模拟示例,以及它是如何不工作的:

from tkinter import *
from random import *

class Cubes:
def __init__(self, master, canvas, number, x1, y1, color):
self.master = master
self.canvas = canvas
self.number = number
self.x1 = x1
self.y1 = y1
self.x2 = x1 + 15
self.y2 = y1 + 15
self.color = color
self.rectangle = canvas.create_rectangle(x1, y1, self.x2, self.y2, fill=color)
def movement(self):
self.x = randint(-10, 10)
self.y = randint(-10, 10)
canvas.move(self.rectangle, self.x, self.y)
if self.number == 2:
def movementII(self):
canvas.move(self.rectangle, 0, 0)
self.canvas.after(100, self.movementII)
self.canvas.after(100, self.movement)

if __name__ == "__main__":
master = Tk()
canvas = Canvas(master, width=900, height=600)
canvas.pack()
master.title("Simulation")
cube = Cubes(master, canvas, 2, randint(50, 800), randint(25, 500), "black")
cube.movement()
mainloop()
如何

"关闭"第一个移动模式并激活下一个?

当您调用after时,它会返回一个唯一标识符。您可以保存该标识符,然后将其传递给after_cancel以取消作业(如果尚未运行(。

我不完全清楚你想要什么,但是如果你想在切换到新运动时关闭旧运动,它看起来像这样:

class Cubes:
def __init__(self, master, canvas, number, x1, y1, color):
...
self.after_id = None
...
def cancel(self):
if self.after_id is not None:
self.after_cancel(self.after_id)
self.after_id = None
def movement(self):
self.x = randint(-10, 10)
self.y = randint(-10, 10)
canvas.move(self.rectangle, self.x, self.y)
if self.number == 2:
def movementII(self):
canvas.move(self.rectangle, 0, 0)
self.cancel()
self.after_id = self.canvas.after(100, self.movementII)
self.after_id = self.canvas.after(100, self.movement)   

更好的方法可能是使用after调用单个方法,并且它只是调用适当的方法。

例如,像这样:

def move(self):
if self.number == 1:
self.movement_1()
elif self.number == 2:
self.movement_2()
self.canvas.after(100, self.move)
def movement_1(self):
self.x = randint(-10, 10)
self.y = randint(-10, 10)
canvas.move(self.rectangle, self.x, self.y)
def movement_2(self):
canvas.move(self.rectangle, 0, 0)

然后,要切换移动方法,只需更改self.number,它将在适当的时间自动调用。

最新更新