Вот один из способов сделать это. Во-первых, чтобы нарисовать прямоугольник на Tk Canvas, вам нужно вызвать метод Canvas для create_rectangle
. Я также использую метод __init__
для хранения атрибутов прямоугольника, так что вам нужно передать объект Canvas только в качестве параметра в метод прямоугольника draw()
.
from Tkinter import *
class Rectangle():
def __init__(self, coords, color):
self.coords = coords
self.color = color
def draw(self, canvas):
"""Draw the rectangle on a Tk Canvas."""
canvas.create_rectangle(*self.coords, fill=self.color)
master = Tk()
w = Canvas(master, width=300, height=300)
w.pack()
rect1 = Rectangle((0, 0, 100, 100), 'blue')
rect1.draw(w)
mainloop()
EDIT
Отвечая на ваш вопрос: что находится перед self.coords
*
?
Чтобы создать прямоугольник на холсте Tk, вы вызываете метод create_rectangle
следующим образом.
Canvas.create_rectangle(x0, y0, x1, y1, option, ...)
Таким образом, каждый из (x0
координат, y0
и т.д.) является indiviual PARAMATERS к методу. Тем не менее, я сохранил координаты класса Rectangle в одном 4-кортеже. Я могу передать этот единственный кортеж в вызов метода, и перед тем, как он вставит *
, он распакует его на четыре отдельных значения координат.
Если у меня есть self.coords = (0, 0, 1, 1)
, то create_rectangle(*self.coords)
закончится как create_rectangle(0, 0, 1, 1)
, а не create_rectangle((0, 0, 1, 1))
. Обратите внимание на внутренний набор круглых скобок во второй версии.
Документация Python обсуждает это в unpacking argument lists.
Что такое '*' перед self.coords делать? –