【问题标题】:Tkinter: How to get the button which is inside a canvas.window()Tkinter:如何获取 canvas.window() 内的按钮
【发布时间】:2015-12-14 06:57:30
【问题描述】:

我想了解如何获取作为canvas.window() 项目一部分的button 小部件来更改其属性。

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)

在上面的代码 sn-p 中,您可以看到我在窗口中嵌入了一个按钮。然后,我将此窗口嵌入到canvas

现在,当用户单击 button1_window 项目时,我想控制该窗口内的按钮,然后更改其属性,例如边框大小/颜色。

【问题讨论】:

  • 我看到你有self,这意味着一个标准的OO Tkinter 应用程序。您应该能够使用self.button1 = ...button1 设为实例属性,然后在类中的任何位置轻松引用它。
  • sn-p 不是我实际程序的一部分。在我的程序中,用户可以选择在画布上创建许多窗口(基本上是图标),并在他喜欢的时候删除它们。我不想跟踪窗口/按钮的创建/删除。每当用户单击窗口(图标)时,我都想控制其中的按钮并更改其属性。
  • 在这种情况下,您能否编辑您的问题以提供我们可以使用的MCVE

标签: python canvas tkinter tk tkinter-canvas


【解决方案1】:

我想控制该窗口内的按钮,然后 更改其属性,例如边框大小/颜色。

如果您将bind() 函数传递给按钮,那么当单击按钮时,tkinter 会将event object 作为参数传递给函数。 event object 有一个 widget 属性,它将是被单击的按钮。这是您可以执行的操作的示例:

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

【讨论】:

  • 我明白这一点。但是现在想象一个情况,假设我单击“世界”按钮(或任何其他按钮)然后该按钮被突出显示。我想从“再见”按钮中删除突出显示。我怎样才能做到这一点?如何控制“再见”按钮?或者如果我单击矩形区域,如何删除按钮上的任何高光?将它们恢复为原始外观。
猜你喜欢
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2015-09-18
  • 1970-01-01
  • 2015-07-26
相关资源
最近更新 更多