2017-08-19 7 views
0

そして聞いてくれてありがとう。そして、私の悪い英語のために申し訳ありません。 シンプルなpythonスクリプトに問題があり、私の頭を壊す方法がわかりません。引数、クラス、およびtkinterを持つPython noob

これはコードです。かなりシンプルで無駄です(私はPythonを学んでいますが、私のプログラミングスキルは虚脱しています)。私はラベルを使用する場合、問題は」が存在いけない理由を私は知らない

AttributeError: 'hello' object has no attribute 'button' 

import tkinter as tk 

class hello: 
    button_state = [0,0,0,0,0,0,0,0,0] 
    def __init__(self): 
     self.root = tk.Tk() 
     self.button = tk.Button(self.root, text=self.button_state[0], 
              command=self.check(0)) 
     self.button.pack() 
    def check(self,x): 
     if x == 0: 
      self.button_state[x] = 1 
      self.button.config(text=self.button_state[x]) 

app = hello() 
app.root.mainloop() 

とエラー。私は試してみると、私はエラーがボタンコマンドの引数の呼び出しにあったと思いますか?事前に

感謝:)

答えて

0

あなたはのinitでコマンド= self.check(0)を使用します。 check()では、self.button.configを使用します。しかし、この属性(self.button)はオブジェクトにありません。たぶん、このコードはあなたを助けます。また、あなたはクラス属性button_stateを使用ハローに - あなたはこのことを理解しておく必要がありますhttps://docs.python.org/2/tutorial/classes.html(クラス変数の#間違って使用)を参照してください、あなたのプログラムを初めて実行するとき

import Tkinter as tk 

class hello: 
    button_state = [0,0,0,0,0,0,0,0,0] 
    def __init__(self): 
     self.root = tk.Tk()   
     self.button = tk.Button(self.root, text=self.button_state[0], command=self.check(0)) 
     self.button.config(text=self.button_state[0]) 
     self.button.pack() 

    def check(self,x): 
     if x == 0: 
      self.button_state[x] = 1 

app = hello() 
app.root.mainloop() 
0

それはself.button年代によって提供される機能を実行しますコマンド。あなたはまだself.buttonをパックしていないので、その関数でそれを呼び出すとエラーがスローされます。初期自動関数呼び出しを防ぐために、lambdaを使用できます。これにより、そのself.buttonを使用するときに関数が呼び出すようになります。これに

command=self.check(0) 

command= lambda x=0: self.check(x) 


はちょうどあなたのコードのこの部分を変更します
関連する問題