2013-06-23 21 views
0

我想通过Tkinter发送文本消息。所以你输入sms:hello。这会发送一条文字信息,表示hello。要做到这一点,它使用AT电子邮件服务器和GMail电子邮件发送该单词。所以程序读取INFO.txt其中包含所有的电子邮件认证g_userg_passm_num。然后它使用那些发送发送文本消息的电子邮件。我的问题是UnboundLocalError: local variable 'g_user' referenced before assignment。我知道这是由不是global变量的东西造成的。谁能帮我吗?我难倒...全局和本地Python

root = Tk() 
#open file 
file=open('INFO.txt') 
line=file.readline() 
if 'Mobile_number:::' in line: 
    m_num=line[16:] 
if 'GMail_name:::' in line: 
    g_user=line[13:] 
if 'GMail_pass:::' in line: 
    g_pass=line[13:] 



def callback(event): 
    text = inputfield.get() 
    if 'sms:' in text: 
     textmessage() 



def textmessage():#sms: 
    import smtplib 
     #open file 
    file=open('INFO.txt') 
    line=file.readline() 
    if 'Mobile_number:::' in line: 
     m_num=line[16:] 
    if 'GMail_name:::' in line: 
     g_user=line[13:] 
    if 'GMail_pass:::' in line: 
     g_pass=line[13:] 

     SMTP_SERVER = 'smtp.gmail.com' 
    SMTP_PORT = 587 

    sender = '{}@gmail.com'.format(g_user) 
    password='{}'.format(g_pass) 
    recipient = '{}@txt.att.net'.format(m_num) 
    subject = 'Gmail SMTP Test' 
    body = text[4:] 

    "Sends an e-mail to the specified recipient." 

    body = "" + body + "" 

    headers = ["From: " + sender, 
       "Subject: " + subject, 
       "To: " + recipient, 
       "MIME-Version: 1.0", 
       "Content-Type: text/html"] 
    headers = "\r\n".join(headers) 

    session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) 

    session.ehlo() 
    session.starttls() 
    session.ehlo 
    session.login(sender, password) 

    session.sendmail(sender, recipient, headers + "\r\n\r\n" + body) 
    session.quit() 

    text2=text[4:] 
    confirmation="SMS containing '{}' sent".format(text2) 
    tex.insert(END,confirmation) 



tex=Text(root) 
tex.pack(side='right') 


inputfield = Entry(root) 
inputfield.pack(side='bottom') 
inputfield.bind('<Return>', callback) 


root.mainloop() 

回答

1

问题是最有可能与这条线:

sender = '{}@gmail.com'.format(g_user) 

因为if语句条件(if 'GMail_name:::' in line)正在评估对False,然后你g_user变量从未定义在该函数的本地范围内。

0

仔细看的错误消息:

UnboundLocalError: local variable 'g_user' referenced before assignment 

拇指的一个非常不错的准则是假设该错误消息说的是实话。在这种情况下,它是告诉你两个非常重要的细节:

  • 它认为g_user是一个局部变量
  • 它认为它被设置

为了解决这个问题之前,使用g_user,则需要回答为什么这些问题中的一个或两个。 为什么它认为它是本地的,和/或为什么它认为它没有设置?如果您在思维上逐步完成代码,您可能会回答其中一个或两个问题。

例如,如果'GMail_name:::' in line返回false,请问自己“g_user”如何设置?你是否证实if语句是真的?你的代码是否准备好处理它是错误的情况?你是否真的向你自己证明if语句是真的,还是你只是假设它是真的?

另外,回答这个问题:你是读INFO.txt的每一行还是阅读单行?如果你只读一行,那是故意的吗?它看起来像你期待的用户名和密码都在[13:]的位置,如果两个值都不相同,并且这两个值都在同一行上,这将是不可能的。

由于您现在正在学习编程,所以不要只将代码行放入文件中,并希望它们能够正常工作,并且不要让别人来解决您的问题。 认为关于计算机在做什么。从逻辑上逐步完成代码,问题将变得不言而喻。