我画了一个椭圆形到一个画布,它完美的工作也显示红色,循环也很好,因为我可以看到打印。它应该改变颜色1000ms。但它没有改变颜色?
def draw_light(self):
w = tk.Canvas(self.frame_Light)
w.pack()
w.create_oval(10, 10, 30, 30, fill="yellow", tags="light")
if self.light_on:
w.itemconfig("light", fill="blue")
self.light_on = False
print "on"
else:
w.itemconfig("light", fill="red")
self.light_on = True
print "of"
self.app.after(1000, self.draw_light)
的更新 的 将代码更改为您的建议仍然只生成红色画布
def draw_light(self):
self.ligth_canvas = tk.Canvas(self.frame_Light)
self.ligth_canvas.pack()
self.ligth_canvas.create_oval(10, 10, 30, 30, fill="yellow", tags="light")
self.app.after(0, self.change_light)
def change_light(self):
i = self.ligth_canvas.find_withtag("light")
if self.light_on:
self.ligth_canvas.itemconfig(i, fill="blue")
self.light_on = False
print "on"
else:
self.ligth_canvas.itemconfig(i, fill="red")
self.light_on = True
print "of"
self.app.after(5000, self.change_light)
答案 0 :(得分:5)
您遇到的问题是您在每次迭代时都创建了画布,并将其打包在所有其他画布的下方。当你说对象颜色没有改变时,那是因为你正在观察你创建的第一个画布;最近创建的画布的颜色正在变化,但它在屏幕外。
更改代码以创建单个画布,否则您的代码将正常工作。例如:
import Tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.frame_Light = tk.Frame(self, background="bisque")
self.frame_Light.pack(side="top", fill="both", expand=True)
self.light_on = True
self.canvas = tk.Canvas(self.frame_Light)
self.canvas.create_oval(10, 10, 30, 30, fill="yellow", tags="light")
self.canvas.pack(side="top", fill="both", expand=True)
self.draw_light()
def draw_light(self):
if self.light_on:
self.canvas.itemconfig("light", fill="blue")
self.light_on = False
print "on"
else:
self.canvas.itemconfig("light", fill="red")
self.light_on = True
print "of"
self.after(1000, self.draw_light)
app = App()
app.mainloop()
答案 1 :(得分:0)
您错误地使用了itemconfig;它需要一个项目,而不是一个标签。
尝试find_withtag将所有项目标记为“亮”,然后使用itemconfig
。
你还应该注意布莱恩奥克利所说的话。现在你每次都要创建一个新的画布和椭圆形。最好将这种方法的前三行放在别处不重复的地方。