Python 重新创建按钮命令=函数回调?
我正在使用tk.Label和我自己的类制作一个自定义按钮,这样我就可以在项目的一个单独模块中导入并使用它。我不知道如何复制button对象的Python 重新创建按钮命令=函数回调?,python,python-3.x,button,tkinter,label,Python,Python 3.x,Button,Tkinter,Label,我正在使用tk.Label和我自己的类制作一个自定义按钮,这样我就可以在项目的一个单独模块中导入并使用它。我不知道如何复制button对象的命令=函数,这是回调函数的实现吗?如果不是,我应该在哪里查找有关如何实现它的信息 import tkinter as tk class Main(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) tk.
命令=
函数,这是回调函数的实现吗?如果不是,我应该在哪里查找有关如何实现它的信息
import tkinter as tk
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.geometry(self, "800x400")
tk.Tk.config(self, bg="black")
container = tk.Frame(self)
container.config(bg="black")
container.pack(side="top", fill="both", expand="true", pady=30)
this = Nav(container, text="Button 1")
this.bind("<Button>", lambda event: print("HELLO"))
this.pack()
Nav(container, text="Button 2")
class Nav(tk.Label):
def __init__(self, *args, **kwargs):
btn = tk.Label.__init__(self, *args, **kwargs, bg="green")
def on_enter(event, ref):
ref.config(text="enter", bg="#990000")
def on_leave(event, ref):
ref.config(text="leave", bg="black")
def left_click(event, ref):
ref.config(text="left click")
return True;
def release(event, ref):
ref.config(text="release")
app = Main()
app.mainloop()
将tkinter作为tk导入
主类(tk.tk):
定义初始化(self,*args,**kwargs):
tk.tk.\uuuuu初始化(self,*args,**kwargs)
传统几何(自,“800x400”)
tk.tk.config(self,bg=“black”)
容器=tk.框架(自身)
container.config(bg=“black”)
容器包装(side=“top”、fill=“both”、expand=“true”、pady=30)
此=导航(容器,text=“按钮1”)
this.bind(“,lambda事件:print(“HELLO”))
这个包()
导航(容器,text=“按钮2”)
类别导航(传统标签):
定义初始化(self,*args,**kwargs):
btn=tk.Label.\uuuuu init\uuuuuu(self,*args,**kwargs,bg=“绿色”)
输入时的def(事件,参考):
ref.config(text=“enter”,bg=“#990000”)
def休假(事件,参考):
ref.config(text=“离开”,bg=“黑色”)
def左键单击(事件,参考):
ref.config(text=“左键单击”)
返回True;
def释放(事件,参考):
ref.config(text=“release”)
app=Main()
app.mainloop()
问题:如何实现自己的按钮
对象的命令=
命名参数
要获得与command=
相同的用法以及类似def callback()
的回调,您必须绑定到self。在左键单击调用回调的
参考:
-
使用
Label
小部件的bind
方法将回调函数绑定到名为“
的事件
你需要做四件事:
- 让调用者传入
命令
参数,就像使用按钮
一样
- 让新类将此命令保存在变量中
- 在
Nav
中实现绑定以调用内部函数
- 让该内部函数调用保存的命令
例如,首先将命令添加到Main
,然后将该命令传递到Nav
,就像使用按钮一样:
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
...
this = Nav(container, text="Button 1", command=self.do_something)
...
def do_something(self):
print("do_something was called")
接下来,定义Nav
以接受此参数
注意:您错误地使用了继承和组合(继承自标签
,还创建了第二个标签
),这是不必要的,因此我将在下面的示例中删除第二个标签
由于标签
不支持命令
关键字arg,我们需要将其从kwargs
中取出,并将其保存到变量中,然后再将剩余参数传递给标签
的初始化
class Nav(tk.Label):
def __init__(self, *args, **kwargs):
self.command = kwargs.pop("command", None)
super().__init__(*args, **kwargs, bg="green")
您的原始代码在Main
中调用了bind
,但是如果您试图模拟一个小部件,那么绑定需要在小部件内部。这样,这个新的小部件将像按钮一样工作,通过指定命令而不是绑定
这是定义
、
、
和
事件的方式。我已经从您的原始代码中重命名了这些函数,以便彼此更加一致
class Nav(tk.Label):
def __init__(self, *args, **kwargs):
...
self.bind("<Enter>", self.on_enter)
self.bind("<Leave>", self.on_leave)
self.bind("<ButtonPress>", self.on_press)
self.bind("<ButtonRelease>", self.on_release)
以下是其他方法,将ref
替换为self
,并将参数按正确顺序排列:
def on_enter(self, event):
self.config(text="enter", bg="#990000")
def on_leave(self, event):
self.config(text="leave", bg="black")
def left_click(self, event):
self.config(text="left click")
您想在自定义按钮中添加一个名为command
的属性,该属性模仿标准按钮的属性,还是只需要在左键单击按钮时激活回调函数?@scirocorics如果可能,这是一个模仿标准按钮的参数。非常感谢您提供了这样一个信息丰富的答案,我很惊讶这是多么容易实现,希望其他人在这里找到他们需要的链接+1获取有关继承的提示。
class Nav(tk.Label):
def __init__(self, *args, **kwargs):
...
self.bind("<Enter>", self.on_enter)
self.bind("<Leave>", self.on_leave)
self.bind("<ButtonPress>", self.on_press)
self.bind("<ButtonRelease>", self.on_release)
class Nav(tk.label):
...
def on_release(self, event):
if self.command is not None:
self.command()
def on_enter(self, event):
self.config(text="enter", bg="#990000")
def on_leave(self, event):
self.config(text="leave", bg="black")
def left_click(self, event):
self.config(text="left click")