改变小部件中的图像 - Kivy - Python

时间:2014-01-31 02:38:14

标签: python kivy

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Rectangle
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image

class Imglayout(FloatLayout):

    def __init__(self,**args):
        super(Imglayout,self).__init__(**args)

        with self.canvas.before:
            Color(0,0,0,0)
            self.rect=Rectangle(size=self.size,pos=self.pos)

        self.bind(size=self.updates,pos=self.updates)
    def updates(self,instance,value):
        self.rect.size=instance.size
        self.rect.pos=instance.pos


class MainTApp(App):

    im=Image(source='img1.jpg')
    def build(self):
        root = BoxLayout(orientation='vertical')
        c = Imglayout()
        root.add_widget(c)


        self.im.keep_ratio= False
        self.im.allow_stretch = True        
        cat=Button(text="Categories",size_hint=(1,.07))
        cat.bind(on_press=self.callback)        
        c.add_widget(self.im)
        root.add_widget(cat);       
        return root

    def callback(self,value):
        self.im=Image(source='img2.jpg')


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

我在这里尝试做的是更改在对象创建期间首次加载的图像,该图像在应用程序启动时显示,然后在按下按钮cat时更改它。我试图这样做,但它没有发生。我最终希望它能够通过轻扫手势进行更改。(通过手机中的一点点滑动动画

我想要构建的是一个幻灯片,它将在t秒内更改图像,除非刷卡,然后当新图像出现时计时器重置。 按下类别按钮时,图像将不在那里,并且可以从中选择类别列表。当触摸列表中的项目时,该列表中的图像将显示在屏幕上。

最后,当一切都已完成时,我想让它自动检测类别(基于指定位置的目录。)然后所有图像都可用。(这不是说明它明确地显示了多少图像和图像。)

但是,我无法做第一件事,所以我真的希望得到一些帮助。也许还有一些关于如何实现其他事情的指示。

1 个答案:

答案 0 :(得分:2)

def callback(self,value):
    self.im=Image(source='img2.jpg')

您的问题在于回调的定义。使用新源创建 new 图像,但不对其执行任何操作,例如将其添加到窗口小部件树中。

您真正想要做的是修改现有图片的来源:

def callback(self, instance, value):
    self.im.source = 'img2.jpg'

这会立即替换现有图像的来源,这将立即在您的gui中更新。请注意,我还添加了一个实例参数,该参数将传递给回调,因此您需要捕获它,否则您将使用错误数量的参数崩溃。

另外,我会在构建内部而不是类级别变量中定义您的图像。我不确定目前的方式是否真的会给你带来麻烦,但在某些情况下可能会这样。