Ваяем музыкальную открытку на Python
@webwareВдруг пришла идея сделать музыкальную открытку на Python. Почему бы нет?
Приступим.
Для этого конечно нужен графический интерфейс. Воспользуемся уже входящим в стандарт модулем tkinter . Tkinter - это интерфейс Python к GUI Tk.
Импортируем модуль, рисуем окно, пишем в заголовке окна "Hello codeby!" и запрещаем изменять размеры окна по ширине и высоте.
# -*- coding:utf -8 -*-
from tkinter import *
root = Tk()
root.title("Hello codeby!")
root.resizable(width=False, height=False)
Далее создаём холст с размерами выбранной картинки и прописанным путём к ней. Параметр bg="blue" задаёт цвет фона, если картинка будет недоступна.
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.
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() указывает нужную цифру.
from pygame import mixer
mixer.init()
mixer.music.load("C:\\key.mp3")
mixer.music.play()
Вот что в итоге у нас вышло:
# -*- 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

Просто из архива извлеките файлы в корень диска С, либо не забудьте в коде поправить пути на картинку и аудио, если это будет другая директория.
Ну вот и чудненько.
Всё это конечно прекрасно и замечательно, но здесь есть одно небольшое "но". Но ведь если вы решите сделать какую-нибудь поздравительную или романтическую открытку для родных или девушки, то маловероятно что они пользуются питоном )))
Этот вопрос тоже решается, но об этом в следующей статье.
UPD:
Смотрел-смотрел я на картинку, и понял что в строке заголовка пёрышко, которое Tkinter нам подсовывает по умолчанию, не в тему)))
Вставим туда иконку с форума. Да только как её туда вставить без танцев с бубном?
Решение совсем несложное пришло - нужно иконку закодировать в Base64. Идём в любой онлайн-декодер, скармливаем иконку, и получаем нужный код. Копируем код, он длиннючий, поэтому в питоне его нужно заключить в тройные кавычки.
icon = ''' iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABRUlEQVQ4jc3SMWtUQRQF4G/e20SM mCpYiGZJJbxdI4KVlUjAZnERG8HGyjY/YCurIP4AsbMT/Al2gqhlTHjTBiSVgtWyLItvxsIXeEQt ZAs9MAyXOedw7p0bqqrKlkCxjPj/MOi19xwzLNoDmzhGauuL+NZyYQNrJwne4Aq20C+COyF4vfdw 9XKMsV8WrgXerZT6Mcb+uTO2sN9t4W4IbsQY52dXFZlnRbA7nuyDlD0NweTTYZzDbOExbkLofOPn sjBI2SNM6zq+hOGgup0Z13XcheGwupSSGuvdGcBmSl4JFhvn3Yftq9Va05iUpTGMbg0cfcnPT8Sn DWRGgXtvP0bQNJ4I3h8cxikcfc0PMqOuJvxmE+NKz/WmsZ2yD5gVhUFg3vyMfqFL7vkV1ffGXs52 2vf1nLzITE+L/5Tgr/DvV3lpgx+THmin4biX1AAAAABJRU5ErkJggg== '''
Но чтобы это добро заработало, пропишем следующий код:
img = PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)
Запускаем... Годно!
