代码之家  ›  专栏  ›  技术社区  ›  HonzsSedlomn

为什么图像在Kivy中不能正确显示为按钮背景?

  •  1
  • HonzsSedlomn  · 技术社区  · 7 年前

    我想把这个kv代码转换成我自己的类

    <BaseScreen>:     # This is GridLayout
        cols: 4
        rows: 4
        padding: 25
        Button:
            size_hint_x: None
            size_hint_y: None
            Image:
                source: "business_bookcover.png"
                x: self.parent.x
                y: self.parent.y
                width: self.parent.width
                height: self.parent.height
                keep_ratio: False
    

    问题是,我试图制作“可点击图像”,但当我将小部件附加到按钮时,图像处于默认位置(0,0),完全不在按钮位置。有什么解决方法吗?

    这是我的尝试

    class Book(Button):
    
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
    
            self.size_hint = (None, None)
    
            book_cover_image_source = kwargs.get('cover') or BLANK_BOOK_COVER
    
            book_cover = Image(source=book_cover_image_source)
            book_cover.pos = self.pos
            book_cover.width = self.width
            book_cover.height = self.height
            book_cover.allow_stretch = True
            book_cover.keep_ratio = False
    
            self.add_widget(book_cover)
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   FJSevilla    7 年前

    表达式中使用的kv Langaje属性( x: , y: , width: )将予以遵守。当父母的 size / pos 更改,子小部件将相应更改。必须在Python类中提供此事件绑定:

    class Book(Button):
        def __init__(self, cover=BLANK_BOOK_COVER, **kwargs):
            super(Book, self).__init__(**kwargs)
            self.size_hint = (None, None)
            self.book_cover = Image(source=cover)
            self.book_cover.allow_stretch = True
            self.book_cover.keep_ratio = False
            self.add_widget(self.book_cover)
    
        def on_size(self, *args):
            self.book_cover.size = self.size
    
        def on_pos(self, *args):
            self.book_cover.pos = self.pos
    

    要获得可点击的图像,一个更简单的选择是让您的类 Book 继承自 ButtonBehabior Image 类别:

    from kivy.uix.behaviors import ButtonBehavior
    from kivy.uix.image import Image
    
    
    class Book(ButtonBehavior, Image):
        def __init__(self, cover=BLANK_BOOK_COVER, **kwargs):
            super(Book, self).__init__(**kwargs)
            self.source = cover
            self.size_hint = (None, None)
            self.allow_stretch = True
            self.keep_ratio = False