2015-12-14 88 views
0

我想了解如何獲取作爲canvas.window()項目一部分的button小部件,以更改其屬性。Tkinter:如何獲取canvas.window中的按鈕()

button1 = Button(self, text = "Quit", command = self.quit, anchor = W) 
button1.configure(width = 10, activebackground = "#33B5E5", relief = FLAT) 
button1_window = canvas1.create_window(10, 10, anchor=NW, window=button1) 

在上面的代碼片段中,您可以看到我在窗口中嵌入了一個按鈕。然後,我將這個窗口嵌入到canvas

現在,當用戶點擊button1_window項目時,我想要控制該窗口內的按鈕,然後更改其屬性,例如,邊框的大小/顏色。

+0

。你應該可以用'self.button1 = ...'使'button1'成爲一個實例屬性,然後在類中的任何地方輕鬆地引用它。 – TigerhawkT3

+0

該代碼段不是我實際程序的一部分。在我的程序中,用戶可以選擇在畫布上創建多個窗口(基本上是圖標),並在他喜歡的時候刪除它們。我不想跟蹤創建/刪除窗口/按鈕。每當用戶點擊一個窗口(一個圖標)時,我想控制它內部的按鈕並更改其屬性。 – HaggarTheHorrible

+0

在這種情況下,您是否可以編輯您的問題以提供我們可以使用的[MCVE](http://stackoverflow.com/help/mcve)? – TigerhawkT3

回答

2

我想控制該窗口內的按鈕,然後 更改其屬性,例如,邊框的大小/顏色。

如果bind()到一個按鈕的功能,點擊該按鈕,然後Tkinter的時候將通過一個event object作爲參數傳遞給函數。 event object有一個widget屬性,它將成爲被點擊的按鈕。這裏是你可以做什麼的例子:我看你有沒有`self`出現,意味着一個標準的面向對象的Tkinter應用

import tkinter as tk 

class MyFrame(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 

     canvas = tk.Canvas(
        self, 
        width = 300, 
        height = 200) 
     canvas.create_rectangle(0,0,300,200, fill="red") 
     canvas.pack() 

     button_texts = ['hello', 'world', 'goodbye', 'mars'] 

     for i, button_text in enumerate(button_texts): 
      button = tk.Button(text=button_text) 
      button.bind("<Button-1>", self.onclickButton) 

      canvas.create_window(
        100, 50 + 30*i, 
        window=button, 
      ) 


    def onclickButton(self, evt): 
     evt.widget.config(padx=100) 
     print(evt.widget.cget('text')) 


root = tk.Tk() 
root.geometry("500x300+10+0") 
MyFrame(root).pack() 
root.mainloop() 

enter image description here

+0

我明白這一點。但現在想象一下,如果我點擊「世界」按鈕(或任何其他),然後該按鈕被突出顯示。我想從「再見」按鈕中刪除高亮顯示。我怎樣才能做到這一點?我怎樣才能控制'再見'按鈕?或者如果我點擊矩形區域,我怎樣才能刪除按鈕上的任何高光?將它們還原爲原始外觀。 – HaggarTheHorrible