Чтобы достичь этого, нужно просто создать подкласс класса Button
и переопределить способ его отрисовки. Я добавил свойство icon
в класс mybutton
. Код в строке kv
для mybutton
является просто значением по умолчанию для Button
(из style.kv
) с некоторыми небольшими изменениями для обработки свойства icon
:
from kivy.app import App
from kivy.garden.navigationdrawer import NavigationDrawer as ND
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.button import Button
class navwindow(ND):
def __init__(self,**kwargs):
super().__init__(**kwargs)
class mybutton(Button):
icon = ObjectProperty(None)
Builder.load_string('''
<mybutton>:
state_image: self.background_normal if self.state == 'normal' else self.background_down
disabled_image: self.background_disabled_normal if self.state == 'normal' else self.background_disabled_down
canvas:
Color:
rgba: self.background_color
BorderImage:
border: self.border
pos: self.pos
size: self.size
source: self.disabled_image if self.disabled else self.state_image
Color:
rgba: 1, 1, 1, 1
Rectangle:
texture: self.texture
size: self.texture_size
pos: int(0.75 * self.right - self.texture_size[0] / 2.0), int(self.center_y - self.texture_size[1] / 2.)
Rectangle:
source: self.icon
size: 0.25 * self.width, self.height
pos: self.pos
<navwindow>:
anim_type:'slide_above_simple'
id:mainwin
BoxLayout:
orientation:'vertical'
spacing: 10
canvas.before:
Color:
rgba:(1,1,1,1)
Rectangle:
pos:self.pos
size:self.size
ScrollView:
GridLayout:
size_hint_y:None
height: self.minimum_height
cols:1
Image:
source:'icons/try.png'
size_hint_y:None
Label:
text:'Chitkaran@gmail.com'
color:(0,0,0,1)
size_hint_y:None
mybutton:
icon: 'icons/ask.png'
text:'heaadadadllo'
size_hint: 1, None
mybutton:
icon: 'icons/ask.png'
text:'hello'
size_hint: 1, None
mybutton:
icon: 'icons/ask.png'
text:'hello'
size_hint: 1, None
''')
class mainapp(App):
def build(self):
return navwindow()
#theme_cls = ThemeManager() #very important
if __name__=='__main__':
mainapp().run()
ВышеКод заставит изображение значка вписаться в Rectangle
, что составляет 1/4 ширины mybutton
, но на полную высоту mybutton
, что может растянуть изображение значка. Если значок квадратный, вы можете избежать растяжения, используя следующий код для значка Rectangle
:
Rectangle:
source: self.icon
size: 0.25 * self.width, 0.25 * self.width
pos: self.x, self.y + 0.5 * (self.height - 0.25 * self.width)
Это должно работать для любого квадратного значка. Если значок не квадратный, вы можете настроить приведенный выше код, чтобы учесть это. Независимо от этого, это будет работать только для значков одинаковой формы. Если вы хотите обрабатывать произвольные фигуры, я подозреваю, что это возможно с помощью некоторого дополнительного кода в классе mybutton
.