2

私は楕円形をキャンバスに描きます。これは完璧に機能し、赤も表示され、ループも正常に実行されるため、印刷が表示されます。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)

UPDATE はコードをあなたの提案に変更しましたが、それでも赤いキャンバスだけが生成されます

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

2 に答える 2

6

あなたが抱えている問題は、すべての反復でキャンバスを作成し、それを他のすべてのキャンバスの下にパックしていることです。オブジェクトの色が変わらないと言うとき、それはあなたが最初に作成したキャンバスを観察しているからです。最近作成されたキャンバスの色が変更されていますが、画面外にあります。

コードを変更して単一のキャンバスを作成します。そうしないと、コードは問題なく機能します。例えば:

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()
于 2012-12-03T17:03:47.167 に答える
0

itemconfigを誤って使用しています。タグではなくアイテムを取ります。

find_withtagを試して、「light」とタグ付けされたすべてのアイテムを取得し、それを使用itemconfigします。

ブライアン・オークリーが言ったことにも注意を払う必要があります。現在、毎回新しいキャンバスと楕円形を作成しています。このメソッドの最初の3行は、繰り返されない場所に配置することをお勧めします。

于 2012-12-03T13:04:27.390 に答える