2015-12-14 70 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