2013-03-16 31 views
0

我已經動態通過列表循環創造了一個按鈕:如何改變最後點擊的按鈕文本Tkinter的蟒蛇

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()更改其文本?

--------------------編輯於第一答案,現在幾乎可以正常使用------------

謝謝你的回答,我非常感謝,並使其工作幾乎完美。 有兩個缺陷,首先它會拋出一個錯誤,因爲命令ButtonClick被髮送時沒有參數,這是發送按鈕綁定命令的默認方式,所以我真的不知道如何解決這個問題。 第二個是,在使用您提供給我的代碼之後,按鈕文本將隨着您的指定而改變,但它們不會尊重先前由我定義的位置和大小。

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() 

你能告訴我如何解決這些問題嗎? 非常感謝:)

+0

編輯當前狀態的問題,謝謝 – 2013-03-16 12:09:00

+0

我已經更新了答案有更詳細的解決方案 – 2013-03-16 13:09:13

回答

1

首先,您必須將該函數綁定到事件,而不是使用command屬性。對於上的小工具左擊,刪除行

,並使用事件<Button-1>代替:

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

然後在事件處理程序,您會收到一個事件的說法。它有一個widget場,這樣你就可以觸發事件的小部件:

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

Remembar,你必須刪除AuxName['command'] = ButtonClick,因爲如果你不這樣做,ButtonClick將被執行兩次(一個他們沒有任何爭論)。

當您更改按鈕的文本時,它將修改其寬度,因爲新文本可能有不同的長度。你對於小部件的位置有一個問題是,你同時使用placepack爲幾何經理:

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

在Tkinter的,你要堅持一個幾何經理使用。在這種情況下,我建議你使用grid geometry manager,這是最簡單的使用方法:

AuxName.grid(row=x, column=y, ...) 
+0

真棒,謝謝很多,現在一切正常,我從你的答案中學到了很多東西:) – 2013-03-16 16:04:58

+0

@ user2138906不客氣,隨時接受幫助別人的答案,知道這解決了你的問題;) – 2013-03-16 16:11:53

相關問題