如何正确缩放MDIconButton?

时间:2019-04-09 03:42:49

标签: python kivy kivy-language

我想根据笔刷大小缩放MDIconButtonPushMatrix / 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:)。

是否有更好/不同的方式来更改图标大小,从而完全避免了此问题?

1 个答案:

答案 0 :(得分:0)

您的问题询问如何正确缩放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的{​​{1}}替换为:{p>

MDIconButton

但是只有图标大小会发生变化,on_release: self.ids.content.font_size *= 1.1 及其容器不会发生变化。