我有一个继承自父类的子类。我想修改和省略一些父类的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()
错误:
- 弹出窗口2应该只包含"New1 Button"但是它包含了所有来自父类 的按钮
- 弹出窗口2修改菜单标题应该只有"New1 menu "它不应该创建一个单独的标题,可以从代码 中看到
- 窗口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()
仍然有一个问题:当创建一个新窗口时,它会提示,但这将很难修复。