Tengo una clase secundaria que heredó de la clase principal. Quiero modificar y omitir algunas propiedades de inicio de la clase principal cuando llamo desde la clase secundaria, sin embargo, no puedo anular las propiedades. Lo que sigue es mi código

import tkinter as tk
from tkinter import *

class firstClass:
    def __init__(self,root):
        self.master = root
        self.master.geometry("680x600+450+200") 
        self.master.title("WINDOW 1")
        self.statusbar          = tk.Label (self.master, text = "MAIN MENU",font='Times 10',relief ="sunken",anchor=W) 
        self.statusbar.pack(side=BOTTOM,fill=X) 
        self.button             = tk.Button(self.master, text = "Button", command=self.createNewWindow,bg="peach puff",borderwidth= 2,bd=2,font="Times 12",relief ="raised")
        self.button.place(width=160,    height=50, x=20, y=55) 
        self.button1             = tk.Button(self.master, text = "Dummy Button", command=self.doesNothing,bg="peach puff",borderwidth= 2,bd=2,font="Times 12",relief ="raised")
        self.button1.place(width=160,    height=50, x=20, y=170) 

    def doesNothing(self):
        pass
                
class secondClass(firstClass):
    def __init__(self,root):
        super().__init__(root) 
        
    def createNewWindow(self):
        self.newWindow          = tk.Toplevel(self.master)
        self.app                = thirdClassMain(self.newWindow)
        
class thirdClassMain(firstClass):
    def __init__(self,master):
        super().__init__(master) 
        self.top                = master
        self.top.title("WINDOW 2")
        self.button             = tk.Button(self.top, text = "New1 Button", command=self.createNewWindow,bg="peach puff",borderwidth= 2,bd=2,font="Times 12",relief ="raised")
        self.button.place(width=160,   height=50, x=20, y=305)
        self.statusbar          = tk.Label (self.top, text = "New1 MENU",font='Times 10',relief ="sunken",anchor=W) 
        self.statusbar.pack(side=BOTTOM,fill=X) 

    def createNewWindow(self):
        self.newWindow          = tk.Toplevel(self.top)
        self.app                = fourthClassMain(self.newWindow)


class fourthClassMain(firstClass):
    def __init__(self,master):
        super().__init__(master) 
        self.statusbar          = tk.Label (self.master, text = "New2 MENU",font='Times 10',relief ="sunken",anchor=W) 
        self.statusbar.pack(side=BOTTOM,fill=X) 
        self.master.title("WINDOW 3")

        
    def createNewWindow(self):
        pass

if __name__ == "__main__":
    root = tk.Tk()
    secondClass = secondClass(root)
    root.mainloop()

Error:

  1. La ventana emergente 2 solo debe contener "Botón New1" pero contiene todos los botones de la clase principal
  2. La ventana emergente 2 modifica el título del menú debe ser solo "Nuevo1 MENÚ". No debe crear un título separado como se puede ver en el código.
  3. La ventana 3 debe contener solo "Botón ficticio". ¿Cómo puedo eliminar "Botón"?

¿No es esto posible?

De todos los puntos anteriores, está claro que me falta el concepto subyacente de herencia y cómo modificar las propiedades de los padres. Por favor guíame. Gracias

¿Alguna respuesta o guía? He estado esperando durante tanto tiempo por alguna respuesta.

1
codeheadache 12 feb. 2021 a las 00:25

1 respuesta

La mejor respuesta

Prueba esto:

import tkinter as tk
from tkinter import *


class FirstClass:
    def __init__(self, root):
        self.master = root
        self.master.geometry("680x600+450+200")
        self.master.title("WINDOW 1")
        self.statusbar = tk.Label(self.master, text="MAIN MENU")
        self.statusbar.pack(side="bottom", fill="x")
        self.button = tk.Button(self.master, text="Button", command=self.create_new_window)
        self.button.place(width=160, height=50, x=20, y=55)
        self.button1 = tk.Button(self.master, text="Dummy Button", command=self.does_nothing)
        self.button1.place(width=160, height=50, x=20, y=170)

    def does_nothing(self):
        pass


class SecondClass(FirstClass):
    def __init__(self, root):
        super().__init__(root)
        
    def create_new_window(self):
        self.new_window = tk.Toplevel(self.master)
        self.new_window.geometry("680x600+450+200")
        self.app = ThirdClassMain(self.new_window)


class ThirdClassMain(FirstClass):
    def __init__(self, master):
        # You don't always need to call the `FirstClass`'s constuctor if you don't want
        #super().__init__(master)
        self.top = master
        self.top.title("WINDOW 2")
        self.button = tk.Button(self.top, text="New1 Button", command=self.create_new_window)
        self.button.place(width=160, height=50, x=20, y=305)
        self.statusbar = tk.Label(self.top, text="New1 MENU")
        self.statusbar.pack(side="bottom", fill="x")

    def create_new_window(self):
        self.new_window = tk.Toplevel(self.top)
        self.new_window.geometry("680x600+450+200")
        self.app = FourthClassMain(self.new_window)


class FourthClassMain(FirstClass):
    def __init__(self, master):
        super().__init__(master)
        # We aren't going to create a new label but we are going to update
        # The already existing one
        self.statusbar.config(text="New2 MENU")
        self.master.title("WINDOW 3")
        # Destroy the button that you don't need
        self.button.destroy()

    def create_new_window(self):
        pass


if __name__ == "__main__":
    root = tk.Tk()
    second_class = SecondClass(root)
    root.mainloop()

No estoy exactamente seguro de si esto es lo que necesita, pero creo que cubrí todos los problemas que tenía. También cambié el nombre de algunas de sus variables para hacerlas más pitónicas. Tenía muchos espacios en blanco sin ningún motivo, lo que generalmente se desaconseja.

Editar

El código pero con el enlace:

import tkinter as tk
from tkinter import *


class ToplevelFollower(tk.Toplevel):
    def __init__(self, master, **kwargs):
        super().__init__(master, **kwargs)
        super().bind("<Configure>", self.move)
        self.move()

    def move(self, event=None):
        w, h = super().winfo_width(), super().winfo_height()
        x, y = super().winfo_rootx(), super().winfo_rooty()
        x -= 8
        y -= 30
        self.master.geometry("%ix%i+%i+%i" % (w, h, x, y))


class FirstClass:
    def __init__(self, root):
        self.master = root
        self.master.geometry("680x600")#+450+200
        self.master.title("WINDOW 1")
        self.statusbar = tk.Label(self.master, text="MAIN MENU")
        self.statusbar.pack(side="bottom", fill="x")
        self.button = tk.Button(self.master, text="Button", command=self.create_new_window)
        self.button.place(width=160, height=50, x=20, y=55)
        self.button1 = tk.Button(self.master, text="Dummy Button", command=self.does_nothing)
        self.button1.place(width=160, height=50, x=20, y=170)

    def does_nothing(self):
        pass


class SecondClass(FirstClass):
    def __init__(self, root):
        super().__init__(root)
        root.geometry("680x600+450+200")

    def create_new_window(self):
        self.new_window = ToplevelFollower(self.master)
        self.new_window.geometry("680x600")#+450+200
        self.app = ThirdClassMain(self.new_window)


class ThirdClassMain(FirstClass):
    def __init__(self, master):
        # You don't always need to call the `FirstClass`'s constuctor if you don't want
        #super().__init__(master)
        self.top = master
        self.top.title("WINDOW 2")
        self.button = tk.Button(self.top, text="New1 Button", command=self.create_new_window)
        self.button.place(width=160, height=50, x=20, y=305)
        self.statusbar = tk.Label(self.top, text="New1 MENU")
        self.statusbar.pack(side="bottom", fill="x")

    def create_new_window(self):
        self.new_window = ToplevelFollower(self.top)
        self.new_window.geometry("680x600")#+450+200
        self.app = FourthClassMain(self.new_window)


class FourthClassMain(FirstClass):
    def __init__(self, master):
        super().__init__(master)
        # We aren't going to create a new label but we are going to update
        # The already existing one
        self.statusbar.config(text="New2 MENU")
        self.master.title("WINDOW 3")
        # Destroy the button that you don't need
        self.button.destroy()

    def create_new_window(self):
        pass


if __name__ == "__main__":
    root = tk.Tk()
    second_class = SecondClass(root)
    root.mainloop()

Todavía hay un problema: parpadea cuando se crea una nueva ventana, pero será difícil de solucionar.

0
TheLizzard 10 mar. 2021 a las 17:07