2013-06-23 4 views
0

Я пытаюсь отправить текстовое сообщение через Tkinter. Итак, вы вводите sms:hello. Это отправляет текстовое сообщение, которое сообщает hello. Для этого он отправляет электронное письмо с помощью сервера электронной почты AT & T и GMail. Таким образом, программа читает INFO.txt, которая содержит все аутентификации по электронной почте g_userg_pass и m_num. Затем он использует те, которые отправляют электронное письмо, которое отправляет текстовое сообщение.Глобальный и локальный Python

Теперь моя проблема в том, что 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() 

ответ

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 использовался до того, как было установлено

Чтобы решить эту проблему, вам нужно ответ почему по одному или обоим из этих вопросов. Почему он считает это местным, и/или почему не думает, что он не был установлен? Если вы мысленно пройдете через код, вы, вероятно, ответите на один или оба этих вопроса.

Например, задайте вопрос «как g_user» установить, если 'GMail_name:::' in line возвращает false? Вы подтвердили, что утверждение if истинно? Ваш код подготовлен для обработки случая, когда он является ложным? Вы буквально доказали себе, что утверждение if истинно, или вы просто считаете, что это правда?

Также ответьте на этот вопрос: читаете ли вы каждую строку из INFO.txt или читаете одну строку? Если вы читаете только одну строку, это намеренно? Похоже, вы ожидаете, что и имя пользователя, и пароль будут в позиции [13:] в строке, что будет невозможно, если оба значения отличаются друг от друга, и оба значения находятся в одной строке.

Поскольку вы сейчас учитесь программировать, не просто бросайте строки кода в файл и надеетесь, что они работают, и не заставите других решать ваши проблемы. думаю примерно какой компьютер делает. Пройдите логически логически, и проблемы станут очевидными.