tkinter 画布不更新颜色



>我在画布上画了一个椭圆形,效果很好,它显示红色并且循环运行良好,因为我可以看到打印。它应该每 1000 毫秒改变一次颜色。但它不会改变颜色吗?

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)

您遇到的问题是,您在每次迭代时都会创建画布,并将其打包到所有其他画布下面。当您说对象颜色没有变化时,那是因为您正在观察您创建的第一个画布;最近创建的画布的颜色正在更改,但它不在屏幕外。

更改代码以创建单个画布,否则代码将正常工作。例如:

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()

你错误地使用了itemconfig;它需要一个项目,而不是一个标签。

尝试find_withtag将所有项目标记为"浅色",然后在其上使用itemconfig

你还应该注意布莱恩·奥克利所说的话。现在,您每次都在创建一个新的画布和椭圆形。最好将此方法的前三行放在不重复的其他位置。

最新更新