如何用 kivy 中的图像填充 canvas?

How to fill canvas with an image in kivy?

如何用我的图像填充整个矩形,使其适合整个屏幕作为背景?

from random import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.graphics import Color, Line, Rectangle
from kivy.uix.filechooser import FileChooserListView, FileChooserIconView
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image

class MyPaintWidget(Widget):       
    def on_touch_down(self, touch):
        color = (random(), random(), random())
        with self.canvas:
            Rectangle(source='water.png', pos=(0, 0), size=self.size)        
            Color(*color)
            d = 30.
            touch.ud['line'] = Line(points=(touch.x, touch.y))

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]



class MyPaintApp(App):
    def build(self):
        parent = Widget()
        painter = MyPaintWidget()
        parent.add_widget(painter)


        return parent

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

现在它默认只在左下角显示一个小图像。我不知道如何调整图片大小或居中,因为我不知道中心的坐标是什么,而且图片不会调整大小。

矩形被设置为 MyPaintWidget 的大小,它在父窗口小部件上以默认大小绘制。如果 MyPaintWidget 是根控件,那么设置 self.size 将允许它占用整个 window space。 (请注意,当前结构只会在 on_touch_down 事件上调整 canvas 的大小。因此,如果您调整 window 的大小,则需要单击以调整图像的大小。)

#Change MyPaintApp to the following...
class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()

您还可以创建一个单独的小部件来保存背景。下面我添加了一个 MyBackground 小部件,用于背景,并在屏幕大小发生变化时绑定调整大小。还有其他几种方法可以做到这一点。

from random import random
from kivy.app import App 
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.graphics import Color, Line, Rectangle
from kivy.uix.filechooser import FileChooserListView, FileChooserIconView
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image


class MyBackground(Widget):
    def __init__(self, **kwargs):
        super(MyBackground, self).__init__(**kwargs)
        with self.canvas:
            self.bg = Rectangle(source='water.png', pos=self.pos, size=self.size)

        self.bind(pos=self.update_bg)
        self.bind(size=self.update_bg)

    def update_bg(self, *args):
        self.bg.pos = self.pos
        self.bg.size = self.size


class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        color = (random(), random(), random())
        with self.canvas:
            Color(*color)
            d = 30.
            touch.ud['line'] = Line(points=(touch.x, touch.y))

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]

class MyPaintApp(App):
    def build(self):
        parent = MyBackground()
        painter = MyPaintWidget()
        parent.add_widget(painter)
        return parent

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

写入.kv 文件很容易。

<MyPaintWidget>
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'water.png'