2013-06-23 22 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:]的位置,如果兩個值都不相同,並且這兩個值都在同一行上,這將是不可能的。

由於您現在正在學習編程,所以不要只將代碼行放入文件中,並希望它們能夠正常工作,並且不要讓別人來解決您的問題。 認爲關於計算機在做什麼。從邏輯上逐步完成代碼,問題將變得不言而喻。