使用Tkinter 8.6,Python 3.7.3:

一位友好的用户在这里指导我如何通过创建作为Tkinter Imgbutton的子类的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="+")


问题:


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




这部分可能不需要提及,但是在这里我要创建一个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.Canvas类的对象?


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


  这里有什么地方可以创建实际的画布?


是。 Imgbutton是画布。这就是继承的工作方式:ImgbuttonCanvas,具有一些增强功能。当您执行but = Imgbutton(...)时将创建它。但是,当您调用super时,也许更准确地创建了实际的画布,这告诉tkinter创建对象。

08-26 09:51