4

この質問に対する答えを長い間探していましたが、まだ何も見つかりませんでした。Tkinter を使用して GUI を作成しています。異なるウィジェットから情報を受け取ることを除いて、ほとんど同じことを行う 2 つのボタンがあります。1 つのボタンは Entry ウィジェット用で、もう 1 つは Listbox ウィジェット用です。これら 2 つのボタンのコールバック関数は長い (約 200 行) ため、ボタンごとに個別の関数を用意したくありません。どのボタンがクリックされたかを確認するために、このコールバック関数の先頭に if ステートメントがあり、コードは対応する値を取得します。しかし、次のコードがこれを行う正しい方法を示しているかどうかはわかりません。明らかに私のプログラムでは完全に機能しないからです。コールバック関数は初回のみ機能します。他のボタンをクリックすると、エラーが発生します。これは、アイデアを説明するために作成したサンプル コードです。ボタンがクリックされたかどうかを確認したいことに注意してください。「値」が存在するかどうかは確認したくありません。助けてください。

from Tkinter import *

root = Tk()

def DoSomething():
    # is this the right way to check which button is clicked?
    if button1:
        value = user_input.get()
    elif button2:
        value = choice.get(choice.curselection()[0])

    # then more codes that take 'value' as input.


button1 = Button(master,text='Search',command=DoSomething)
button1.pack()
button2 = Button(master,text='Search',command=DoSomething)
button2.pack()

user_input = Entry(master)
user_input.pack()
choice = Listbox(master,selectmode=SINGLE)
choice.pack()
#assume there are items in the listbox, I skipped this portion

root.mainloop()
4

1 に答える 1

6

実際のウィジェットをコールバックに渡したい場合は、次のようにできます。

button1 = Button(master, text='Search')
button1.configure(command=lambda widget=button1: DoSomething(widget))
button2 = Button(master, text='Search')
button2.configure(command=lambda widget=button2: DoSomething(widget))

もう 1 つの選択肢は、ウィジェットへの参照が本当に必要ない場合は、単純にリテラル文字列を渡すことです。

button1 = Button(..., command=lambda widget="button1": DoSomething(widget))
button2 = Button(..., command=lambda widget="button2": DoSomething(widget))

もう 1 つの選択肢は、各ボタンに固有のコールバックを与え、そのコールバックがそのボタンに固有のことだけを実行するようにすることです。

button1 = Button(..., command=ButtonOneCallback)
button2 = Button(..., command=ButtonTwoCallback)

def ButtonOneCallback():
    value = user_input.get()
    DoSomething(value)

def ButtonTwoCallback():
    value=choice.get(choice.curselection()[0])
    DoSomething(value)

def DoSomething(value):
    ...

同じ問題を解決する方法は他にもありますが、ボタン コールバックに値を渡す方法、または最初から値を渡す必要をなくす方法について、一般的な考え方が得られることを願っています。

于 2013-04-19T22:19:41.667 に答える