Python Tkinter canvas class inheritance



使用 Tkinter 8.6, Python 3.7.3:

这里的一位友好用户指导我如何通过创建一个 Imgbutton 类来使图像充当按钮,该类是 Tkinter Canvas 的子类。

我对此代码有一些疑问,这是它的简化版本:

#!/usr/local/bin/python3
import tkinter as tk
from PIL import Image, ImageTk
class Imgbutton(tk.Canvas):
    def __init__(self, master=None, image=None, command=None, **kw):
        super(Imgbutton, self).__init__(master=master, **kw)
        self.set_img = self.create_image(0, 0, anchor='nw', image=image)
        self.bind_class( self, '<Button-1>',
                    lambda _: self.config(relief='sunken'), add="+")
        self.bind_class( self, '<ButtonRelease-1>',
                    lambda _: self.config(relief='groove'), add='+')
        self.bind_class( self, '<Button-1>',
                    lambda _: command() if command else None, add="+")

问题:

  1. 当我创建一个Imgbutton对象时,上面的分隔行被执行,但我不明白为什么。
  2. self.set_img对应于Imgbuttontk.Canvas类的对象?
  3. 这里是否有创建实际画布的任何点?我相信您需要先创建一个画布,然后才能向其添加任何内容。

这部分可能没有必要提及,但在这里我创建了一个Imgbutton对象:

root = tk.Tk()
but_img = tk.PhotoImage(file='button.png')
but = Imgbutton(root, image=but_img, width=but_img.width(),
            height=but_img.height(), borderwidth=2, highlightthickness=0)
but.pack()
root.mainloop()

当我创建一个Imgbutton对象时,上面的分隔行被执行,但我不明白为什么。

执行它是因为它是代码的一部分。我不知道你为什么认为它不会被召唤。如果不希望调用它,请将其移出 __init__ 方法。

self.set_img是否对应于Imgbuttonor tk的对象。帆布课?

self是指Imgbutton类的实例。 set_img将是画布在画布上创建对象时返回的标识符。

这里是否有创建实际画布的任何点?

是的。 Imgbutton是画布。这就是继承的工作原理:Imgbutton是一个 Canvas ,有一些增强功能。当您执行but = Imgbutton(...)时,它会创建。不过,也许更准确地说,当您调用 super 时会创建实际的画布,这会告诉 tkinter 创建对象。

最新更新