Кнопки с картинками (новый GUI)

Благодаря тегу ремарок # можно создавать собственные теги. Вот пример того, как можно кастомизировать меню выбора в новом GUI.

# стандартные настройки меню
define gui.choice_button_width = 1280
define gui.choice_button_height = 72
define gui.choice_button_borders = Borders(150, 16, 150, 16)
define gui.choice_button_text_xalign = 0.5
define pad = 150 # отступ для картинки слева

init python:
    # автоматическое объявление изображений
    images_auto()
    window_center()

    # поиск тегов с настройками кнопки
    import re
    def get_tags(text, prefix='#'):
        # выуживаем все теги ремарок
        return re.findall('{' + prefix + '([^}]+)}', text)

    # поиск в строке тега (и его значения) по имени
    def get_tag(text, tag, default=None):
        val = default
        tags = get_tags(text)
        for i in tags:
            parts = i.split('=')
            if len(parts) > 0:
                if parts[0].strip() == tag.strip():
                    if len(parts) > 1:
                        val = parts[1]
        return val

    # найти в ремарках значение тега 'image'
    def get_image(text):
        # по-умолчанию картинки нет
        return get_tag(text, 'image')

    # найти в ремарках значение тега 'align'
    def get_align(text):
        # по-умолчанию выравнивание текста берем стандартное
        return float(get_tag(text, 'align', str(gui.choice_button_text_xalign)))

# переназначаем экран выбора
screen choice(items):
    style_prefix "choice"
    vbox:
        for i in items:
            button:
                action i.action
                background None
                xpadding 0 ypadding 0 xmargin 0 ymargin 0
                textbutton i.caption action i.action text_xalign get_align(i.caption)
                add get_image(i.caption) yalign .5 xpos pad

label start:
    menu:
        "Текст по центру":
            pass
        "{#image=vk} Текст в центре, картинка слева":
            pass
        "{image=vk} Текст в центре, картинка рядом с текстом":
            pass
        "{#image=vk} {image=pref} Текст с картинкой в центре, картинка слева":
            pass
        "{#image=vk} Картинка слева, текст справа{#align=1.0}":
            pass
        "{image=pref} Текст с картинкой слева{#align=.0}":
            pass
        "{#image=vk}{image=pref} Текст с картинкой слева и картинка слева{#align=.25}":
            pass
    return

Комментарии