【发布时间】:2019-09-17 11:27:42
【问题描述】:
使用 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类的对象? - 这里有什么地方可以创建实际的画布吗?我认为您需要先创建一个画布,然后才能向其中添加任何内容。
这部分可能不需要提及,但我在这里创建一个Imgbuttonobject:
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()
【问题讨论】:
-
self.set_img是从方法create_image返回的标签,它属于Canvas类,我继承到Imgbutton,所以这意味着Canvas的所有功能(方法)都可以使用在Imgbutton类中也是如此。当您创建Imgbutton的实例时,Canvas会自行创建,基本上Imgbutton是 Canvas,只是做了一些修改。 -
上课Python - Object Oriented。 Q-2:
self.set_img是iid,从.create_image(...返回,属于image对象内的Canvas对象。 -
@Saad:
tag不是很正确的术语。create_image返回一个 ID。 ID 是唯一的,它们是整数。标签不能是整数,也不能是仅由数字组成的字符串。 -
@BryanOakley:你说得对
tag是一个接受字符串的参数,它们对于多个画布项目可以是相同的,其中id是每个项目的唯一整数。