【发布时间】:2017-07-13 01:41:09
【问题描述】:
到目前为止,每当我需要在 tkinter 画布上处理多个形状时,它们都只是形状。我用canvas.find_all() 获取他们的标签,并通过移动、调整大小等来操纵他们的几何形状。
但是我遇到了这个问题,我似乎无法像这样解决。
如果我定义了一个自己的类并将这个对象绘制到画布上,我如何跟踪画布上的所有对象,以便调用它们的方法?
假设我定义了一个Bubble 类,它在屏幕上绘制了一个气泡。每一秒后,我希望它使用他们的change_colour 方法将所有气泡的颜色更改为另一种颜色。
my_list = []
for n in range(10):
bubble = Bubble()
my_list.append(bubble)
while True:
time.sleep(1)
for item in my_list:
item.change_colour()
我可以将它附加到一个大的 'ol 列表中,然后像我在这里做的那样迭代它,但是对于有更多对象的情况,这太慢了!
这样做的正确方法是什么?
像往常一样,感谢您的帮助!
正如所指出的,time.sleep() 没有任何意义,但这不是我要解决的问题。
【问题讨论】:
-
一般来说,在你的 Tkinter 程序中使用无限循环或
sleep命令是个坏主意。窗口不会更新,用户命令也不会被注册,直到你的函数结束并且控制返回到主循环。如果您希望定期发生某些事情,请使用root.after或root.after_idle。试试看,看看你的for item in my_list方法是否真的是问题所在。 -
另外,如果您在此处共享的代码实际上不是您正在运行的代码,它只是您在认为效率太低之前考虑编写的代码:过早优化是万恶之根。除非您编写并运行它并对其进行测量,否则您无法确定代码到底有多快。
-
感谢您的建议,这不是我正在使用的实际代码。我用它来尽可能清楚地展示我的问题,但它与问题并不真正相关。但是感谢您指出这一点。
-
我正在编写的代码是一个星际模拟器,我在画布上最多可以有 1000 个项目,并且列表变得不切实际。但是,我想这应该仍然可以以某种方式进行管理,因为它们是许多基本操作
-
为什么包含 1000 个项目的列表不切实际?保留一个列表绝对是最简单的解决方案,1000 个项目完全在 python 可以处理的范围内。
标签: python object canvas tkinter