Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中的类之间共享变量_Python_Python 2.7_Smtp - Fatal编程技术网

如何在Python中的类之间共享变量

如何在Python中的类之间共享变量,python,python-2.7,smtp,Python,Python 2.7,Smtp,我目前正在尝试创建一个基本的Gmail客户端,我正在尝试在两个类之间共享我的登录详细信息,Authen和Application。我需要访问在Authen类中输入的学分,但我不太清楚如何访问。这是我当前的代码,在class应用程序中: Username_mine = passcheck.Create_Widgets.Username.get() Password_mine = passcheck.Create_Widgets.Password.get() contents = self.Body.

我目前正在尝试创建一个基本的Gmail客户端,我正在尝试在两个类之间共享我的登录详细信息,
Authen
Application
。我需要访问在
Authen
类中输入的学分,但我不太清楚如何访问。这是我当前的代码,在class
应用程序中:

Username_mine = passcheck.Create_Widgets.Username.get()
Password_mine = passcheck.Create_Widgets.Password.get()
contents = self.Body.get("0.0", END)
FROM = "Unknown"
subject = self.Subject_Entry.get()
recipients = self.To_Entry.get()
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.login(Username_mine, Password_mine)
server.sendmail(FROM, recipients, contents)
当我运行代码时,我得到一个错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "/Users/BigKids/Desktop/Coding/Python 2/Email/Email Send GUI V1.py", line 112, in send_cmd
    Username_mine = passcheck.Create_Widgets.Username.get()
AttributeError: 'function' object has no attribute 'Username'
提前谢谢你的帮助

编辑以下是我的代码:

#Email Send v3 Program. It has a basic GUI to send emails.

from Tkinter import *
import smtplib
import string
import random

def random_char():
    char_select = random.randrange(52)
    char_choice = string.ascii_letters[char_select]
    return char_choice

class Authen(Frame):
    """Holds authentication code and basic GUI stuff"""
    def __init__(self, master):
        """Start Authen GUI"""
        Frame.__init__(self, master)
        self.grid()
        self.Create_Widgets()

    def Create_Widgets(self):
        """Spawns the widgets"""
        self.Usertext = Label(self, text = "Username: ")
        self.Usertext.grid(row = 0, column = 0)
        self.Username = Entry(self)
        self.Username.grid(row = 0, column = 1)

        self.Passtext = Label (self, text = "Password: ")
        self.Passtext.grid(row = 1, column = 0)
        self.Password = Entry (self, show = "*")
        self.Password.grid(row = 1, column = 1)

        self.Submit = Button(self, text = "Submit Credits",
                        command = self.authen_credits)
        self.Submit.grid()

    def authen_credits(self):
        """Backbone of authen process"""
        Username_mine = self.Username.get()
        Password_mine = self.Password.get()
        server = smtplib.SMTP('smtp.gmail.com:587')
        server.ehlo()
        server.starttls()
        while True:
            try:
                server.login(Username_mine,Password_mine)
                #make my screen dimensions work
                w = 500
                h = 1000
                app = Application()
                app.title("SMTP Mail Client")
                app.geometry("%dx%d" % (w, h))
                break
            except smtplib.SMTPAuthenticationError:
                print "Login Failed"

class Application(Toplevel):
    """Toplevel Frame, holds sendmail stuff"""
    def __init__(self):
        """Start the toplevel Frame"""
        Toplevel.__init__(self)
        self.grid()
        self.entryFun()
        self.mainFun()

    def entryFun(self):
        """Holds entry Frame"""
        self.entryFrame = Frame(self)
        self.entryFrame.grid(row = 0, column = 0, sticky = W)

        self.To_Lbl = Label(self.entryFrame, text = "TO:  ")
        self.To_Lbl.grid(row = 0, column = 0, sticky = W)

        self.To_Entry = Entry(self.entryFrame)
        self.To_Entry.grid(row = 0, column = 1, sticky = W)


        self.Subject_Lbl = Label(self.entryFrame, text = "Subject:  ")
        self.Subject_Lbl.grid(row = 1, column = 0, sticky = W)

        self.Subject_Entry = Entry(self.entryFrame)
        self.Subject_Entry.grid(row = 1, column = 1, sticky = W)

    def mainFun(self):
        """Holds body of thing"""
        self.entryFrame = Frame(self)
        self.entryFrame.grid(row = 1, column = 0, sticky = W)


        self.Body = Text(self.entryFrame, width = 75, height = 50, relief = GROOVE, bd = 5)
        self.Body.grid()

        self.send_mail = Button(self, text = "Send Mail",
                                command = self.send_cmd)
        self.send_mail.grid()

    def send_cmd(self):
        Username_mine = passcheck.Create_Widgets.Username.get()
        Password_mine = passcheck.Create_Widgets.Password.get()
        contents = self.Body.get("0.0", END)
        FROM = "Unknown"
        subject = self.Subject_Entry.get()
        recipients = self.To_Entry.get()
        server = smtplib.SMTP('smtp.gmail.com:587')
        server.ehlo()
        server.starttls()
        server.login()
        server.sendmail(FROM, recipients, contents)

root = Tk()
root.title("Login")
root.geometry("500x500")
passcheck = Authen(root)

root.mainloop()

您确定用户名是函数对象的实际成员吗?
(确保您在函数类中使用的是self.Username而不是Username

创建窗口小部件是函数而不是类,因此您无法访问其中的.Username

您需要做的是将Authen实例传递给应用程序类,并将其存储在self.Authen中。然后应用程序中的函数可以执行以下操作:self.authen.Username

通过简单浏览代码,您可以修改应用程序的
\uuuu init\uuuu
,使其接受“authen”变量:

def __init__(self, authen):
  # Other stuff.
  self.authen=authen 
然后,您将使用初始化应用程序
app=Application(authen=self)


send\u cmd()
中,您将调用:
Username\u mine=self.authen.Username.get()
您将获得错误,因为
Create\u Widgets()
authen
类的方法函数,因此其中的
self.Username=Entry(self)
Username
作为实例的一个属性,不是方法。鉴于此,假设
passcheck
就是这样一个例子,我认为您需要编写:

Username_mine = passcheck.Username.get()

您可以向应用程序的构造函数传递对类Authen的引用。这样,应用程序就可以访问登录详细信息,您需要提供更多的代码,比如
Create\u小部件
function/class