4

私は単純な雑学ゲームに Tkinter を使用しています。回答ごとに 1 つずつ、いくつかのボタンがあり、クリックされたときに特定のパラメーターを指定して checkAnswer 関数を実行したいと考えています。

次のようなものを使用した場合:

self.option1 = Button(frame, text="1842", command=self.checkAnswer(question=3, answer=2))

次に、checkAnswer を実行し、返されたもの (何もない) を使用します。

ボタン コンストラクターにパラメーターを格納する簡単な方法はありますか?

4

5 に答える 5

15

これはまさにそのようfunctools.partial()に設計されたものです。

>>> import functools
>>> print_with_hello = functools.partial(print, "Hello")
>>> print_with_hello("World")
Hello World
>>> print_with_hello()
Hello

partial()古い関数と同じように動作する新しい関数を返しますが、渡した引数はすべて入力されているため、次のようになります。

import functools

...

self.option1 = Button(frame, text="1842", command=functools.partial(self.checkAnswer, question=3, answer=2))
于 2012-05-21T21:34:05.713 に答える
2

関数をラップする高次関数を作成できますcheckAnswer。これにより、パラメーターを必要としない関数を返すことができるため、コールバックとして使用できます。

例えば:

def makeCheckAnswer(self, **kwargs)
    return lambda: self.checkAnswer(**kwargs)

これにより、ボタンの初期化が行われます。

self.option1 = Button(frame, text="1842", command=self.makeCheckAnswer(question=3, answer=2))
于 2012-05-21T21:17:21.157 に答える
1

はるかに簡単なのは、ラムダを代わりに使用することです

self.option1 = Button(frame, text="1842", 
    command=lambda: self.checkAnswer(question=3, answer=2))

ただし、同様の、しかしもう少し複雑なケースでは、実際には次のような関数ファクトリを使用する必要があります。

def answerCheckerFactory(self, question, answer):
    def checker():
        return self.checkAnswer(question, answer)

    return checker

    ...
    self.option1 = Button(frame, text="1842", 
        command=self.answerCheckerFactory(question=3, answer=2))

quetsion正しい引数(たとえば(原文のまま)ではない)を確実に渡すためです。functools.partial関数の引数を誤って入力し、ボタンをクリックした場合にのみ例外を取得できる違いに注意してください;)

また、ボタンコードに質問/回答をハードコーディングするのは正しくないようです...

于 2012-05-21T22:28:50.647 に答える
0

特定のパラメーターを持つ関数 ( などに依存しない関数text.get()) がある場合は、ラッパーを使用できます。これは、ラムダ関数以外でこれを行う最も簡単な方法です。例えば:

def option1wrapper():
    ClassName.checkAnswer(question=3,answer=2)
self.option1 = Button(frame, text="1842", command=option1wrapper)
于 2012-05-21T21:08:59.760 に答える