2017-01-03 9 views
0

定期的に更新する必要があるTkinterにいくつかのフレームを作成したいと思います。ここ は、それらの上のコードです:クラスのPython属性エラー

from Tkinter import * 
import time 
import random 

class KopfFrame: 
    def __init__(self,master): 
     frame = Frame(master,bg="tan") 
     frame.pack(side=TOP,expand=YES, fill=BOTH) 
     self.ZeitLabel = Label(frame) 
     self.ZeitLabel.pack(side=RIGHT, expand=NO,ipadx=2, ipady=2) 
     self.refresh() 

    def refresh(self): 
     self.ZeitLabel.configure(text=time.strftime("%H:%M:%S")) 
     # call this function again in 5 seconds 
     #print(self) 
     self.after(5000, self.refresh) 

root = Tk() 
K = KopfFrame(root) 
root.mainloop() 

しかし、私はそれを実行すると、私はエラーを持っている:

AttributeError: KopfFrame instance has no attribute 'after' 

私は、呼び出し元の仕方が問題であることを、かなり確信しています。だから誰かが私を助けることができれば、私は機能のための良いチュートリアルのヒント、クラスの使い方に感謝するでしょう。

+0

'self.after()'に何を期待しましたか?あなたのクラスはそのメソッドを定義していません。おそらく何か* else *にそのようなメソッドがありますか? –

答えて

1

クラスのインスタンスであるselfself.after()を呼び出しようとしています。そのクラスにはそのようなメソッドが定義されていません。

おそらくFrame.after() methodに電話したかったでしょう。

class KopfFrame: 
    def __init__(self,master): 
     # make frame an attribute on self 
     self.frame = Frame(master, bg="tan") 
     self.frame.pack(side=TOP,expand=YES, fill=BOTH) 
     self.ZeitLabel = Label(self.frame) 
     self.ZeitLabel.pack(side=RIGHT, expand=NO,ipadx=2, ipady=2) 
     self.refresh() 

    def refresh(self): 
     self.ZeitLabel.configure(text=time.strftime("%H:%M:%S")) 
     # now you can reach the frame and call after on that: 
     self.frame.after(5000, self.refresh) 

私は何が変わった:

  • の代わりになってframeローカルのみ、その後、その上afterを呼び出すあなたが最初に渡すFrameオブジェクトへの参照を格納する必要がありますKopfFrame.__init__メソッドでは、selfの属性にします。

  • KopfFrame.refresh()のフレームへの参照をFrame.after()メソッドにアクセスするには、self.frameを使用してください。

+0

エラー:global name 'frame'が定義されていません – Puetong0815

+0

@ Puetong0815:修正されました。私は '__init__'メソッドで1つの' frame'リファレンスを調整するのを忘れていました。 –

+0

イェップ、そのように動作します。あなたはその種の問題をより良く説明できるチュートリアルを知っていますか?それとも、これを学ぶだけですか? – Puetong0815

関連する問題