Bir class objesini başka bir classta kullanma

Merhaba class dolayısıyla inheritance konusunda oldukça yeniyim. 2 pencerem var bir ana pencere ve bir tane Toplevel.
Toplevel açıldığı zaman anapencere de ki butonlarımın disabled konumuna geçmesini, eğer Toplevel'ı kapatırsam anapencerede ki butonlarımın tekrar normal konumuna geçmesini istiyorum sınıfsız yazdığımda yapmıştım ancak bu haliyle sanırım gözden kaçırıyorum

 class Page_RemoteControl(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.pack(fill=BOTH)

        self.number = []
        for i in range(1, 101):
            self.number.append(f"Numara {i}")
            self.combox = ttk.Combobox(self, values=self.number, state="readonly")
        self.combox.place(relx=0.02, rely=0.3)

        self.settings = ImageTk.PhotoImage(file="images/settingsss.png")
        self.settings_button = tk.Button(self, image=self.settings, bg="white", borderwidth=0.5,
                                         command= self.Button_Settings_Click)
        self.settings_button.place(relx=0.84, rely=0.3)

        self.power_on = ImageTk.PhotoImage(file="images/power.png")
        self.power_on_btn = tk.Button(root, bg="white", text="Aç                                          ",
                                      image=self.power_on, compound=tk.LEFT,
                                      borderwidth=0.5, command=self.power_onn)
        self.power_on_btn.place(relx=0.02, rely=0.37)

        self.power_off = ImageTk.PhotoImage(file="images/start-button (1) - Kopya.png")
        self.power_off_btn = tk.Button(root, bg="white", text="Kapat                                     ",
                                       image=self.power_off, compound=tk.LEFT, 
                                       borderwidth=0.5, command=self.power_offf)
        self.power_off_btn.place(relx=0.02, rely=0.48)
....

    def Button_Settings_Click(self):

        self.power_off_btn['state']= tk.DISABLED
        self.power_on_btn['state']= tk.DISABLED
        self.settings_button['state'] = tk.DISABLED
        self.combox['state'] = tk.DISABLED

        Page_Password(root)

class Page_Password(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self, master)
...
        self.protocol("WM_DELETE_WINDOW", self.password_closing)

    def password_closing(self):
        self.power_on_btn['state'] = tk.NORMAL
        self.power_off_btn['state'] = tk.NORMAL
        self.settings_button['state'] = tk.NORMAL
        self.combox['state'] = 'readonly'
        tk.Toplevel.destroy()

karşılaştığım hata ise;
AttributeError: 'Page_Password' object has no attribute 'iconname'

Merhaba,

Page_RemoteControl sınıfında bir düğmeye basıldığı zaman Page_Password sınıfından bir örnek oluşturuluyor. Oluşan örnekte de Page_RemoteControl sınıfındaki bazı niteliklerin özelliklerini değiştirmeye çalışıyorsunuz. Ama bunu yaparken, sanki bu nitelikler Page_Password sınıfında tanımlıymış gibi onları doğrudan self.nitelik_ismi olarak kullanıyorsunuz.

Böyle bir durumda yapmanız gereken şey, Page_Password sınıfından bir örnek oluşturulurken, Page_RemoteControl sınıfının örneğini yani self ifadesini, Page_Password sınıfının örneğine argüman olarak vermeniz.

Page_Password sınıfının örneğinin, frame gibi bir argümanı olabilir. Page_RemoteControl sınıfının örneği de bu frame argümanının değeri haline getirilebilir.

Ayrıca;

text = "AÇ                "

gibi bir ifade yerine,

text = "AÇ".ljust(20)

ifadesini kullanabilirsiniz.

Aşağıda kodlarınızın düzenlenmiş hali yer almaktadır.

import tkinter as tk

from tkinter import ttk
from PIL import ImageTk


class Page_RemoteControl(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack(fill="both")
        self.combox = ttk.Combobox(
            master=self, 
            values=[f"Numara {i}" for i in range(1, 101)], 
            state="readonly"
        )
        self.combox.pack()
        self.power_on = ImageTk.PhotoImage(file="switch-on.png")
        self.power_on_btn = tk.Button(
            master=self, 
            bg="white", 
            text="Aç",
            width=100,
            image=self.power_on, 
            compound=tk.LEFT,
            borderwidth=0.5, 
            command=self.button_settings
        )
        self.power_on_btn.pack()
        self.power_off = ImageTk.PhotoImage(file="switch-off.png")
        self.power_off_btn = tk.Button(
            master=self, 
            bg="white", 
            text="Kapat",
            width=100,
            image=self.power_off, 
            compound=tk.LEFT, 
            borderwidth=0.5, 
            command=lambda: None
        )
        self.power_off_btn.pack()
        
    def button_settings(self):
        self.power_off_btn['state'] = "disabled"
        self.power_on_btn['state']= "disabled"
        self.combox['state'] = "disabled"
        Page_Password(frame=self)


class Page_Password(tk.Toplevel):
    def __init__(self, frame, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.frame = frame
        self.protocol("WM_DELETE_WINDOW", self.on_closing)

    def on_closing(self):
        self.frame.power_on_btn['state'] = "normal"
        self.frame.power_off_btn['state'] = "normal"
        self.frame.combox['state'] = 'readonly'
        self.destroy()


root = tk.Tk()
Page_RemoteControl(master=root)
root.mainloop()
1 Beğeni

bunun inanılmaz saçma bir çözüm olduğunun farkındaydım teşekkür ederim öncelikle, sizin kodunuzu çalıştırdığımda şu hatayı aldım
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

Dosya isimlerini düzeltmeniz gerekiyor olabilir. Bendeki ikonlar, dosyanın çalıştığı dizindeydi, Images isimli bir klasör yoktu.

doğru söylüyorsunuz fark etmemişim onları değiştirdiğinizi çok teşekkür ederim ellerinize sağlık

Rica ederim, kolay gelsin.