2012-12-03 6 views
1

타원을 캔버스에 그려 넣으면 완벽하게 작동합니다. 빨간색으로 표시되고 루프도 잘 실행되어 인쇄물을 볼 수 있습니다. 그것도 1000ms 색상을 변경하기로되어 있습니다. 그러나 그것의 색깔을 바꾸지 않는가? UPDATE tkinter 캔버스가 색상을 업데이트하지 않습니다.

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) 

는 여전히 빨간색 캔버스가 잘못 itemconfig를 사용하는

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) 
+1

이전에 만든 이미지를 삭제하지 않고 새로운 캔버스를 만들 때마다 초인지 알고 계십니까? 그게 의도적 인거야? –

답변

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

하지만 그게 내 업데이 트가 거의 똑같은 sa :// 캔버스는 draw_light가 한 번 호출 된 후에 만 ​​그려지고 change_light 만 반복해서 호출됩니다. 어쨌든 고마워! – dave

+1

원래 코드가 작동하지 않는 이유를 설명하고 싶습니다. 허용 된 대답 (대답을 작성한 당시)이하지 않았습니다. 가능한 대부분 유용하도록 실습 예제를 대부분의 답변에 포함하려고합니다. –

+0

브라이언에게 감사드립니다. – dave

0

됐죠 생성 제안에 코드를 변경; 그것은 태그가 아니라 항목을 취합니다.

find_withtag "light"라는 태그가있는 모든 항목을 얻으려면 itemconfig을 사용하십시오.

브라이언 오클리 (Bryan Oakley)의 말에 유의해야합니다. 지금은 매번 새로운 캔버스와 타원형을 만들고 있습니다. 이 방법의 처음 세 줄은 반복되지 않는 곳에 배치하는 것이 좋습니다.

+0

괜찮습니다! 작품 ^^ – dave

+0

@Junuxx : 당신이 말하는 것은 거짓입니다 - itemconfig는 절대적으로 태그를 취할 수 있습니다. –

+0

@BryanOakley : 나는 고쳐 놨다. itemconfig는 항목 핸들러, 태그, tk.ALL 또는 tk.CURRENT 일 수있는 * 항목 지정자 *를 필요로합니다. – Junuxx

관련 문제