2011-04-09 172 views
0

我無法調用.update_idletasks()重繪我的畫布(在.set_up()類方法的結束)。update_idletasks難度在Python的Tkinter

如果我使用self.canv.update_idletasks(self),在畫布上繪製我想要的對象,但給出了錯誤

TypeError: update_idletasks() takes exactly 1 argument (2 given)

如果我使用self.canv.update_idletasks(),在畫布上保持空白,但不產生任何錯誤。

from Tkinter import * 


class Animation(Frame): 

def __init__(self,parent=None): 
    Frame.__init__(self,parent) 
    self.pack() 
    self.generation = 1 
    self.epoch = 1 
    self.set_up() 

def set_up(self): 
    greeting_text = 'Generation ' + str(self.generation) + ', Epoch ' + str(self.epoch) 
    header = Label(self,text=greeting_text) 
    header.pack() 

    anframe = Frame(self,relief=SUNKEN) 
    anframe.pack(side='left',padx=10,pady=10) 
    self.canv = Canvas(anframe,width=800, height=800, bg='white') # 0,0 is top left corner 
    self.canv.pack(expand=YES, fill=BOTH,side='left') 

    buframe = Frame(self,relief=RAISED) 
    buframe.pack(side='right',fill=X,padx=10,pady=5) 

    start = Button(buframe,text='START',width=10,command=self.animate) 
    start.pack(expand=YES,fill=BOTH,side='top') 
    back = Button(buframe,text='Back',width=10) 
    back.pack(expand=YES,fill=BOTH,side='bottom') 
    nextgo= Button(buframe,text='Next',width=10) 
    nextgo.pack(expand=YES,fill=BOTH,side='bottom') 

    path = 'C:/Desktop/LearnNet/' + str(self.generation) + '_' + str(self.epoch) + '.txt' 
    data = open(path,'r') 
    lines = data.readlines() 

    food,moves = [],[] 
    for item in lines: 
     if item.strip() == 'f': 
      dat_type = 1 
      continue 
     elif item.strip() == 'a': 
      dat_type = 2 
      continue 

     if dat_type == 1: 
      temp = item.strip() 
      temp = item.split() 
      food.append([int(temp[0]),int(temp[1])]) 

     if dat_type == 2: 
      temp = item.strip() 
      temp = item.split() 
      moves.append([int(temp[0]),int(temp[1]),int(temp[2])]) 

    photos = [] 
    for i in xrange(len(food)): 
     temp=PhotoImage(file='C:/Desktop/LearnNet/Food.gif') 
     photos.append(temp) 
     self.canv.create_image(food[i][0]*20,food[i][1]*20,image=photos[i],anchor=NW) 

    start_pos = moves[0] 
    picpath = self.orientation(start_pos[2]) 
    animal = PhotoImage(file=picpath) 

    self.canv.create_image(moves[0][0]*20,moves[0][1]*20,image=animal,anchor=NW) 
    self.canv.update_idletasks(self) 

def animate(self): 
    return 1 
def orientation(self,angle): 
    if angle == 0: 
     picpath = 'C:/Desktop/LearnNet/PEast.gif' 
    elif angle == 90: 
     picpath = 'C:/Desktop/LearnNet/PNorth.gif' 
    elif angle == 180: 
     picpath = 'C:/Desktop/LearnNet/PWest.gif' 
    else: 
     picpath = 'C:/Desktop/LearnNet/PSouth.gif' 

    return picpath 
if __name__ == '__main__': Animation().mainloop() 

回答

0

我通過查看一些類似的代碼找到了解決方案。 self.canv.get_tk_widgets().update_idletasks()是否有竅門,我認爲我不太清楚爲什麼這會起作用,如果有人能解釋或指向我閱讀。謝謝

1

self python實際上是語法糖。

換句話說,當你說self.animate()時,python將它翻譯爲Animation.animate(self)。這就是爲什麼用這個「自我」參數定義類方法 - 它是隱式傳遞的。

self.canv.update_idletasks(self)正在評估類似於Canvas.update_idletasks(self.canv, self)