HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Python
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 22.05.2022, 05:33
xSkateboard
Познающий
Регистрация: 21.05.2021
Сообщений: 39
С нами: 2622585

Репутация: 38
По умолчанию

Здарова, юзеры бластхака!

Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере Casa-Grande

Цитата:
Сообщение от Спойлер  




Вышло прикольно (но я ненавижу бравл старс емае), но вот как своевременно обновлять это всё? Поэтому у меня зародилась идея - автоматизировать создание подобной пикчи. Что я и реализовал за 2 часа. (Результат под спойлером в конце поста)

Гитхаб: https://github.com/qskateboard/graphicAdminsList

Для начала определимся, в стиле чего будет делать? Я взял Genshin Impact, ибо знаю эту игру да и лого персонажей легко найти в интернете. Находим шрифт от этой игры, чтобы всё было в одном стиле.

Работать мы будем естественно на питоне и графической библиотеки Pillow

Далее идет код и рядом с ним объяснение, что делает.

Генерация карточки администратора:





Код:
def
generate_single_admin
(
admin
,
level
)
:
global
font
,
font_grade

    files
=
glob
(
"img/"
+
level
+
"/*"
)
# Получаем массив со всеми файлами определенного уровня адм
img
=
Image
.
open
(
files
[
admin
[
"index"
]
]
)
# Получаем картинку по пути, который равняется номеру админа
draw
=
ImageDraw
.
Draw
(
img
)
w
,
h
=
draw
.
textsize
(
admin
[
'nickname'
]
,
font
=
font
)
# Тут мы получаем ширину и высоту ника
w2
,
h2
=
draw
.
textsize
(
admin
[
'grade'
]
,
font
=
font_grade
)
# Аналогично верхнему, только должность
offset_y
=
(
256
-
h2
)
/
1.25
if
w
>
w2
:
# Тут должна была быть динамичнеское определение плашки с информацией, но сделал так
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
# Точка начала и конца прямоугольника
else
:
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
draw
.
rounded_rectangle
(
rect
,
fill
=
(
255
,
255
,
255
)
,
outline
=
(
24
,
24
,
24
)
,
radius
=
4
)
# Рисуем прямоугольник
draw
.
text
(
(
(
256
-
w
)
/
2
,
offset_y
)
,
admin
[
'nickname'
]
,
(
44
,
44
,
44
)
,
font
=
font
)
# Пишем ник
draw
.
text
(
(
(
256
-
w2
)
/
2
,
offset_y
+
30
)
,
admin
[
'grade'
]
,
(
44
,
44
,
44
)
,
font
=
font_grade
)
# Пишем должность
return
img
# Возвраащем объект готовой карточки


И основная функция:

Основная функция:





Код:
def
generate_picture
(
admin_list
,
count
)
:
titles
=
{
# Название уровней
"sr_admin"
:
"ГЛАВНАЯ АДМИНИСТРАЦИЯ"
,
"admin"
:
"АДМИНИСТРАЦИЯ ЧЕТВЁРТОГО УРОВНЯ"
,
"jnr_admin"
:
"АДМИНИСТРАЦИЯ ТРЕТЬЕГО УРОВНЯ"
,
"moderator"
:
"АДМИНИСТРАЦИЯ ВТОРОГО УРОВНЯ"
,
"helper"
:
"АДМИНИСТРАЦИЯ ПЕРВОГО УРОВНЯ"
}
# Создаем фон с динамическим размером
background
=
Image
.
new
(
mode
=
"RGB"
,
size
=
(
256
*
3
+
150
,
int
(
count
/
3
)
*
(
256
+
120
)
)
)
draw
=
ImageDraw
.
Draw
(
background
)
y
=
0
# Задаем высоту
prev_grade
=
""
for
key
,
value
in
admin_list
.
items
(
)
:
# Проходимся по всем уровням админки отдельно
if
prev_grade
!=
key
:
# Если уровень админки поменялся от прошлого в цикле
prev_grade
=
key
            y
+=
100
# Поднимаем оффсет высоты
w
,
h
=
draw
.
textsize
(
titles
[
key
]
,
font
=
font_title
)
# Узнаем высоту и ширину название уровня
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
titles
[
key
]
,
(
255
,
255
,
255
)
,
font
=
font_title
)
# Пишем текст по центру экрана
# Задаем переменные для полоски из 3 карточек
row
=
0
x
=
25
# Делаем так, чтобы если все администраторы не делятся на 3 нацело
remain
=
len
(
value
)
%
3
if
remain
==
1
:
# То сначала рисуется по центру 1 админ по коордам
x
=
int
(
75
+
(
256
*
3
)
/
3
)
if
remain
==
2
:
# Тут по другим коордам 2 админа
x
=
int
(
30
+
(
256
*
3
)
/
5
)
for
admin
in
value
:
# Проходимся циклом по всем админам в опр. уровне
if
row
==
3
or
(
row
==
remain
and
row
!=
0
)
:
# Если 3 админа уже нарисовно или условие remain
# Обнуляем переменные и делаем перенос строк
row
=
0
x
=
25
y
+=
256
+
50
remain
=
0
single
=
generate_single_admin
(
admin
,
key
)
# Генерируем карточку администратора
background
.
paste
(
single
,
(
x
,
y
)
,
mask
=
single
)
# Вставляем на фон, mask=single нужно, чтобы прозрачные поля корректно отображались
# Делаем отступ вправо
x
+=
256
+
50
row
+=
1
y
+=
256
+
50
# Перенос строки (уровень админки новый)
# Тут создаем текст и пишем в конце холста, естественно центрируя по центру
text_count
=
"Общее количество администраторов - {}."
.
format
(
count
)
y
+=
200
w
,
h
=
draw
.
textsize
(
text_count
,
font
=
font_title
)
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
text_count
,
(
255
,
255
,
255
)
,
font
=
font_title
)
background
.
save
(
"result.png"
)
# Сохраняем результат


Заливаем пикчи в директорию img/.../сюда и запускаем код (лучше скопируйте с гита его)

Цитата:
Сообщение от Спойлер  




 
Ответить с цитированием

  #2  
Старый 22.05.2022, 09:44
izicapt
Постоянный
Регистрация: 29.06.2021
Сообщений: 395
С нами: 2566170

Репутация: 48
По умолчанию

Цитата:
Сообщение от xSkateboard  

Здарова, юзеры бластхака!
Вчера увидел сообщение в группе ВК, про новый список администрации на форуме сервере Casa-Grande

Цитата:
Сообщение от Спойлер  


Вышло прикольно (но я ненавижу бравл старс емае), но вот как своевременно обновлять это всё? Поэтому у меня зародилась идея - автоматизировать создание подобной пикчи. Что я и реализовал за 2 часа. (Результат под спойлером в конце поста)

Гитхаб: https://github.com/qskateboard/graphicAdminsList

Для начала определимся, в стиле чего будет делать? Я взял Genshin Impact, ибо знаю эту игру да и лого персонажей легко найти в интернете. Находим шрифт от этой игры, чтобы всё было в одном стиле.

Работать мы будем естественно на питоне и графической библиотеки Pillow
Далее идет код и рядом с ним объяснение, что делает.

Генерация карточки администратора:





Код:
def
generate_single_admin
(
admin
,
level
)
:
global
font
,
font_grade

    files
=
glob
(
"img/"
+
level
+
"/*"
)
# Получаем массив со всеми файлами определенного уровня адм
img
=
Image
.
open
(
files
[
admin
[
"index"
]
]
)
# Получаем картинку по пути, который равняется номеру админа
draw
=
ImageDraw
.
Draw
(
img
)
w
,
h
=
draw
.
textsize
(
admin
[
'nickname'
]
,
font
=
font
)
# Тут мы получаем ширину и высоту ника
w2
,
h2
=
draw
.
textsize
(
admin
[
'grade'
]
,
font
=
font_grade
)
# Аналогично верхнему, только должность
offset_y
=
(
256
-
h2
)
/
1.25
if
w
>
w2
:
# Тут должна была быть динамичнеское определение плашки с информацией, но сделал так
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
# Точка начала и конца прямоугольника
else
:
rect
=
(
0
,
offset_y
-
5
,
255
,
offset_y
+
55
)
draw
.
rounded_rectangle
(
rect
,
fill
=
(
255
,
255
,
255
)
,
outline
=
(
24
,
24
,
24
)
,
radius
=
4
)
# Рисуем прямоугольник
draw
.
text
(
(
(
256
-
w
)
/
2
,
offset_y
)
,
admin
[
'nickname'
]
,
(
44
,
44
,
44
)
,
font
=
font
)
# Пишем ник
draw
.
text
(
(
(
256
-
w2
)
/
2
,
offset_y
+
30
)
,
admin
[
'grade'
]
,
(
44
,
44
,
44
)
,
font
=
font_grade
)
# Пишем должность
return
img
# Возвраащем объект готовой карточки


И основная функция:

Основная функция:





Код:
def
generate_picture
(
admin_list
,
count
)
:
titles
=
{
# Название уровней
"sr_admin"
:
"ГЛАВНАЯ АДМИНИСТРАЦИЯ"
,
"admin"
:
"АДМИНИСТРАЦИЯ ЧЕТВЁРТОГО УРОВНЯ"
,
"jnr_admin"
:
"АДМИНИСТРАЦИЯ ТРЕТЬЕГО УРОВНЯ"
,
"moderator"
:
"АДМИНИСТРАЦИЯ ВТОРОГО УРОВНЯ"
,
"helper"
:
"АДМИНИСТРАЦИЯ ПЕРВОГО УРОВНЯ"
}
# Создаем фон с динамическим размером
background
=
Image
.
new
(
mode
=
"RGB"
,
size
=
(
256
*
3
+
150
,
int
(
count
/
3
)
*
(
256
+
120
)
)
)
draw
=
ImageDraw
.
Draw
(
background
)
y
=
0
# Задаем высоту
prev_grade
=
""
for
key
,
value
in
admin_list
.
items
(
)
:
# Проходимся по всем уровням админки отдельно
if
prev_grade
!=
key
:
# Если уровень админки поменялся от прошлого в цикле
prev_grade
=
key
            y
+=
100
# Поднимаем оффсет высоты
w
,
h
=
draw
.
textsize
(
titles
[
key
]
,
font
=
font_title
)
# Узнаем высоту и ширину название уровня
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
titles
[
key
]
,
(
255
,
255
,
255
)
,
font
=
font_title
)
# Пишем текст по центру экрана
# Задаем переменные для полоски из 3 карточек
row
=
0
x
=
25
# Делаем так, чтобы если все администраторы не делятся на 3 нацело
remain
=
len
(
value
)
%
3
if
remain
==
1
:
# То сначала рисуется по центру 1 админ по коордам
x
=
int
(
75
+
(
256
*
3
)
/
3
)
if
remain
==
2
:
# Тут по другим коордам 2 админа
x
=
int
(
30
+
(
256
*
3
)
/
5
)
for
admin
in
value
:
# Проходимся циклом по всем админам в опр. уровне
if
row
==
3
or
(
row
==
remain
and
row
!=
0
)
:
# Если 3 админа уже нарисовно или условие remain
# Обнуляем переменные и делаем перенос строк
row
=
0
x
=
25
y
+=
256
+
50
remain
=
0
single
=
generate_single_admin
(
admin
,
key
)
# Генерируем карточку администратора
background
.
paste
(
single
,
(
x
,
y
)
,
mask
=
single
)
# Вставляем на фон, mask=single нужно, чтобы прозрачные поля корректно отображались
# Делаем отступ вправо
x
+=
256
+
50
row
+=
1
y
+=
256
+
50
# Перенос строки (уровень админки новый)
# Тут создаем текст и пишем в конце холста, естественно центрируя по центру
text_count
=
"Общее количество администраторов - {}."
.
format
(
count
)
y
+=
200
w
,
h
=
draw
.
textsize
(
text_count
,
font
=
font_title
)
draw
.
text
(
(
(
256
*
3
+
150
-
w
)
/
2
,
y
-
70
)
,
text_count
,
(
255
,
255
,
255
)
,
font
=
font_title
)
background
.
save
(
"result.png"
)
# Сохраняем результат


Заливаем пикчи в директорию img/.../сюда и запускаем код (лучше скопируйте с гита его)

Цитата:
Сообщение от Спойлер  




Давай в стиле Brawl Stars,так уж каждому понравится
 
Ответить с цитированием

  #3  
Старый 22.05.2022, 10:28
xSkateboard
Познающий
Регистрация: 21.05.2021
Сообщений: 39
С нами: 2622585

Репутация: 38
По умолчанию

Цитата:
Сообщение от izicapt  

Давай в стиле Brawl Stars,так уж каждому понравится
Ты можешь поменять картинки сам, просто закинув свои в директории img/../

Таким образом, ты можешь даже создать свою гачи администрацию, со своими Van или Billy
 
Ответить с цитированием

  #4  
Старый 22.05.2022, 14:53
izicapt
Постоянный
Регистрация: 29.06.2021
Сообщений: 395
С нами: 2566170

Репутация: 48
По умолчанию

Слушай,а вправду стоит сделать с Гачи.Бравл старс уже устарел.Спасибо за идею!

Цитата:
Сообщение от xSkateboard  

Ты можешь поменять картинки сам, просто закинув свои в директории img/../
Таким образом, ты можешь даже создать свою гачи администрацию, со своими Van или Billy
 
Ответить с цитированием

  #5  
Старый 22.05.2022, 17:28
хорошая работа олег
Познающий
Регистрация: 07.10.2020
Сообщений: 53
С нами: 2947831

Репутация: 58
По умолчанию

заменил ники админов в admins.txt, заменил картинки, запустил main.py и... целое нихуя. не запускает фото
 
Ответить с цитированием

  #6  
Старый 22.05.2022, 18:11
izicapt
Постоянный
Регистрация: 29.06.2021
Сообщений: 395
С нами: 2566170

Репутация: 48
По умолчанию

Согласен, та же ситуация. Работает лишь с тем примером который показал автор.

Цитата:
Сообщение от хорошая работа олег  

заменил ники админов в admins.txt, заменил картинки, запустил main.py и... целое нихуя. не запускает фото
 
Ответить с цитированием

  #7  
Старый 22.05.2022, 18:11
munnniisss
Участник форума
Регистрация: 23.12.2019
Сообщений: 155
С нами: 3363619

Репутация: 33
По умолчанию

Годно, мужик
 
Ответить с цитированием

  #8  
Старый 22.05.2022, 18:22
xSkateboard
Познающий
Регистрация: 21.05.2021
Сообщений: 39
С нами: 2622585

Репутация: 38
По умолчанию

Цитата:
Сообщение от izicapt  

Согласен, та же ситуация. Работает лишь с тем примером который показал автор.
45 строка в файле:

Python:





Код:
parsed
=
re
.
findall
(
"(.*) \[(.*)] - (.*)"
,
line
)
[
0
]


Парсит такую строку:

Ник [Префикс] - Должность

Учитывайте, что пробелы должны быть учтены - иначе переделывайте регулярное выражение.

Можете писать ниже свои строки, а я к ним регулярку в ответ
 
Ответить с цитированием

  #9  
Старый 22.05.2022, 19:03
хорошая работа олег
Познающий
Регистрация: 07.10.2020
Сообщений: 53
С нами: 2947831

Репутация: 58
По умолчанию

Цитата:
Сообщение от xSkateboard  

45 строка в файле:

Python:





Код:
parsed
=
re
.
findall
(
"(.*) \[(.*)] - (.*)"
,
line
)
[
0
]


Парсит такую строку:
Ник [Префикс] - Должность

Учитывайте, что пробелы должны быть учтены - иначе переделывайте регулярное выражение.

Можете писать ниже свои строки, а я к ним регулярку в ответ
заменил картинки, запустил main.py и вылетает
 
Ответить с цитированием

  #10  
Старый 22.05.2022, 21:03
xSkateboard
Познающий
Регистрация: 21.05.2021
Сообщений: 39
С нами: 2622585

Репутация: 38
По умолчанию

Цитата:
Сообщение от хорошая работа олег  

заменил картинки, запустил main.py и вылетает
Скриншот ошибки прикрепи, скорее всего слишком мало картинок залил (в админах и мл. админах должно быть минимум по 25)
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.