使用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
是否对应于Imgbutton
或tk.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
是画布。这就是继承的工作方式:Imgbutton
是Canvas
,具有一些增强功能。当您执行but = Imgbutton(...)
时将创建它。但是,当您调用super
时,也许更准确地创建了实际的画布,这告诉tkinter创建对象。