【问题标题】:tkinter canvas not updating colortkinter 画布不更新颜色
【发布时间】:2012-12-03 12:35:25
【问题描述】:

我在画布上画了一个椭圆形,效果很好,它也显示为红色,并且循环运行良好,因为我可以看到打印。它应该每 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)

【问题讨论】:

  • 您是否意识到每一秒您都在创建一个全新的画布而不删除之前的画布?这是故意的吗?

标签: python tkinter


【解决方案1】:

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

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

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

【讨论】:

  • 但这与我的更新几乎相同:-/仅在一次调用 draw_light 后才绘制画布,然后一遍又一遍地调用 change_light。不过还是谢谢!
  • 我想解释为什么您的原始代码不起作用,而接受的答案(在我写答案的时候)没有起作用。我尝试在我的大多数答案中包含一个工作示例,以便它们尽可能有用。
  • 这非常有效,除非对象是弧形,在这种情况下 self.canvas.itemconfig("light", fill="blue") 需要是 self.canvas.itemconfig("light", fill="blue", outline='blue")。 YMMV
【解决方案2】:

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

尝试使用find_withtag 获取所有标记为“light”的项目,然后在其上使用itemconfig

您还应该注意 Bryan Oakley 所说的话。现在,您每次都在创建一个新的画布和椭圆形。最好将此方法的前三行放在其他不再重复的地方。

【讨论】:

  • @Junuxx:你说的是假的——itemconfig 绝对可以带标签。
  • @BryanOakley:我的立场是正确的; itemconfig 需要一个 item specifier,它可以是项目句柄、标签、tk.ALL 或 tk.CURRENT。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多