【问题标题】:tkinter: object with different movement patternstkinter:具有不同运动模式的对象
【发布时间】:2019-11-22 17:17:37
【问题描述】:

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

我的问题:

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

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

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() 方法。这就是您可以“关闭”它们的方式。要拥有可变的运动模式,您需要将其抽象为 Cube 类的属性。

标签: python class object tkinter


【解决方案1】:

如何“关闭”第一个移动模式并激活下一个?

当您调用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,它会在适当的时候自动调用。

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多