Статья Ваяем музыкальную открытку на Python

explorer

explorer

Red Team
05.08.2018
788
1 697
Вдруг пришла идея сделать музыкальную открытку на Python. Почему бы нет?

Приступим.

Для этого конечно нужен графический интерфейс. Воспользуемся уже входящим в стандарт модулем tkinter . Tkinter - это интерфейс Python к GUI Tk.

Импортируем модуль, рисуем окно, пишем в заголовке окна "Hello codeby!" и запрещаем изменять размеры окна по ширине и высоте.

Python:
# -*- coding:utf -8 -*-
from tkinter import *

root = Tk()
root.title("Hello codeby!")
root.resizable(width=False, height=False)
Далее создаём холст с размерами выбранной картинки и прописанным путём к ней. Параметр bg="blue" задаёт цвет фона, если картинка будет недоступна.


Python:
C = Canvas(root, bg="blue", height=330, width=500)
filename = PhotoImage(file = "C:\\black_blue.png")
background_label = Label(root, image=filename)
background_label.place(x=0, y=0, relwidth=1, relheight=1)
Следующим этапом пишем текст. На холсте текст и фон к нему элементарно раскрашиваются кодами цветов без привлечения дополнительных модулей типа colorama. Отступы от текста делаются по осям padx и pady. Позиционирование самого текста на холсте через relx и rely.


Python:
zapis = "\n Hello\n codeby!\n"
label2 = Label(text=zapis, justify=LEFT, fg="#D3D3D3", bg="#000000", font="Serif 24", padx=5, pady=2)
label2.place(relx=.1, rely=.1)

hello = "\n Привет КулХацкерам \n\n форума codeby!\n"
end = Label(text=hello, justify=LEFT, fg="#FF0000", bg="#000000", font="Arial 12", padx=5, pady=1)
end.place(relx=.1, rely=.5)

C.pack()
root.mainloop
Ну что же, осталось прикрутить сюда музычку. Для этого импортируем модуль pygame и укажем путь до MP3. Если нужно чтобы трек звучал не один раз, то в скобках строки mixer.music.play() указывает нужную цифру.


Python:
from pygame import mixer

mixer.init()
mixer.music.load("C:\\key.mp3")
mixer.music.play()

Вот что в итоге у нас вышло:


Python:
# -*- coding:utf -8 -*-
from tkinter import *
from pygame import mixer


root = Tk()
root.title("Hello codeby!")
root.resizable(width=False, height=False)

C = Canvas(root, bg="blue", height=330, width=500)
filename = PhotoImage(file = "C:\\black_blue.png")
background_label = Label(root, image=filename)
background_label.place(x=0, y=0, relwidth=1, relheight=1)

zapis = "\n Hello\n codeby!\n"
label2 = Label(text=zapis, justify=LEFT, fg="#D3D3D3", bg="#000000", font="Serif 24", padx=5, pady=2)
label2.place(relx=.1, rely=.1)

hello = "\n Привет КулХацкерам \n\n форума codeby!\n"
end = Label(text=hello, justify=LEFT, fg="#FF0000", bg="#000000", font="Arial 12", padx=5, pady=1)
end.place(relx=.1, rely=.5)


mixer.init()
mixer.music.load("C:\\key.mp3")
mixer.music.play()


C.pack()
root.mainloop
otkr.png


Скачать демооткрытку

Просто из архива извлеките файлы в корень диска С, либо не забудьте в коде поправить пути на картинку и аудио, если это будет другая директория.

Ну вот и чудненько.
Всё это конечно прекрасно и замечательно, но здесь есть одно небольшое "но". Но ведь если вы решите сделать какую-нибудь поздравительную или романтическую открытку для родных или девушки, то маловероятно что они пользуются питоном )))

Этот вопрос тоже решается, но об этом в следующей статье.
 
explorer

explorer

Red Team
05.08.2018
788
1 697
Смотрел-смотрел я на картинку, и понял что в строке заголовка пёрышко, которое Tkinter нам подсовывает по умолчанию, не в тему)))

Вставим туда иконку с форума. Да только как её туда вставить без танцев с бубном?
Решение совсем несложное пришло - нужно иконку закодировать в Base64. Идём в любой онлайн-декодер, скармливаем иконку, и получаем нужный код. Копируем код, он длиннючий, поэтому в питоне его нужно заключить в тройные кавычки.


Python:
icon = '''
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABRUlEQVQ4jc3SMWtUQRQF4G/e20SM
mCpYiGZJJbxdI4KVlUjAZnERG8HGyjY/YCurIP4AsbMT/Al2gqhlTHjTBiSVgtWyLItvxsIXeEQt
ZAs9MAyXOedw7p0bqqrKlkCxjPj/MOi19xwzLNoDmzhGauuL+NZyYQNrJwne4Aq20C+COyF4vfdw
9XKMsV8WrgXerZT6Mcb+uTO2sN9t4W4IbsQY52dXFZlnRbA7nuyDlD0NweTTYZzDbOExbkLofOPn
sjBI2SNM6zq+hOGgup0Z13XcheGwupSSGuvdGcBmSl4JFhvn3Yftq9Va05iUpTGMbg0cfcnPT8Sn
DWRGgXtvP0bQNJ4I3h8cxikcfc0PMqOuJvxmE+NKz/WmsZ2yD5gVhUFg3vyMfqFL7vkV1ffGXs52
2vf1nLzITE+L/5Tgr/DvV3lpgx+THmin4biX1AAAAABJRU5ErkJggg==
'''
Но чтобы это добро заработало, пропишем следующий код:


Python:
img = PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)
Запускаем... Годно! :)


ico.png
 
explorer

explorer

Red Team
05.08.2018
788
1 697
Продолжу темку. Мы же с вами прогеры, а значит под себя нужно делать всякие полезные тулзы. Выше я писал чтобы конвертнули иконку в онлайн сервисе, коих много.

Но это ни к чему, если написать свой скрипт, тем более он такой простой :)

Импортируем модуль base64, прописываем путь к иконке.

Python:
import base64

with open('C:/favicon.ico', "rb") as file:
        print(base64.b64encode(file.read()))
Запускаем скрипт в IDLE. Готово!

base64.png


Осталось скопировать полученный код. Внимание! Код копируется с 3-го знака, то есть то что в кавычках. Пользуйтесь ;)
 
explorer

explorer

Red Team
05.08.2018
788
1 697
Чуть поправил код, чтобы не было лишних символов. Теперь целиком строку можно копировать.


Python:
import base64

with open('C:/favicon.ico', "rb") as file:
        print((str(base64.b64encode(file.read()))[2:])[:-1])
base.png


Кроме файлов .ico в строку заголовка можно поставить .png и .gif (без анимации). Не поддерживается jpg.
 
Последнее редактирование:
  • Нравится
Реакции: invetrika, ranon и Vertigo
explorer

explorer

Red Team
05.08.2018
788
1 697
Сидя в тёмный дождливый вечер, решил конвертер иконок в BASE64 доработать. Сделал GUI версию. Теперь не нужно прописывать пути к иконке в коде, а просто через кнопку открыть выбрать нужную :) Ну и сохранение полученной строки в файл присутствует.
Python:
# -*- coding:utf -8 -*-
__version__ = 'Version:1.1'
import base64
from tkinter import *
from tkinter import filedialog as fd

root = Tk()
root.title("Icon to BASE64  " +str(__version__))
root.resizable(width=False, height=False)
root.geometry("420x300+300+300")
calculated_text = Text(root,height=15, width=50)

myFormats = [
    ('TXT files','*.txt'),
    ('HTML files','*.html;.htm'),
    ('All files','*.*'),  
    ]

def insertImg():
    file_name = fd.askopenfilename()
    f = open(file_name, 'rb')
    s = f.read()
    calculated_text.insert('1.0',(str(base64.b64encode(s))[2:])[:-1])
    f.close()

def extractText():
    file_name = fd.asksaveasfilename(parent=root,filetypes=myFormats,defaultextension='')
    f = open(file_name, 'w')
    s = calculated_text.get(1.0, END)
    f.write(s)
    f.close()  
   
def erase():  
    calculated_text.delete('1.0', END)
   
b1 = Button(text="Открыть",command=insertImg)
b1.grid(row=3, column=0, sticky=E, padx=5, pady=8,)
b2 = Button(text="Сохранить", command=extractText)
b2.grid(row=3, column=1, sticky=E, padx=5, pady=8,)
erase_button = Button(text="Очистить", command=erase)
erase_button.grid(row=3, column=2, padx=35, pady=8, sticky="W")

scrollb = Scrollbar(root, command=calculated_text.yview)
scrollb.grid(row=4, column=4, sticky='nsew')
calculated_text.grid(row=4, column=0, sticky='nsew', columnspan=3)
calculated_text.configure(yscrollcommand=scrollb.set)
       
root.mainloop()
64.png
 
  • Нравится
Реакции: Pirnazar
explorer

explorer

Red Team
05.08.2018
788
1 697
Старая версия открытки не собиралась в EXE, поэтому переписал код , без использования холста. Теперь она запускается по клику и собирается, через cx_Freeze.
Код:
__version__ = 'Version: 2.0'
from tkinter import *
from pygame import mixer

icon = '''
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABRUlEQVQ4jc3SMWtUQRQF4G/e20SM
mCpYiGZJJbxdI4KVlUjAZnERG8HGyjY/YCurIP4AsbMT/Al2gqhlTHjTBiSVgtWyLItvxsIXeEQt
ZAs9MAyXOedw7p0bqqrKlkCxjPj/MOi19xwzLNoDmzhGauuL+NZyYQNrJwne4Aq20C+COyF4vfdw
9XKMsV8WrgXerZT6Mcb+uTO2sN9t4W4IbsQY52dXFZlnRbA7nuyDlD0NweTTYZzDbOExbkLofOPn
sjBI2SNM6zq+hOGgup0Z13XcheGwupSSGuvdGcBmSl4JFhvn3Yftq9Va05iUpTGMbg0cfcnPT8Sn
DWRGgXtvP0bQNJ4I3h8cxikcfc0PMqOuJvxmE+NKz/WmsZ2yD5gVhUFg3vyMfqFL7vkV1ffGXs52
2vf1nLzITE+L/5Tgr/DvV3lpgx+THmin4biX1AAAAABJRU5ErkJggg==
'''

root = Tk()
root.title("Hello codeby! " +str(__version__))
root.geometry("500x330")
root.configure(background="black")

background_image = PhotoImage(file="C:/1/black_blue.png")

background = Label(root, image=background_image, bd=0)
background.pack()

zapis = "\n Hello\n codeby!\n"
label2 = Label(text=zapis, justify=LEFT, fg="#D3D3D3", bg="#000000", font="Serif 24", padx=5, pady=2)
label2.place(relx=.1, rely=.1)

hello = "\n Привет КулХацкерам \n\n форума codeby!\n"
end = Label(text=hello, justify=LEFT, fg="#FF0000", bg="#000000", font="Arial 12", padx=5, pady=1)
end.place(relx=.1, rely=.5)

mixer.init()
mixer.music.load("C:/1/key.mp3")
mixer.music.play()

img = PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)
root.mainloop()

Как собрать в EXE написал ЗДЕСЬ
 
Последнее редактирование:
Мы в соцсетях: