0

私はPythonが初めてで、リストボックスから入力を受け取り、各エントリのラジオボタンを作成するタスクがあります。私のコードでは、ラジオ ボタンを作成できますが、クリックしても機能しません。つまり、この場合、「hello」と番号 i が出力されません。コードは次のとおりです。

def generateGraph():
    w = Toplevel(bg = "grey")
    w.resizable(0,0)
    frameData = Frame(w, bg="grey", padx=10, pady=10)
    frameData.grid(row = 0, column=0, pady = 1, padx = 1, sticky = N+E+S+W)
    InputLabel = Label(frameData, text="Inputs:", bg="grey")
    InputLabel.grid(row=1, column=0, padx=10, sticky=N+E+S+W)
    OutputLabel = Label(frameData, text="Outputs:", bg="grey")
    OutputLabel.grid(row=1, column=1, padx=10, sticky=N+E+S+W)

    i=0
    c=[]
    inputVar = IntVar()
    while(InputBox.get(i)):
        c.append(Radiobutton(frameData, text=InputBox.get(i), variable=inputVar, value = i, background="grey", command= hello(i)))
        c[i].grid(row = i+2, column = 0, sticky = W)
        i=i+1
    if makemodal:
        w.focus_set()
        w.grab_set()
        w.wait_window()
def hello(i):
    print("hello %d" %i)

助けてください、事前に感謝します。

4

1 に答える 1

1

問題は、後で呼び出されるものを保存するhello(i)のではなく、の構築時に呼び出していることです。Radiobutton

    c.append(Radiobutton(frameData, text=InputBox.get(i), variable=inputVar, value = i, background="grey", command= hello(i)))

hello返品以来None、効果的に保管していますcommand=None

それを呼び出した結果ではなく、helloそれ自体 (または または など) のlambdaように、ここに callable を格納する必要があります。partial

例えば:

    c.append(Radiobutton(frameData, text=InputBox.get(i), 
                         variable=inputVar, value = i, background="grey",
                         command=functools.partial(hello, i)))

コメントで質問したので:の値にバインドしたいので、変数 を閉じずにpartialではなくを使用したことに注意してください。そうしないと、たとえば 5 つのラジオ ボタンがすべてvalue の同じ変数にバインドされることになります。これには他にも方法があります — 明示的なファクトリを使用する、 の代わりにdo を使用するなどです。とにかく、これについて SO には何十もの質問がありますが、Scope of python lambda functions とそのパラメーターに対する答えは特に明確です。lambdaiii4lambda x=i: hello(x)lambda: hello(i)partial

于 2013-01-09T00:31:07.880 に答える