我正在尝试制作自己的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()
答案 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函数或对象来说都是相同的。