全局和本地Python

时间:2013-06-23 16:31:58

标签: python python-3.x tkinter global

我正在尝试通过Tkinter发送短信。所以你输入了sms:hello。这会发送一条说明hello的短信。为此,它使用AT& T电子邮件服务器和GMail通过电子邮件发送单词。因此,该计划会显示INFO.txt,其中包含所有电子邮件身份验证g_user g_passm_num。然后它使用它们发送发送短信的电子邮件。

现在我的问题是UnboundLocalError: local variable 'g_user' referenced before assignment。我所知道的是由不是global变量的东西引起的。谁能帮我吗?我很难过......

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()

2 个答案:

答案 0 :(得分:1)

问题最有可能是这一行:

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

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

答案 1 :(得分:0)

仔细查看错误消息:

UnboundLocalError: local variable 'g_user' referenced before assignment

一个很好的经验法则是假设错误信息说实话。在这种情况下,它告诉你两个非常重要的细节:

  • 它认为g_user是一个局部变量
  • 它认为g_user在设置之前已被使用

要解决此问题,您需要回答为什么一个或两个问题。 为什么认为它是本地的,和/或为什么它认为它没有设置?如果您在心理上逐步完成代码,您可能会回答其中一个或两个问题。

例如,问自己问题&#34; g_user&#34;如果'GMail_name:::' in line返回false,则设置为get?你确认if语句是真的吗?您的代码是否准备好处理它错误的情况?您是否真的向自己证明if语句是真的,或者您只是假设它是真的?

另外,回答这个问题:你是从INFO.txt读取每一行,还是在读一行?如果您只阅读一行,那是故意的吗?看起来您希望用户名和密码都位于行中的[13:]位置,如果两个值不同且两个值都在同一行,则无法进行。

由于您刚刚学习编程,不要将代码行放入文件中并希望它们能够正常运行,并且不会让其他人解决您的问题。 思考关于计算机正在做什么。逻辑上逐步执行代码,问题将变得不言而喻。