如何从Python中另一个类的方法继承变量

时间:2020-03-29 01:18:05

标签: python oop

基本上,我有一个程序可以制作两个单独的帧。当用户单击“登录”时,我要保存用户输入的内容,并在其他框架的类中使用它们。但是,我不知道如何继承这些。

import tkinter as tk
import tkinter.messagebox as msgbox

class emailCore(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title("Email Prime")
        self.geometry("800x480")
        self.resizable(0, 0)
        self.config(bg="white")
        self.columnconfigure(0, weight=1)

        self.windowFrame = tk.Frame(self)
        self.windowFrame.pack(side="top", fill="both", expand=True)
        self.windowFrame.grid_rowconfigure(0, weight=1)
        self.windowFrame.grid_columnconfigure(0, weight=1)

        frame = StartPage(self.windowFrame, self)
        frame.grid(row=0, column=0, sticky="nsew")

class StartPage(tk.Frame, emailCore):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        self.emaildict = {"GMail":"Smtp.gmail.com", "Yahoo":"Mail.yahoo.com", "Outlook":"Smtp.live.com"}

        self.emailstring = tk.StringVar()
        self.emailstring.set("GMail")
        self.email = tk.OptionMenu(self, self.emailstring, "GMail", "Yahoo", "Outlook")
        self.email.grid(column=1, row=1)

        accLabel = tk.Label(self, text="Emailaddress")
        accLabel.grid(column=1, row=2, pady=5)

        pwLabel = tk.Label(self, text="Lösenord")
        pwLabel.grid(column=1, row=3)

        self.accEntry = tk.Entry(self)
        self.accEntry.grid(column=2, row=2, ipadx=15, ipady=3)

        self.pwEntry = tk.Entry(self, show="*")
        self.pwEntry.grid(column=2, row=3, ipadx=15, ipady=3)

        self.loginButton = tk.Button(self, text="Logga in", command=self.sendpagemail)
        self.loginButton.grid(column=1, row=4, pady=5)

    def sendpagemail(self):
        self.acctest = str(self.accEntry.get())
        self.pwtest = str(self.pwEntry.get())
        self.emailtest = str(self.emailstring.get())

        frame = SendPage(s.windowFrame, self)
        frame.grid(row=0, column=0, sticky="nsew")

class SendPage(StartPage):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        print(StartPage.acctest) # Here is where I want to print the variable I created in the method sendmailpage inside the class StartPage

        ToLabel = tk.Label(self, text="To: ")
        ToLabel.grid(column=1, row=1, sticky="w")
        self.ToEntry = tk.Entry(self)
        self.ToEntry.grid(column=2, row=1, sticky="w", ipadx=15, ipady=3)

        SubjectLabel = tk.Label(self, text="Subject:")
        SubjectLabel.grid(column=1, row=2, sticky="w")
        self.SubjectEntry = tk.Entry(self)
        self.SubjectEntry.grid(column=2, row=2, sticky="w", ipadx=15, ipady=3)

        TextBoxLabel = tk.Label(self, text="Mail: ")
        TextBoxLabel.grid(column=1, row=3)
        self.TextBoxEntry = tk.Text(self)
        self.TextBoxEntry.grid(column=2, row=3)

        sendButton = tk.Button(self, text="Skicka")
        sendButton.grid(column=2, row=4, sticky="w")


if __name__ == '__main__':
    s = emailCore()
    s.mainloop()

基本上,我希望第print(StartPage.acctest)行可以访问分配给第一堂课的任何考试。

1 个答案:

答案 0 :(得分:0)

执行此行时:

frame = SendPage(s.windowFrame, self)

您正在调用函数SendPage.__init__,该函数的声明如下:

def __init__(self, parent, controller):

因此,在调用中被命名为“ s.windowFrame”的对象在函数中被命名为“ parent”。在调用中被命名为“ self”的对象在函数中被命名为“ controller”。它们是相同的对象,只是名称不同。

在调用中以“ self.acctest”命名的变量将在函数中由“ controller.acctest”命名。这是因为调用中的“自我”在函数中被命名为“控制器”。这是Python工作方式的基础。它们是同一对象,因此您可以使用“。”访问该对象的变量。符号。

将打印对帐单更改为:

print(controller.acctest)

我看到您的程序还有其他问题,但这应该可以使您继续前进。