【问题标题】:Kivy Image Child Class Produces Two ImagesKivy Image 子类生成两个图像
【发布时间】:2024-06-20 14:10:02
【问题描述】:

我认为这可能是对 kivy 中更深层次的东西的简单理解,但我有一个 RoundedImage 类,它生成两个图像,其中一个是没有圆角的原始图像,另一个是屏幕外的圆角。怎么回事?

截图: http://imgur.com/gallery/IRYfr

我认为这可能与子类化 Image 有关?

class RoundedImage(Image,StyleUnit):

    _styleist = RadialGradientStyleist    
    _radius = [20]
    _source = ''
    _style = None
    def __init__(self,**kwargs):

        super(RoundedImage,self).__init__(**kwargs)
        #self._source = source
        #self.initalizeStyle()

        with self.canvas:
            StencilPush()
            self.m_rect = RoundedRectangle( size = self.norm_image_size , \
                                            pos=self.center, \
                                            radius=self._radius)
            StencilUse()
            self.rect = Rectangle(  size = self.norm_image_size , \
                                    pos = self.center, \
                                    texture = self.texture)
            StencilUnUse()
            StencilPop()
            #Color(1,1,1)
            #self.line = Line(   rounded_rectangle=self.pos+self.size+self._radius,
            #        width=10)


        self.bind(pos = self.update_rect,
                  size = self.update_rect)

    def update_rect(self,*args):
        self.m_rect.pos = self.center
        self.m_rect.size = self.norm_image_size
        self.rect.pos = self.center
        self.rect.size = self.norm_image_size

应用代码很简单:

class ProfilesApp(App):

    def build(self):
       profile = RoundedImage( source = source,#self.imageLocation,\
                                    allow_stretch=True)
       return profile

profileApp = ProfilesApp()
profileApp.run()

【问题讨论】:

  • 你想做什么?

标签: python image canvas graphics kivy


【解决方案1】:

没有导入,没有其他必需的类,虽然我在某处看到了那个圆角矩形,但我不知道那个自定义类做了什么,所以没有可运行的代码。无论如何,让我们一起努力吧。

是的,这是因为子类化 - 图片已经放置在画布中,您可以使用 Rectangle(texture=<here>) 中的纹理。而不是删除图像的子类 使用source 关键字参数作为Rectangle,如下所示:

Rectangle(source=<path to image>)

再一次,尽管您在继承自 Image 的类中使用 source,但您需要更改它并从 kwargs 获取 source

self.source = kwargs.get('source')

然后用Rectangle(source=self.source)代替Rectangle(texture=self.texture)

【讨论】:

    【解决方案2】:

    好的,所以这最终是一个没有删除模板说明中的掩码的问题。

    我最终将它添加到 RoundedRectangle 的 .kv 定义中

    '''
    <-RoundedImage>:
    canvas:
    Color:
    rgb: self.color
    StencilPush
    RoundedRectangle:
    size: self.norm_image_size
    pos: self.center[0] - self.norm_image_size[0]/2.0,self.center[1] - self.norm_image_size[1]/2.0
    radius: self._radius
    StencilUse
    Rectangle:
    texture: self.texture
    size: self.norm_image_size
    pos: self.center[0] - self.norm_image_size[0]/2.0,self.center[1] - self.norm_image_size[1]/2.0
    StencilUnUse
    RoundedRectangle:
    size: self.norm_image_size
    pos: self.center[0] - self.norm_image_size[0]/2.0,self.center[1] - self.norm_image_size[1]/2.0
    radius: self._radius
    StencilPop
    
    '''
    

    【讨论】: