Я хочу масштабировать 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:
).
Есть ли лучший/другой способ изменить размер значка, полностью избегая этой проблемы?
Ваш вопрос спрашивает, как масштабировать правильно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
и его контейнер — нет.