Уведомления

Группа в Telegram: @pythonsu

#1 Июль 26, 2010 14:11:02

sergey144010
От:
Зарегистрирован: 2010-07-26
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и кодировка

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib, os
import time
from Tkinter import *
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import Encoders

def output(event):

file_base=ent0.get()
me=ent1.get()
text=tex2.get(1.0,END)
subj=ent3.get()
dir_vlozh=ent4.get()
server=ent5.get()
port=ent6.get()
user_name=ent7.get()
user_passwd=ent8.get()

tex9.insert(END,"... Запускаемся ...\n")
print "... Запускаемся ..."
tex9.insert(END,me+"\n")
print me
try:
f=open(file_base,"r")
except:
tex9.insert(END,"НЕ НАЙДЕН ФАЙЛ С БАЗОЙ АДРЕСОВ\n")
print 'НЕ НАЙДЕН ФАЙЛ С БАЗОЙ АДРЕСОВ'
mas=f.readlines()
kol_vo=len(mas)
y=0

for i in mas:
# print i


# отправитель cp1251 koi8-r
# в me нельзя ставить запятые
# me = 'XXX'
me = unicode(me, "utf-8").encode(me,"cp1251")
# получатель
#you = ''
you = i
# текст письма
# text = 'Добрый день!\n'
text = unicode(text, "utf-8").encode("cp1251")
# заголовок письма
# subj = 'xxx'
subj = unicode(subj, "utf-8").encode("cp1251")
# вложения
myfile_mas=os.listdir(dir_vlozh)

# параметры SMTP-сервера
# server = "xxx" # "smtp.bk.ru"
# port = 25
# user_name = "xxx@xxx.ru"
# user_passwd = "xxx"

# msg = MIMEText(text, "", "cp1251")
msg = MIMEMultipart()
msg['Subject'] = subj
msg['From'] = me
msg['To'] = you
# msg.attach(MIMEText(text, "", "cp1251"))

# Перебираем массив вложений
for myfile in myfile_mas:
part = MIMEBase('application', "octet-stream")
part.set_payload(open(dir_vlozh+"/"+myfile,"rb").read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="%s"' % os.path.basename(myfile))
msg.attach(part)

tex9.insert(END,"Отправляем по адресу "+i+" "+time.ctime()+"\n")
print "Отправляем по адресу ",i, time.ctime()
try:
s = smtplib.SMTP(server, port)
except:
print '+++++++++++++++++++++++++++++++++++++++++'
print 'ОШИБКА ! НЕТ КОННЕКТА К SMTP-СЕРВЕРУ !'
print 'Ждём 5 минут и пытаемся снова подключиться'
print 'Если ничего не выйдет вылезет 5 ошибок и остановка рассылки'
print '+++++++++++++++++++++++++++++++++++++++++'
time.sleep(300)
s = smtplib.SMTP(server, port)
# s.starttls()
try:
s.login(user_name, user_passwd)
except:
print '+++++++++++++++++++++++++++++++++++++++++'
print 'ОШИБКА ! Неверный логин или пароль для '
print 'доступа к почтовому ящику !!! '
print '+++++++++++++++++++++++++++++++++++++++++'
exit('Аварийное завершение работы программы\n+++++++++++++++++++++++++++++++++++++++++')
s.sendmail(me, you, msg.as_string())
s.quit()
tex9.insert(END,"отправили\n")
print "отправили"

y=y+1
ostatok=int(kol_vo)-int(y)
tex9.insert(END,"Осталось ")
tex9.insert(END,ostatok)
tex9.insert(END," адресов\n")
print "Осталось ",ostatok," адресов\n"
tex9.insert(END,"Ждём 10 сек.\n")
print "Ждём 10 сек.\n"
time.sleep(10)

tex9.insert(END,"... Работа завершена ...\n")
print "... Работа завершена ..."

##############################################################################
root = Tk()

lab0 = Label(root, text="Путь до файла базы адресов, включая сам файл:", font="Arial 10")
ent0 = Entry(root,width=40,bd=3)
ent0.insert(END,"/tmp/base.txt")

lab1 = Label(root, text="Отправитель:", font="Arial 10")
ent1 = Entry(root,width=40,bd=3)
ent1.insert(END,"xxx")

lab2 = Label(root, text="Текст письма:", font="Arial 10")
tex2 = Text(root,width=50,height=20,font="Verdana 10",wrap=WORD)
tex2.insert(END,"Добрый день!\n")

lab3 = Label(root, text="Тема:", font="Arial 10")
ent3 = Entry(root,width=40,bd=3)
ent3.insert(END,"xxx")

lab4 = Label(root, text="Папка с вложениями:", font="Arial 10")
ent4 = Entry(root,width=40,bd=3)
ent4.insert(END,"/tmp/files")

lab5 = Label(root, text="Сервер:", font="Arial 10")
ent5 = Entry(root,width=40,bd=3)
ent5.insert(END,"xxx")

lab6 = Label(root, text="Порт:", font="Arial 10")
ent6 = Entry(root,width=40,bd=3)
ent6.insert(END,"25")

lab7 = Label(root, text="Имя:", font="Arial 10")
ent7 = Entry(root,width=40,bd=3)
ent7.insert(END,"xxx")

lab8 = Label(root, text="Пароль:", font="Arial 10")
ent8 = Entry(root,width=40,bd=3)
ent8.insert(END,"xxx")

var=IntVar()
var.set(1)
rad0 = Radiobutton(root,text="Сервер использует шифрование",variable=var,value=0)
rad1 = Radiobutton(root,text="Сервер НЕ использует шифрование",variable=var,value=1)

but = Button(root,text="Отправить",width=7,height=1,bg="white",fg="blue")

lab9 = Label(root, text="Процесс работы:", font="Arial 10")
tex9 = Text(root,width=50,height=5,font="Verdana 10",wrap=WORD)
tex9.insert(END,"Что происходит?: \n")

lab0.grid(row=0,column=0)
ent0.grid(row=0,column=1)

lab1.grid(row=1,column=0)
ent1.grid(row=1,column=1)

lab2.grid(row=2,column=0)
tex2.grid(row=2,column=1)

lab3.grid(row=3,column=0)
ent3.grid(row=3,column=1)

lab4.grid(row=4,column=0)
ent4.grid(row=4,column=1)

lab5.grid(row=5,column=0)
ent5.grid(row=5,column=1)
lab6.grid(row=6,column=0)
ent6.grid(row=6,column=1)
lab7.grid(row=7,column=0)
ent7.grid(row=7,column=1)
lab8.grid(row=8,column=0)
ent8.grid(row=8,column=1)

rad0.grid(row=9,column=0)
rad1.grid(row=10,column=0)

but.grid(row=11,column=1)
but.bind("<Button-1>",output)

lab9.grid(row=12,column=0)
tex9.grid(row=12,column=1)

root.mainloop()
Предисловие:
Программа коннектится к почтовому серверу и отправляет письма. (не окончена)
Консольный вариант программы, т.е. по сути функция output(event) работает как надо (unicode - поддерживается).
Решил написать гуишную оболочку.
Описание проблемы:
Окошко запускается жму отправить.
В консоли пишет, что unicode - неподдерживается. В чем засада?

P.S.
Вопрос:
При работе в консоли происходит поочередный вывод на экран -> письмо отправлено
При запуске GUI вывод всех “письмо отправлено” происходит только по окончании цикла и всё разом,
как сделать также как в консоли - > поочередный вывод, но только в gui



Офлайн

#2 Июль 26, 2010 14:22:05

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и кодировка

Текст для виджетов должен быть в юникоде. Попробуйте так:
Label(root, text=u“Путь до файла базы адресов, включая сам файл:”, font=“Arial 10”)
Хотя тут еще зависит от того, как выполнять. Сохранив ваш пример в файл в кодировке utf-8 и запустив его
в юникодной локали
python tmp.py
все заработало как надо. Тут больше вопрос в вашей локали, я так думаю.



Отредактировано (Июль 26, 2010 14:22:40)

Офлайн

#3 Июль 26, 2010 15:52:32

sergey144010
От:
Зарегистрирован: 2010-07-26
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и кодировка

ошибка следующая:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
File "test.py", line 43, in output
me = unicode(me, "utf-8").encode(me,"cp1251")
TypeError: decoding Unicode is not supported
если комментирую строки такого типа
me = unicode(me, “utf-8”).encode(me,“cp1251”)
то письмо доходит, но кривое всё



Офлайн

#4 Июль 26, 2010 17:50:31

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и кодировка

me = unicode(me, “utf-8”).encode(“cp1251”)
или
me = me.encode(“cp1251”)



Офлайн

#5 Июль 27, 2010 09:00:04

sergey144010
От:
Зарегистрирован: 2010-07-26
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и кодировка

Спасибо balu, вариант me = me.encode(“cp1251”) сработал !



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version