簡體   English   中英

一個對象如何影響同一類中的另一個對象?

[英]How can an object affect another object from the same class?

我是 Python 新手,旨在掌握 Python 中的 OO。 在這里我試着畫畫,作為一個。 例如,畫布上的矩形通過同一類定義的另一個框架中的按鈕放置在框架中。 更普遍地說:對象如何相互通信? 當前代碼導致錯誤:AttributeError: 'Windows' object has no attribute '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()

對象如何相互通信?

規則非常簡單:要與另一個對象交互,您需要引用另一個對象。 通過該引用,他們可以調用任何方法或訪問任何公共屬性。 在您的情況下,如果您希望window_2能夠控制window_1 ,則需要將window_1傳遞給window_2

有很多方法可以做到這一點。 正確的方法取決於你想要完成什么。 例如,您需要雙向通信嗎? 你會有多個窗口控制一個窗口嗎? 或者,單個窗口是否需要控制多個其他窗口? 還是多個窗口需要控制多個窗口? 您想在每次函數調用時指定窗口,還是設置默認窗口? 在每一種情況下,解決方案的根源都是一樣的:一個窗口需要引用另一個窗口。

在您的具體示例中,一種解決方案是通過傳入可選的window參數來告訴make_button繪制哪個窗口。 如果定義,它將在請求的窗口中,如果未定義,則在其自己的窗口中。

下面是一個例子:

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)

您要求的是大多數面向對象語言所指的靜態變量。 可從在每個類實例中相同的類訪問的變量。 Python 提供了多種選擇,但最簡單的方法可能是刪除self. 從任何 refetences 到canvas 您還需要確保make_canvas在其他任何事情之前make_canvas被調用一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM