0

次のコードに問題があり (私は Python 関連のほとんどのことで初心者です)、この意味で「自己」を使用する方法がわかりません。開始ボタンがクリックされたときに、作成したエントリ ボックスに指定された値を取得したいだけです (if ステートメントに応じてボックスの数が異なることに注意してください)。

ただし、「自己」が定義されていないなどのエラーが発生します。私が作成したループを保持し、すべての値を取得する方法はありますか、またはこれを書く簡単な方法はありますか?

def ChBox(self, ch):

    column = 0
    if ch == "List":
        i = [0, 1, 2, 3]

        for i in i:
            ch_title = Label(ch_frame, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=0)
            ch_title.grid(row=0, column=column+i, sticky="nsew", padx=1, pady=1)

            self.box = Entry(ch_frame, bg='white', borderwidth=0, width=0)
            self.box.grid(row=1, column=column+i, sticky="ew", padx=1, pady=1)

    elif ch == "Inter":
        i = [0, 1]
        ch_title1 = Label(ch_frame, text='Min Value', bg='white', borderwidth=0, width=0)
        ch_title1.grid(row=0, column=column, sticky="nsew", padx=1, pady=1)
        ch_title2 = Label(ch_frame, text='Max Value', bg='white', borderwidth=0, width=0)
        ch_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1)
        for i in i:
            self.box = Entry(ch_frame, bg='white', borderwidth=0, width=0)
            self.box.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1)

def StartBut(self):
    value = self.box.get()

but1 = Button(frame_but, text='Start', command =StartBut(self))

更新:実際に私がやりたいのは、可能であればクラスや自己を使用せずにボックスの値を返すことですか? クラスや自己などをコードに導入すると、すべてを書き直すのに時間がかかりすぎるのではないかと心配しています..

4

2 に答える 2

1

selfクラス内でのみ意味があります。これは、クラスの「現在の」インスタンス、つまり実際に作業しているインスタンスを参照する従来の方法です。クラスの外では、通常のパラメーター名を使用するだけです。

Button関数がクラスのメソッドであることが理にかなっているのかどうかはわかりません。Buttonそれ以外の場合は、インスタンスを各関数に明示的に渡す必要があります。

for i in i(また、まったく意味がないことにも注意してください。繰り返し処理しているリストと同じものをイテレータと呼ぶことはできません。そうするfor x in iか、さらに良いことですfor x in range(4)。)

于 2012-06-26T07:02:46.157 に答える
1

わかりました、コメントを読んで、Buttonここのクラスが tkinter からのものであることに気付きました。これにより、質問の性質が少し変わります。

コンストラクターのcommand引数は、引数のButtonない callable です。つまり、関数を渡すだけでは、実際にはその関数に引数を渡すことはできません。したがって、その関数が but1 インスタンスにアクセスできるようにする場合は、別のことを行う必要があります。

1 つのことは、すべてをクラスにラップすることです。たとえば、次のようになります。

class MyButton(object):
  def __init__(self, frame_but, text):
    self.but = Button(frame_but, text, command=self.StartBut)

  def StartBut(self):
    value = self.but.box.get()

これはすべて、何を達成しようとしているのか、どのように設計しているかによって異なります。

また、ChBox 関数が何を達成しようとしているのかわかりません。

古い答え

Python では、「self」は通常、クラス メソッドに使用される引数名です。

たとえば、次のような場合:

class Foo(object):
  def echo(self, a):
    return a

次に、次のように記述します。

f = Foo()
f.echo(2)

への呼び出しはf.echo(2)、 のようなものに変換されるFoo.echo(f, 2)ため、インスタンスfは最初の引数になり、したがって にバインドされself、2 は にバインドされる 2 番目の引数になりaます。実際、実際に呼び出すことFoo.echo(f, 2)ができ、 とまったく同じことを行いf.echo(2)ます。

あなたのButtonクラスが何をしているのかわかりませんが、次のようなことをするとします:

class Button(object):
  ...
  def hit(self):
    self.command()

そして、達成したいのは、現在のButtonインスタンスをコマンドに渡すことです。代わりに次のように記述してください。

class Button(object):
  ...
  def hit(self):
    self.command(self)

インスタンスを構築するとき:

but1 = Button(frame_but, text='Start', command =StartBut)

self通常はメソッドの最初の引数としてのみ使用されるため、おそらく StartBut の引数の名前も変更する必要があります。

def StartBut(button):
  value = button.box.get()

サイドノート

それを理解することは、多くの Python セマンティクスを理解するのに大いに役立ちますinstance.method(args)Class.method(instance, args)

たとえば、Python でリストを結合して文字列にする方法を学ぶとき、よく目にするのは' '.join(["hello", "world"]). 多くの初心者はこれを混乱させ、python の一貫性のない構文について不満を漏らします。しかし、実際には、これは python の残りの部分と非常に一致しています。実行しているのは を呼び出すことだけstr.join(' ', ["hello", "world"])であり、これは他の言語で見られるおなじみの結合形式に似ているはずです。' '.join(["hello", "world"])このメソッドを呼び出す Pythonic な方法です。

于 2012-06-26T07:09:11.553 に答える