Наследование классов холста Python Tkinter - PullRequest
2 голосов
/ 28 апреля 2019

Использование 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 объекту Imgbutton или tk.Canvas класса?
  3. Есть ли здесь точка, где создается настоящий холст? Я считал, что вам нужно создать холст, прежде чем вы сможете что-то добавить к нему.

Эта часть может быть ненужной для упоминания, но здесь я создаю 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()

1 Ответ

1 голос
/ 29 апреля 2019

Когда я создаю объект Imgbutton, разделенная строка выше выполняется, но я не понимаю, почему.

Это выполнено, потому что это часть кода. Я не уверен, почему вы думаете, что это не будет называться. Если вы не хотите, чтобы он вызывался, переместите его за пределы метода __init__.

Соответствует ли self.set_img объекту класса Imgbuttonor tk.Canvas?

self относится к экземпляру класса Imgbutton. set_img будет идентификатором, возвращаемым холстом при создании объекта на холсте.

Есть ли здесь точка, где создается фактический холст?

Да. Imgbutton это холст. Вот как работает наследование: Imgbutton - это Canvas, с некоторыми улучшениями. Он создается, когда вы делаете but = Imgbutton(...). Хотя, возможно, немного точнее фактический холст создается при вызове super, который сообщает tkinter о создании объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...