我正在尝试通过Tkinter发送短信。所以你输入了sms:hello
。这会发送一条说明hello
的短信。为此,它使用AT& T电子邮件服务器和GMail通过电子邮件发送单词。因此,该计划会显示INFO.txt
,其中包含所有电子邮件身份验证g_user
g_pass
和m_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()
答案 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:]
位置,如果两个值不同且两个值都在同一行,则无法进行。
由于您刚刚学习编程,不要将代码行放入文件中并希望它们能够正常运行,并且不会让其他人解决您的问题。 思考关于计算机正在做什么。逻辑上逐步执行代码,问题将变得不言而喻。