如何使用python修改子类中父类的继承属性



我有一个继承自父类的子类。我想修改和省略一些父类的init属性时,从子类调用。但是,我无法覆盖属性。下面是我的代码

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()

错误:

  1. 弹出窗口2应该只包含"New1 Button"但是它包含了所有来自父类
  2. 的按钮
  3. 弹出窗口2修改菜单标题应该只有"New1 menu "它不应该创建一个单独的标题,可以从代码
  4. 中看到
  5. 窗口3应该只包含"虚拟按钮"如何删除"按钮"?

这是不可能的吗??

从以上所有的观点来看,很明显我忽略了继承的基本概念以及如何修改父属性。请引导我。谢谢你

有答案或指南吗?我已经等了这么久了

试试这个:

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()

我不确定这是否是你所需要的,但我想我涵盖了你所有的问题。我还重命名了一些变量,使其更python化。你有很多无缘无故的空白,这通常是不鼓励的。

编辑

带有绑定的代码:

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()

仍然有一个问题:当创建一个新窗口时,它会提示,但这将很难修复。

最新更新