Python类-从父类到顶级继承属性

如何解决Python类-从父类到顶级继承属性

我正在尝试使用OOP方法来创建从Parent类继承到顶层的类。我想将self.txtofNameWindow1转到Window2类。但是它会引发“ AttributeError:类型对象'Window1'没有属性'txtofName'”。谁能帮我吗?

from tkinter import *
from PIL import Image,ImageTk
import time
from tkinter import ttk

class Window1(object):
    def __init__(self,master):
        self.master = master
        self.master.geometry = ('1600x750+0+0')
        self.master.config(bg='powder blue')
        self.master.title('ALVO HOTEL')
        
        # ==========Framing============
        self.ftop = Frame(master,width=1600,height=100,bg='powder blue',relief=RIDGE,pady=20)
        self.ftop.grid(columnspan=3,column=0,row=0)
        self.f1 = Frame(master,width=800,height=700,relief=SUNKEN,pady=50,bd=3)
        self.f1.grid(column=1,row=2,sticky="nsew")
        self.f4 = Frame(master,width=100,padx=20,bd=3)
        self.f4.grid(column=2,sticky="nsew")


        self.labelofName = Label(self.f1,font=('arial',16,'bold'),text='Name: ',bd=10,anchor=W)
        self.labelofName.grid(row=0,pady=(20,10))
        self.txtofName = Entry(self.f1,insertwidth=4,bg='white',justify='left')
        self.txtofName.grid(row=0,column=1,10))

        self.btnNext = Button(self.f1,padx=10,pady=8,fg='white',10,width=10,text='Next Page',bg='green',command=self.new_window_pop)
        self.btnNext.grid(row=6,sticky=E)
        
    def new_window_pop(self):
        Window2(Toplevel(self.master))


class Window2(Window1):
    def __init__(self,master):
        self.master = master
        self.master.geometry = ('1350x750+0+0')
        self.master.config(bg='powder blue')
        self.master.title('User information and Payment')

        self.ftitle = Frame(master,width=1350,padx=20)
        self.ftitle.grid(columnspan=3,row=0)
        self.ftitle2 = Frame(master,padx=20)
        self.ftitle2.grid(columnspan=3,row=3,pady=(0,20))
        self.fbutton = Frame(master,height=50,pady=20)
        self.fbutton.grid(columnspan=3,row=2)
        self.finfomain = Frame(master,height=400,relief=RIDGE)
        self.finfomain.grid(columnspan=3,row=1)

        self.finfo1 = Frame(self.finfomain,bd=5,width=900,height=300,padx=10)
        self.finfo1.grid(column=0,row=0)
        self.finfo1a = Frame(self.finfomain,padx=20)
        self.finfo1a.grid(column=0,row=1)
        self.finfo2 = Frame(self.finfomain,width=450,padx=20)
        self.finfo2.grid(column=1,row=0,rowspan=2)

        name = Window1.txtofName.get()
        self.FirstName = StringVar()

        self.lblfirstname = Label(self.finfo1,bg='powderblue',text='First Name:',padx=2)
        self.lblfirstname.grid(row=0,sticky=W)
        self.txtfirstfname = Entry(self.finfo1,textvariable=self.FirstName,bd=3,insertwidth=5,justify='left')
        self.txtfirstfname.grid(row=0,column=1)
        
def main():
    root = Tk()
    app = Window1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

完整追溯:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\python385\lib\tkinter\__init__.py",line 1883,in __call__
    return self.func(*args)
  File "d:/Code/Cpet5/new.py",line 31,in new_window_pop
    Window2(Toplevel(self.master))
  File "d:/Code/Cpet5/new.py",line 57,in __init__
    name = Window1.txtofName.get()
AttributeError: type object 'Window1' has no attribute 'txtofName'

解决方法

遵循这些步骤

不要 app = Window1(root) 因为您已经在Window2中继承了Window1

因此,使用super在Window2中初始化

super().__init__(master)

现在您可以为Window1做任何事情, 为按钮分配命令 self.btnNext.config(command=self.new_window_pop)

现在为“顶级窗口”创建方法:

这是您的完整代码:

from tkinter import *
from PIL import Image,ImageTk
import time
from tkinter import ttk


class Window1(object):
    def __init__(self,master):
        self.master = master
        self.master.geometry = ('1600x750+0+0')
        self.master.config(bg='powder blue')
        self.master.title('ALVO HOTEL')

        # ==========Framing============
        self.ftop = Frame(master,width=1600,height=100,bg='powder blue',relief=RIDGE,pady=20)
        self.ftop.grid(columnspan=3,column=0,row=0)
        self.f1 = Frame(master,width=800,height=700,relief=SUNKEN,pady=50,bd=3)
        self.f1.grid(column=1,row=2,sticky="nsew")
        self.f4 = Frame(master,width=100,padx=20,bd=3)
        self.f4.grid(column=2,sticky="nsew")

        self.labelofName = Label(self.f1,font=('arial',16,'bold'),text='Name: ',bd=10,anchor=W)
        self.labelofName.grid(row=0,pady=(20,10))
        self.txtofName = Entry(self.f1,insertwidth=4,bg='white',justify='left')
        self.txtofName.grid(row=0,column=1,10))

        self.btnNext = Button(self.f1,padx=10,pady=8,fg='white',10,width=10,text='Next Page',bg='green')
        self.btnNext.grid(row=6,sticky=E)


class Window2(Window1):
    def __init__(self,master):
        super().__init__(master)
        self.btnNext.config(command=self.new_window_pop)

    def new_window_pop(self):
        self.master = Toplevel(self.master)
        self.master.geometry = '1350x750+0+0'
        self.master.config(bg='powder blue')
        self.master.title('User Information and Payment')

        self.ftitle = Frame(self.master,width=1350,padx=20)
        self.ftitle.grid(columnspan=3,row=0)
        self.ftitle2 = Frame(self.master,padx=20)
        self.ftitle2.grid(columnspan=3,row=3,pady=(0,20))
        self.fbutton = Frame(self.master,height=50,pady=20)
        self.fbutton.grid(columnspan=3,row=2)
        self.finfomain = Frame(self.master,height=400,relief=RIDGE)
        self.finfomain.grid(columnspan=3,row=1)

        self.finfo1 = Frame(self.finfomain,bd=5,width=900,height=300,padx=10)
        self.finfo1.grid(column=0,row=0)
        self.finfo1a = Frame(self.finfomain,padx=20)
        self.finfo1a.grid(column=0,row=1)
        self.finfo2 = Frame(self.finfomain,width=450,padx=20)
        self.finfo2.grid(column=1,row=0,rowspan=2)

        name = self.txtofName.get()
        self.FirstName = StringVar()

        self.lblfirstname = Label(self.finfo1,bg='powderblue',text='First Name:',padx=2)
        self.lblfirstname.grid(row=0,sticky=W)
        self.txtfirstfname = Entry(self.finfo1,textvariable=self.FirstName,bd=3,insertwidth=5,justify='left')
        self.txtfirstfname.grid(row=0,column=1)


def main():
    root = Tk()
    app = Window2(root)
    root.mainloop()


if __name__ == '__main__':
    main()

如果您需要任何解释,请在评论中提问。

,

嗨,詹姆斯,我想问题是,让Windows2类继承Windows1类是错误的。我做了一些更改,例如

def new_window_pop(self):
        #avoid declaring the class type here
        #Window2(Toplevel(self.master))
        #and pass self because you can thought to self as master...
        Window2(self)

在windows2中,请注意,我们将几何图形,配置,标题声明为self,这里self是新窗口,而self.parent是window1

#declare class type directly...

class Window2(Toplevel):
    def __init__(self,parent):
    super().__init__()

    #Windows2 recive a parent....
    self.parent = parent
    self.geometry = ('1350x750+0+0')
    self.config(bg='powder blue')
    self.title('User Information and Payment')

尤其是

 #here the reference is wrong
    #name = Window1.txtofName.get()
    #the right reference is self.parent....
    name = self.parent.txtofName.get()
    self.FirstName = StringVar()
    #here,if you need to use the textvariable you must first assign it
    self.FirstName.set(name)

这里是全文,请尝试。

from tkinter import *
from PIL import Image,ImageTk
import time
from tkinter import ttk

class Window1(object):
    def __init__(self,master):
        self.master = master
        self.master.geometry = ('1600x750+0+0')
        self.master.config(bg='powder blue')
        self.master.title('ALVO HOTEL')
        
        # ==========Framing============
        self.ftop = Frame(master,sticky="nsew")


        self.labelofName = Label(self.f1,bg='green',command=self.new_window_pop)
        self.btnNext.grid(row=6,sticky=E)
        
    def new_window_pop(self):
        #avoid declaring the class type here
        #Window2(Toplevel(self.master))
        #and pass self...self = master
        Window2(self)

#declare class type directly...
class Window2(Toplevel):
    def __init__(self,parent):
        super().__init__()

        #Windows2 recive a parent....
        self.parent = parent
        self.geometry = ('1350x750+0+0')
        self.config(bg='powder blue')
        self.title('User Information and Payment')

        #notice this Frame(self,....
        self.ftitle = Frame(self,row=0)
        self.ftitle2 = Frame(self,20))
        self.fbutton = Frame(self,row=2)
        self.finfomain = Frame(self,rowspan=2)

        #here the reference is wrong
        #name = Window1.txtofName.get()
        #the right reference is self.parent....
        name = self.parent.txtofName.get()
        self.FirstName = StringVar()
        #here,if you need to use the textvariable you must first assign it
        self.FirstName.set(name)

        self.lblfirstname = Label(self.finfo1,column=1)

        
        
def main():
    root = Tk()
    app = Window1(root)
    root.mainloop()

if __name__ == '__main__':
    main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?