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

#python #kivy #kivy-language

#python #kivy #kivy-язык

Вопрос:

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

Я обнаружил, что этого не происходит со стандартным стандартным Button виджетом kivy, но надеялся продолжить использовать 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: ).

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

Ответ №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 его контейнер и его контейнер — нет.