2016-04-12 8 views
1

私はtkinterでハングマンゲームを作っていますが、再起動ボタンを押したときにボタンを押して消えるようにしようとしています。私はまだコードを学習しており、コードを明確にするためにクラスを組み込むように調整しようとしました。これは私がボタンウィジェットを作成するために使用したコードです:継承の後にクラス変数を取得する

class Buttons: 

    def __init__(self, letter, column, row): 
     self.letter = letter 
     self.column = column 
     self.row = row 

    def create(self): 
     column = self.column 
     row = self.row 
     letter = self.letter 
     self = tk.Button(window, text=self.letter, bg = colour, font=FONT, 
         command=lambda : check(letter)) 
     self.place(relx=column, rely=row) 

そして私はこのようにボタンを配置し、そのすべてが正常に動作します:私はしかし、何をしたいのか

A = Buttons('A', column1, row1).create() 

は、アクセスですクラス定義の外に 'self.letter'、 'self.row'、 'self.column'がありますが、 'A.letter'を使用しようとするとオブジェクトがNonetypeであり、属性文字はありません。 トレースバック(最新の呼び出しの最後):

File "C:\Users\cameron\Documents\Python\Hangman\Hangman v2.1.py", line  227, in <module> 
    print(A.letter) 
AttributeError: 'NoneType' object has no attribute 'letter' 

誰もが、私はこれにアクセスできる方法を知っていますか?

あなたは

+0

コードで継承は使用されません。完全なトレースバックとエラーが発生したコードを(状況によって)投稿してください。 – syntonym

+0

'A'はNoneです(したがって" Buttons "ではなく、" letter "という属性もありません)。 'A'を割り当てるコードを表示します。 – syntonym

+0

Aが割り当てられたコードを含めました。A = Buttons( 'A'、column1、row1).create() –

答えて

3

あなたはselfを再割り当てする必要はありませんありがとうございました。

def create(self): 
     #column = self.column # don't need these 
     #row = self.row 
     #letter = self.letter 
     self.tkbutton = tk.Button(window, text=self.letter, bg = colour, font=FONT, command=lambda : check(letter)) 
      # Stashes the tk.Button instance away in `self.tkbutton`. 
     self.tkbutton.place(relx=self.column, rely=self.row) 

selfが同じすべての時間のまま、あなたはself = <whatever>を言うことはありません:これを試してみてください。代わりにself.<some field name> = <whatever value>を使用してください。 <some field name>には、外部からA.<some field name>とアクセスできます。より良いアプローチは、ボタンを作成し、A=Buttons(...)コールに配置され、その結果__init__createの仕事を組み合わせることかもしれませんがその後

は、

A = Buttons('A', column1, row1) # calls A.__init__() 
A.create() 
# at this point A.tkbutton exists and is accessible. 

を試してみてください、ボタンを使用します。

編集あなたがNoneTypeエラーを得た理由は、create()return文が含まれていないことです。その戻り値はNoneです。その結果、A=Buttons(...).create()None、つまりNoneTypeを返します。

+0

create()の内容が__init __ボタンはA =ボタン(...)になります。巧妙ではない、私は理解したい。 – Steve

+0

@Steve、場合によってはユースケースによって異なります。実際にあなたのコメントを入力している間、答えにそれを加えました:)。 – cxw

+0

優秀なニュース、私は私が思ったほど馬鹿ではない。 – Steve