Пользовательская кнопка не отображает изображения для всех экземпляров - Kivy - PullRequest
0 голосов
/ 21 октября 2019

Я создал класс mybutton, который наследуется от Button & Image. Вот мои .py и .kv коды.

main.py

from kivy.app import App
from kivy.garden.navigationdrawer import NavigationDrawer as ND
from kivy.uix.button import Button
from kivy.uix.image import Image

class navwindow(ND):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)

class mybutton(Button,Image):
    pass
class mainapp(App):
    def build(self):
        return navwindow()
    #theme_cls = ThemeManager() #very important

if __name__=='__main__':
    mainapp().run()

main.kv

<mybutton@Button>:
    size_hint: 1, None
    GridLayout:
        rows:1
        Image:
            source:'icons/ask.png'
        Label:
            text:''
<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:
                    text:'heaadadadllo'
                mybutton:
                    text:'hello'
                mybutton:
                    text:'hello'

Проблема: Когда я запускаю код, только значок последней кнопки показывает изображение значка.

Я приложил скриншот вывода, чтобы объяснитьпроблема правильно.

Пожалуйста, помогите. enter image description here

1 Ответ

1 голос
/ 21 октября 2019

Чтобы достичь этого, нужно просто создать подкласс класса 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...