Как наследовать переменную из метода в другом классе в Python - PullRequest
1 голос
/ 29 марта 2020

В принципе, у меня есть программа, которая делает два отдельных кадра. Когда пользователь нажимает «Logga in», я хочу сохранить записи, сделанные пользователем, и использовать их в классе для другого фрейма. Тем не менее, я не понимаю, как я наследую их.

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) имела доступ к любому назначению acctest, назначенному в первом классе.

1 Ответ

0 голосов
/ 29 марта 2020

Когда вы выполняете эту строку:

frame = SendPage(s.windowFrame, self)

вы вызываете функцию SendPage.__init__, которая объявляется так:

def __init__(self, parent, controller):

Итак, объект с именем "s .windowFrame "в вызове называется" родительским "в функции. и объект, который был назван "self" в вызове, назван "controller" в функции. Это одни и те же объекты под разными именами.

Переменная с именем "self.acctest" в вызове будет называться "controller.acctest" в функции. Это потому, что «self» в вызове называется «controller» в функции. Это основа c на том, как Python работает. Это один и тот же объект, поэтому вы можете получить доступ к переменным объекта с помощью "." нотация.

Измените оператор печати на:

print(controller.acctest)

Я вижу некоторые другие проблемы с вашей программой, но это должно позволить вам двигаться вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...