【问题标题】:Python Tkinter canvas class inheritancePython Tkinter 画布类继承
【发布时间】: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="+")

问题:

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

这部分可能不需要提及,但我在这里创建一个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 OrientedQ-2self.set_imgiid,从 .create_image(... 返回,属于 image 对象内的 Canvas 对象。
  • @Saad: tag 不是很正确的术语。 create_image 返回一个 ID。 ID 是唯一的,它们是整数。标签不能是整数,也不能是仅由数字组成的字符串。
  • @BryanOakley:你说得对 tag 是一个接受字符串的参数,它们对于多个画布项目可以是相同的,其中 id 是每个项目的唯一整数。

标签: python canvas tkinter


【解决方案1】:

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

它被执行是因为它是代码的一部分。我不确定你为什么认为它不会被调用。如果您不希望它被调用,请将其移到 __init__ 方法之外。

self.set_img 是否对应 Imgbuttonor tk.Canvas 类的对象?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2017-08-09
    相关资源
    最近更新 更多