• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

Вдруг пришла идея сделать музыкальную открытку на 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

Platinum
05.08.2018
1 080
2 472
BIT
0
Смотрел-смотрел я на картинку, и понял что в строке заголовка пёрышко, которое 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

Platinum
05.08.2018
1 080
2 472
BIT
0
Продолжу темку. Мы же с вами прогеры, а значит под себя нужно делать всякие полезные тулзы. Выше я писал чтобы конвертнули иконку в онлайн сервисе, коих много.

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

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

Python:
import base64

with open('C:/favicon.ico', "rb") as file:
        print(base64.b64encode(file.read()))

Запускаем скрипт в IDLE. Готово!

base64.png


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

explorer

Platinum
05.08.2018
1 080
2 472
BIT
0
Чуть поправил код, чтобы не было лишних символов. Теперь целиком строку можно копировать.


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.
 
Последнее редактирование:

explorer

Platinum
05.08.2018
1 080
2 472
BIT
0
Сидя в тёмный дождливый вечер, решил конвертер иконок в 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
 

explorer

Platinum
05.08.2018
1 080
2 472
BIT
0
Старая версия открытки не собиралась в 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 написал ЗДЕСЬ
 
Последнее редактирование:
  • Нравится
Реакции: Johan Van
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!