使用 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="+")
问题:
- 当我创建一个
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的对象。帆布课?
self
是指Imgbutton
类的实例。 set_img
将是画布在画布上创建对象时返回的标识符。
这里是否有创建实际画布的任何点?
是的。 Imgbutton
是画布。这就是继承的工作原理:Imgbutton
是一个 Canvas
,有一些增强功能。当您执行but = Imgbutton(...)
时,它会创建。不过,也许更准确地说,当您调用 super
时会创建实际的画布,这会告诉 tkinter 创建对象。