私は、単に出力を出力するよりも意味のあるコールバック関数を実装する方法を正確に把握しようとしています。私はかなり経験が不十分なので、コールバック関数をPython(あるいは他の言語でもどうやって実装すべきか、または実装できるかはわかりません)。Tkinterトレースに関連するコールバック関数の制限はありますか?
は、次のPythonコードを考えてみましょう:
from Tkinter import *
def callbackfunc(*args):
print "Hello World!"
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
optionvalue = IntVar(master)
optionvalue.set(2)
optionvalue.trace("w", callbackfunc)
self.optionmenu = OptionMenu(master, optionvalue, 1, 2, 3, 4)
self.optionmenu.pack()
私はより具体的に---その選択した値が変更されたとき、私のコールバック関数は意味のある何かをするようなオプションメニュー(Tkinterのウィジェット)を実装しようとしています、プログラムのどこかで定義されたグローバル変数の値が変更されます。上に実装されているように、それは単に出力を出力します(ただし正常に終了しました)。
コールバック関数にパラメータを渡す方法がわかりません。私はこの特定のコールバック関数が何も返さないようにしたい。しかし、私は自分のコールバック関数が何かを返すようにする方法と、残りのプログラムを実装して、返された結果を利用できるようにする方法について興味があります。実装しようとしていない方法でPythonコールバック関数を実装しようとしていますか?そうでない場合は、どうすればこの問題を解決できますか?
あなたは正しいです、私は完璧な意味を持っていません。私はあなたの最初の例で "** kwargs"で渡したものである "追加の"パラメータを言うつもりでした。しかし、トレース内でパラメータを渡す方法についても混乱しました( "w"を書くと、callbackfunc)。コールバック機能には何も渡せません。 – nairware
@nairwareの場合、コールバック関数に何も渡すことはできません。なぜなら、あなたは関数をコールしていないからです。それはコールバックです。これは、_Tkinter_だけがそれを呼び出すことを意味し、上記のものだけを渡します。 '** kwargs'は「追加パラメータ」ではなく、' * args'のキーワードバージョンです(つまり、位置引数ではなくキーワードを受け入れます)(http://stackoverflow.com/questions/1419046/python-さらに、 '* args'を使用すると、(Tkinterによって)スローされるすべての「追加パラメータ」を受け入れるようになります。 – senderle
@nairware、あなたが何をするか、おそらく何をするかは、関数を返す関数を作成し、その関数にパラメータを渡し、返された関数をコールバックとして渡します。それがしたいことがあれば教えてください。 – senderle