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