Python 重新创建按钮命令=函数回调?

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.

我正在使用tk.Label和我自己的类制作一个自定义按钮,这样我就可以在项目的一个单独模块中导入并使用它。我不知道如何复制button对象的
命令=
函数,这是回调函数的实现吗?如果不是,我应该在哪里查找有关如何实现它的信息

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