绑定Tkinter小部件

时间:2018-08-11 19:14:47

标签: python tkinter

我正在尝试制作自己的tkinter小部件,这些小部件可以进行更多的自定义并且在美学上更令人愉悦。我将利用的一个关键概念是bind()方法,我将最特别地使用该方法来使按钮绑定到<Button-1>事件的标签之外(以便驾驭无法移动的边框)预先安装的tkinter按钮并添加一些很酷的效果。

到目前为止,通用代码如下:

from tkinter import *
root = Tk()

def something(event):
    print(event.widget)

def Custom_Button(master, text):
    return(Label(master, text = text))

mywidget = Custom_Button(root, text = 'goodbye')
mywidget.bind('<Button-1>', something)
mywidget.pack()

root.mainloop()

此设置的问题是将<Button-1>绑定到我的自定义小部件所需的单独行。我想知道是否有一种方法可以在CustomButton()函数中指定将mywidget绑定到<Button-1>。问题是mywidget被分配给函数CustomButton()返回的值。

从本质上讲,我想知道如何更改代码以使类似的东西真正起作用?

from tkinter import *

root = Tk()

def something(event):
    print(event.widget)

def Custom_Button(master, text):
    return(Label(master, text = text))
    #this
    mywidget.bind('<Button-1>', something)
    #or this
    bind('<Button-1>', something)

mywidget = Custom_Button(root, text = 'goodbye')
mywidget.grid()

root.mainloop() 

1 个答案:

答案 0 :(得分:1)

您可以通过以下两种方法之一来执行此操作。除了需要将return函数移到该函数的最后一行之外,第一个过程与您所做的一样:

def Custom_Button(master, text):
    label = Label(master, text=text)
    label.bind(...)
    ...
    return label

第二个方法是在创建自定义类时使用面向对象的方法。由于您仅创建单个标签,因此可以从Label继承:

class Custom_Cutton(Label):
    def __init__(self, *args):
        Label.__init__(self, *args)
        self.bind(...)
        ...

注意:对于tkinter这样做并没有什么独特之处。对于任何python函数或对象来说都是相同的。