Как объект может влиять на другой объект из того же класса? - PullRequest
0 голосов
/ 22 марта 2020

Я новичок в python и стремлюсь овладеть ОО в python. Здесь я стараюсь рисовать, как. Например, прямоугольник на холсте, помещенный во фрейм через кнопку из другого фрейма, который определен в том же классе. В более общем смысле: как объекты могут общаться друг с другом? Текущий код приводит к ошибке: AttributeError: «Windows» объект не имеет атрибута «canvas_1»

import tkinter as tk
class Windows():
    def __init__(self, master, width, height, colour, row, column, cell_size):
        self.frame_1 = tk.Frame(master, width=width+20, height=height+20, bg='white')
        self.frame_1.grid(row=row, column=column)
        self.width=width
        self.height=height
        self.row=row
        self.column=column
        self.colour=colour

    def make_canvas(self):
        self.canvas_1 = tk.Canvas(self.frame_1, width=self.width, height=self.height, bg=self.colour,
                               borderwidth = 0, highlightthickness=0)
        self.canvas_1.place(x=10, y=10)
        self.canvas_1.create_rectangle(0,0,self.width-1, self.height-1)

    def draw_rectangle(self):
        self.canvas_1.create_rectangle(50, 50, 100, 100)

    def make_button(self, text, row, column):
        self.button = tk.Button(self.frame_1, text=text,command=self.draw_rectangle)
        self.button.grid(row=row, column=column)

master = tk.Tk()
window_1 = Windows(master, width=600, height=400, colour='yellow', row=1, column=0, cell_size=10 )
window_1.make_canvas()
window_2 = Windows(master, width=600, height=100, colour='white', row=3, column=0,   cell_size=10)
window_2.make_button('button_1',0,0)
master.mainloop()

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Как объекты могут общаться друг с другом?

Правило довольно простое: для взаимодействия с другим объектом вам нужна ссылка на другой объект. С помощью этой ссылки они могут вызвать любой метод или получить доступ к любому атрибуту publi c. В вашем случае, если вы хотите, чтобы window_2 мог контролировать window_1, вам нужно передать window_1 в window_2.

Есть много способов сделать это. Правильный путь зависит от того, чего вы хотите достичь sh. Например, вам нужна двусторонняя связь? У вас будет несколько windows, управляющих одним окном? Или одно окно должно управлять несколькими другими windows? Или несколько windows необходимо контролировать несколько windows? Вы хотите указать окно при каждом вызове функции или установить окно по умолчанию? В каждом из этих случаев root решения одинаково: у окна должна быть ссылка на другое окно.

В вашем конкретном примере c одно из решений состоит в том, чтобы указать make_button, в какое окно рисовать, передав необязательный параметр window. Это будет в запрошенном окне, если оно определено, или в своем собственном окне, если оно не определено.

Вот пример:

def make_button(self, text, row, column, other_window=None):
    window = self if other_window is None else other_window
    self.button = tk.Button(self.frame_1, text=text,command=window.draw_rectangle)
    self.button.grid(row=row, column=column)
...
window_2.make_button('Draw in window 1',0,0, other_window=window_1)
0 голосов
/ 22 марта 2020

То, что вы запрашиваете, - это то, что большинство ОО-языков называют переменными состояния c. Переменная, доступная из класса, которая идентична в каждом экземпляре класса. Python предлагает несколько вариантов, но наиболее простым способом, вероятно, будет удаление self. из любых ссылок на canvas. Вам также необходимо убедиться, что make_canvas вызывается ровно один раз, прежде чем что-либо еще.

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