展开 Python 个 Tkinter 对象类型

Expand Python Tkinter Object Types

有一个发现现有类型的问题:

不过,我刚刚开发了工具提示(气球),我已将其分配给一些按钮,并希望能够将它们全部作为一种独特的类型来调用。此外,我还想手工制作 canvas 对象,这些对象将像带有 <enter><leave><active><press> 和 [ 的伪按钮一样操作=15=] 事件。我如何为它们声明新的对象类型?

面向对象编程可能是解决方案。

如果我想创建一个“新型”的 tkinter 按钮,我可以子 class 它。

class MySpecialButton(tkinter.Button):
    pass

目前这并没有做任何特别的事情,但会赋予它一个独特的类型(如果它正确理解了您的解释)

我的另一个答案中的以下示例创建了一个具有自定义行为的特殊按钮,用于将鼠标悬停在按钮上

class HoverButton(tk.Button):
    def __init__(self, master, **kw):
        tk.Button.__init__(self,master=master,**kw)
        self.defaultBackground = self["background"]
        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)

    def on_enter(self, e):
        self['background'] = self['activebackground']

    def on_leave(self, e):
        self['background'] = self.defaultBackground

关于 canvas 对象,您显然也可以为这些对象创建 classes,其中可以包含 moving/resizing 对象的方法。至于如何为这些创建自定义事件,您可以使用 tag_bind(item, event=None, callback=None, add=None) 将回调绑定到 canvas 对象。下面是一个简单的例子

import tkinter as tk

class CanvasShape:
    def __init__(self, canvas, callback = None):
        self.canvas = canvas
        self.id = canvas.create_oval(10,10,50,50,fill='blue')
        self.canvas.tag_bind(self.id,'<Button-1>',callback)

def clicked(e):
    print("You clicked on a shape")

root = tk.Tk()
c = tk.Canvas(root,width=200,height=200)
c.grid()
shape = CanvasShape(c,callback=clicked)

root.mainloop()

这将创建一个圆圈,当您单击它时将触发一个事件,该事件由 clicked 函数接收。

如果我对你的问题理解正确,你想检查创建的实例是否是自定义实例 class,可以直接使用 isinstance:

完成
class CustomTooltip():
    pass

cwidget = CustomTooltip()
btn     = tk.Button(root)

print(isinstance(cwidget, CustomTooltip)) # True
print(isinstance(b, CustomTooltip)) # False

print(type(cwidget) == CustomTooltip) # Not recommended

建议使用isinstance而不是type,来自文档:

The isinstance() built-in function is recommended for testing the type of an object, because it takes subclasses into account.


我不太明白你的第二个问题,而且最好让一个问题围绕一个主要问题,而不是问多个问题。