Как правильно масштабировать MDIconButton?

Я хочу масштабировать MDIconButton в зависимости от размера моей кисти. PushMatrix/PullMatrix, похоже, применяется ко всем последующим виджетам на холсте, а не только к виджету кнопки, как ожидалось.

Я обнаружил, что это не происходит со стандартным виджетом kivy Button, но надеялся продолжить использовать kivymd MDIconButton для анимации и других поведений/покрытий.

В настоящее время я использую метку сверху, чтобы добавить дополнительную информацию к моей кнопке, что делает эту реализацию наиболее простой, на мой взгляд. Я предполагаю, что проблема вызвана одним из вариантов поведения, от которого наследует MDIconButton, но пока не удалось точно определить, какое именно.

from kivy.app import App
from kivy.lang import Builder

from kivymd.button import MDRaisedButton, MDIconButton

class TestApp(App):
    def build(self):
        return Builder.load_string('''
BoxLayout:
    orientation: 'vertical'

    BoxLayout:
        size_hint_y: None
        height: dp(42)
        orientation: 'horizontal'

        ##Button:
        MDIconButton:
            _scale: 1
            on_release: self._scale = (((self._scale*3) + 1) % 3) / 3
            ##text: 'brush'
            icon: 'brush'
            theme_text_color: 'Custom'
            text_color: 1,1,1,1
            canvas.before:
                PushMatrix
                Scale:
                    origin: self.center
                    x: self._scale or 1.
                    y: self._scale or 1.
            canvas.after:
                PopMatrix

    Widget:
        id: palette
        size_hint_y: None
        height: dp(42)
        canvas.before:
            Color:
                rgb: 1,0,0
            Rectangle:
                size: self.size
                pos: self.pos

    Widget:
        id: sketchpad
        canvas.before:
            Color:
                rgb: 1,1,0
            Rectangle:
                size: self.size
                pos: self.pos
''')


if __name__ == '__main__':
    TestApp().run()

MDIconButton icon: 'brush' должен циклически переключаться между 3 размерами, оставляя остальные виджеты в их нормальном размере (правильное поведение наблюдается при замене MDIconButton на Button и изменении icon: на text:).

Есть ли лучший/другой способ изменить размер значка, полностью избегая этой проблемы?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 539
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш вопрос спрашивает, как масштабировать правильноMDIconButton. Я не могу утверждать, что это correct, но вот хак, который это делает. Обратите внимание, что icon — это просто символ в шрифте, поэтому его размер можно настроить, изменив размер шрифта. Для этого я расширил BoxLayout (только потому, что это ваш root), включив в него метод set_font_size():

class MyBoxLayout(BoxLayout):
    def set_font_size(self, *args):
        butt = self.ids.mdIconButt
        label = butt.ids.content

        # adjust font size for the icon
        label.font_size *= 1.1

        # adjust the size of the buttons containers
        butt.height *= 1.1
        butt.width *= 1.1
        butt.parent.height *= 1.1

Затем в вашей строке kv:

MyBoxLayout:
    orientation: 'vertical'

    BoxLayout:
        size_hint_y: None
        height: dp(42)
        orientation: 'horizontal'

        ##Button:
        MDIconButton:
            id: mdIconButt  # id to make it easy to find this widget
            on_release: root.set_font_size()  # call the new method
            icon: 'brush'
            theme_text_color: 'Custom'
            text_color: 1,1,1,1
    .
    .
    .

Обратите внимание, что это возится с внутренними элементами MDIconButton, поэтому ожидайте, что он сломается при любом изменении kivyMD.

На самом деле вы можете выполнить большую часть этого, просто заменив on_release на MDIconButton на:

on_release: self.ids.content.font_size *= 1.1

Но тогда меняется только размер значка, а MDIconButton и его контейнер — нет.

Другие вопросы по теме