亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python類-從父類繼承屬性到頂層

Python類-從父類繼承屬性到頂層

慕田峪9158850 2023-10-26 16:31:57
我正在嘗試使用 OOP 方法來創建從父類繼承到頂層的類。我想得到上課的self.txtofName時間。但它會引發“AttributeError:類型對象'Window1'沒有屬性'txtofName'”。誰能幫我?Window1Window2from tkinter import *from PIL import Image, ImageTkimport timefrom tkinter import ttkclass 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, bg='powder blue', pady=50, bd=3)        self.f1.grid(column=1, row=2, sticky="nsew")        self.f4 = Frame(master, width=100, height=700, relief=SUNKEN, bg='powder blue', pady=50, padx=20, bd=3)        self.f4.grid(column=2, row=2, sticky="nsew")        self.labelofName = Label(self.f1, font=('arial', 16, 'bold'), text='Name: ', bg='powder blue', bd=10, anchor=W)        self.labelofName.grid(row=0, column=0, pady=(20, 10))        self.txtofName = Entry(self.f1, font=('arial', 16, 'bold'), bd=10, insertwidth=4, bg='white', justify='left')        self.txtofName.grid(row=0, column=1, pady=(20, 10))        self.btnNext = Button(self.f1, padx=10, pady=8, bd=10, fg='white', font=('arial', 10, 'bold'), width=10, text='Next Page', bg='green', command=self.new_window_pop)        self.btnNext.grid(row=6, column=1, sticky=E)            def new_window_pop(self):        Window2(Toplevel(self.master))
查看完整描述

2 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

嗨詹姆斯我認為問題是你讓 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中,請注意我們將geometry、config、title聲明為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, 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, bg='powder blue', pady=50, bd=3)

        self.f1.grid(column=1, row=2, sticky="nsew")

        self.f4 = Frame(master, width=100, height=700, relief=SUNKEN, bg='powder blue', pady=50, padx=20, bd=3)

        self.f4.grid(column=2, row=2, sticky="nsew")



        self.labelofName = Label(self.f1, font=('arial', 16, 'bold'), text='Name: ', bg='powder blue', bd=10, anchor=W)

        self.labelofName.grid(row=0, column=0, pady=(20, 10))

        self.txtofName = Entry(self.f1, font=('arial', 16, 'bold'), bd=10, insertwidth=4, bg='white', justify='left')

        self.txtofName.grid(row=0, column=1, pady=(20, 10))


        self.btnNext = Button(self.f1, padx=10, pady=8, bd=10, fg='white', font=('arial', 10, 'bold'), width=10, text='Next Page', bg='green', command=self.new_window_pop)

        self.btnNext.grid(row=6, column=1, 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, bd=10, width=1350, bg='powder blue', relief=RIDGE, padx=20)

        self.ftitle.grid(columnspan=3, column=0, row=0)

        self.ftitle2 = Frame(self, bd=10, width=1350, height=100, bg='powder blue', relief=RIDGE, padx=20)

        self.ftitle2.grid(columnspan=3, column=0, row=3, pady=(0,20))

        self.fbutton = Frame(self, width=1350, height=50, bg='powder blue', relief=RIDGE, padx=10, pady=20)

        self.fbutton.grid(columnspan=3, column=0, row=2)

        self.finfomain = Frame(self, bd=10, width=1350, height=400, bg='powder blue', relief=RIDGE)

        self.finfomain.grid(columnspan=3, column=0, row=1)


        self.finfo1 = Frame(self.finfomain, bd=5, width=900, height=300, bg='powder blue', relief=RIDGE, padx=10)

        self.finfo1.grid(column=0, row=0)

        self.finfo1a = Frame(self.finfomain, bd=5, width=900, height=100, bg='powder blue', relief=RIDGE, padx=20)

        self.finfo1a.grid(column=0, row=1)

        self.finfo2 = Frame(self.finfomain, bd=5, width=450, height=400, bg='powder blue', relief=RIDGE, padx=20)

        self.finfo2.grid(column=1, row=0, 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, font=('arial', 16, 'bold'), bg='powderblue', text='First Name:', padx=2)

        self.lblfirstname.grid(row=0, column=0, sticky=W)

        self.txtfirstfname = Entry(self.finfo1, font=('arial', 16, 'bold'), textvariable=self.FirstName, bd=3, insertwidth=5, bg='white', justify='left')

        self.txtfirstfname.grid(row=0, column=1)


        

        

def main():

    root = Tk()

    app = Window1(root)

    root.mainloop()


if __name__ == '__main__':

    main()



查看完整回答
反對 回復 2023-10-26
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

按著這些次序

不要這樣做 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, bg='powder blue', pady=50, bd=3)

        self.f1.grid(column=1, row=2, sticky="nsew")

        self.f4 = Frame(master, width=100, height=700, relief=SUNKEN, bg='powder blue', pady=50, padx=20, bd=3)

        self.f4.grid(column=2, row=2, sticky="nsew")


        self.labelofName = Label(self.f1, font=('arial', 16, 'bold'), text='Name: ', bg='powder blue', bd=10, anchor=W)

        self.labelofName.grid(row=0, column=0, pady=(20, 10))

        self.txtofName = Entry(self.f1, font=('arial', 16, 'bold'), bd=10, insertwidth=4, bg='white', justify='left')

        self.txtofName.grid(row=0, column=1, pady=(20, 10))


        self.btnNext = Button(self.f1, padx=10, pady=8, bd=10, fg='white', font=('arial', 10, 'bold'), width=10,

                              text='Next Page', bg='green')

        self.btnNext.grid(row=6, column=1, 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, bd=10, width=1350, bg='powder blue', relief=RIDGE, padx=20)

        self.ftitle.grid(columnspan=3, column=0, row=0)

        self.ftitle2 = Frame(self.master, bd=10, width=1350, height=100, bg='powder blue', relief=RIDGE, padx=20)

        self.ftitle2.grid(columnspan=3, column=0, row=3, pady=(0, 20))

        self.fbutton = Frame(self.master, width=1350, height=50, bg='powder blue', relief=RIDGE, padx=10, pady=20)

        self.fbutton.grid(columnspan=3, column=0, row=2)

        self.finfomain = Frame(self.master, bd=10, width=1350, height=400, bg='powder blue', relief=RIDGE)

        self.finfomain.grid(columnspan=3, column=0, row=1)


        self.finfo1 = Frame(self.finfomain, bd=5, width=900, height=300, bg='powder blue', relief=RIDGE, padx=10)

        self.finfo1.grid(column=0, row=0)

        self.finfo1a = Frame(self.finfomain, bd=5, width=900, height=100, bg='powder blue', relief=RIDGE, padx=20)

        self.finfo1a.grid(column=0, row=1)

        self.finfo2 = Frame(self.finfomain, bd=5, width=450, height=400, bg='powder blue', relief=RIDGE, padx=20)

        self.finfo2.grid(column=1, row=0, rowspan=2)


        name = self.txtofName.get()

        self.FirstName = StringVar()


        self.lblfirstname = Label(self.finfo1, font=('arial', 16, 'bold'), bg='powderblue', text='First Name:', padx=2)

        self.lblfirstname.grid(row=0, column=0, sticky=W)

        self.txtfirstfname = Entry(self.finfo1, font=('arial', 16, 'bold'), textvariable=self.FirstName, bd=3,

                                   insertwidth=5, bg='white', justify='left')

        self.txtfirstfname.grid(row=0, column=1)



def main():

    root = Tk()

    app = Window2(root)

    root.mainloop()



if __name__ == '__main__':

    main()


如果您需要任何解釋,請在評論中詢問。


查看完整回答
反對 回復 2023-10-26
  • 2 回答
  • 0 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號