0

リストをループしてボタンを動的に作成しました。

AuxName = Button(GUI_1, text=List_Aux[x], font=("Arial", 10))
tk_rgb = "#%02x%02x%02x" % (0,0,0)
AuxName["fg"] = tk_rgb
tk_rgb = "#%02x%02x%02x" % (255,255,255)
AuxName["bg"] = tk_rgb
AuxName.place(x=BUTTON_LEFT_AUX1, y=BUTTON_TOP_AUX1 , height=BUTTON_HEIGTH_AUX1, width=BUTTON_WIDTH_AUX1)
AuxName["command"] = ButtonClick

各ボタンには、各ボタンが配置されている列と行である異なるAuxName値(1btn1、1btn2、1btn3など)番号があります。

私が抱えている問題はButtonClick、クリックされているボタンの名前を関数に取得させたいということです。私が最後に試したのは:

def ButtonClick():
1btn1["text"] = "Goodbye"

しかし、pythonは構文エラーをスローします(そして開き括弧の直前を指します)。

最後にクリックしたボタン名を取得し、関数を使用してそのテキストを変更するにはどうすればよいButtonClick()ですか?

--------------------最初の答えに編集し、ほぼ完全に機能するようになりました------------

答えてくれてありがとう、とても感謝していて、ほぼ完璧に動作します。2つの欠陥があります。1つは、コマンドButtonClickが引数なしで送信されるためにエラーがスローされることです。これは、ボタンバインドのコマンドを送信するデフォルトの方法であるため、修正方法がわかりません... 2つ目は、提供されたコードを使用した後、指定したとおりにボタンのテキストが変更されますが、ボタンは以前に定義した位置とサイズを尊重しません。

BUTTON_TOP_AUX1 = 20
BUTTON_WIDTH_AUX1 = 400
BUTTON_LEFT_AUX1 = 5
BUTTON_HEIGTH_AUX1 = 20
Buttons_Function = "DesiredFunctionOne"
BUTTON_COLUMN_AUX1 = 1
List_Size_Aux = len(List_Aux)
for x in range ( List_Size_Aux ):
    AuxName = str(BUTTON_COLUMN_AUX1)+'btn'+str(x)
    AuxName = Button(GUI_1, text=List_Aux[x], font=("Arial", 10))
    tk_rgb = "#%02x%02x%02x" % (0,0,0)
    AuxName["fg"] = tk_rgb
    tk_rgb = "#%02x%02x%02x" % (255,255,255)
    AuxName["bg"] = tk_rgb
    AuxName.place(x=BUTTON_LEFT_AUX1, y=BUTTON_TOP_AUX1 , height=BUTTON_HEIGTH_AUX1, width=BUTTON_WIDTH_AUX1)
    AuxName["command"] = ButtonClick
    BUTTON_TOP_AUX1 = BUTTON_HEIGTH_AUX1+BUTTON_TOP_AUX1
    AuxName.bind("<Button-1>", ButtonClick)
    AuxName.pack()

それらを修正する方法を教えてください。非常に感謝します:)

4

1 に答える 1

1

commandまず、属性を使用する代わりに、関数をイベントにバインドする必要があります。ウィジェットを左クリックするには、行を削除します

<Button-1>代わりにイベントを使用します。

AuxName.bind("<Button-1>", ButtonClick)

次に、イベント ハンドラでイベント引数を受け取ります。フィールドがwidgetあるため、イベントをトリガーしたウィジェットを取得できます。

def ButtonClick(event):
    event.widget['text'] = 'Goodbye'

を削除する必要があることを思い出してくださいAuxName['command'] = ButtonClick。そうしないと、ButtonClickが 2 回実行されます (そのうちの 1 回は引数なしで実行されます)。

ボタンのテキストを変更すると、新しいテキストの長さが異なる可能性があるため、幅も変更されます。ウィジェットの位置に関する問題の 1 つは、 と の両方をジオメトリ マネージャーとして使用していることplaceですpack

AuxName.place(...)
# ...
AuxName.pack()

Tkinter では、一貫して 1 つのジオメトリ マネージャーを使用する必要があります。この場合、最も使いやすいグリッド ジオメトリ マネージャーを使用することをお勧めします。

AuxName.grid(row=x, column=y, ...)
于 2013-03-16T01:50:13.883 に答える