Python 更改背景画布kivy

Python 更改背景画布kivy,python,image,canvas,kivy,Python,Image,Canvas,Kivy,我有画布背景,但当一个人按下正确的按钮进入下一层时,我试图切换背景。我试图在一节课内完成这一切。是否有一种方法可以将图像指定给画布矩形,然后按下按钮画布图像将更改为新源 main.py class MazeSolution(Screen): def CheckDoor1(self): if self.ids.door1.source == "correct": print("correct") self.ids.change

我有画布背景,但当一个人按下正确的按钮进入下一层时,我试图切换背景。我试图在一节课内完成这一切。是否有一种方法可以将图像指定给画布矩形,然后按下按钮画布图像将更改为新源

main.py

class MazeSolution(Screen):
    def CheckDoor1(self):
        if self.ids.door1.source == "correct":
            print("correct")
            self.ids.change.source = 's-curvee selection.png'
        else:
            print("incorrect")
主电压(千伏)

#:import utils kivy.utils
<MazeSolution>:
    FloatLayout:
        canvas:
            Rectangle:
                id: change
                source: 'selection grass.png'
                pos: self.pos
                size: self.size
        Button:
            pos_hint: {"top": .8, "right": .75}
            size_hint: .5, .1
            text:
                "Door 1"
            source: "<random_name>"
            id: door1
            on_press:
                root.CheckDoor1()
:导入utils kivy.utils
:
浮动布局:
画布:
矩形:
id:零钱
来源:“selection grass.png”
pos:self.pos
大小:self.size
按钮:
pos_提示:{“top”:.8,“right”:.75}
大小提示:.5,.1
正文:
“1号门”
资料来源:“”
身份证号码:1
新闻界:
root.CheckDoor1()

我认为不支持在
canvas
指令中分配
id
。但是,您可以通过在
python
中创建
矩形来完成相同的任务:

from kivy.app import App
from kivy.graphics.vertex_instructions import Rectangle
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager


class MazeSolution(Screen):
    def __init__(self):
        super(MazeSolution, self).__init__()
        # make the Rectangle here and save a reference to it
        with self.canvas.before:
            self.rect = Rectangle(source='selection grass.png')

    def on_pos(self, *args):
        # update Rectangle position when MazeSolution position changes
        self.rect.pos = self.pos

    def on_size(self, *args):
        # update Rectangle size when MazeSolution size changes
        self.rect.size = self.size

    def CheckDoor1(self):
        if self.ids.door1.source == "correct":
            print("correct")
            # use the saved reference to change the background 
            self.rect.source = 's-curvee selection.png'
        else:
            print("incorrect")

Builder.load_string('''
<MazeSolution>:
    FloatLayout:
        Button:
            pos_hint: {"top": .8, "right": .75}
            size_hint: .5, .1
            text:
                "Door 1"
            source: "correct"
            id: door1
            on_press:
                root.CheckDoor1()
''')

class TestApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MazeSolution())
        return sm

TestApp().run()
从kivy.app导入应用
从kivy.graphics.vertex\u指令导入矩形
从kivy.lang导入生成器
从kivy.uix.screenmanager导入屏幕,screenmanager
类别MazeSolution(屏幕):
定义初始化(自):
super(MazeSolution,self)。\uuuu init\uuuuu()
#在此处创建矩形并保存对其的引用
使用self.canvas.before:
self.rect=Rectangle(source='selection grass.png')
位置上的def(自身,*参数):
#MazeSolution位置更改时更新矩形位置
self.rect.pos=self.pos
def on_大小(自身,*参数):
#当MazeSolution大小更改时更新矩形大小
self.rect.size=self.size
def检查门1(自身):
如果self.ids.door1.source==“正确”:
打印(“正确”)
#使用保存的参照更改背景
self.rect.source='s-curvee selection.png'
其他:
打印(“不正确”)
Builder.load_字符串(“”)
:
浮动布局:
按钮:
pos_提示:{“top”:.8,“right”:.75}
大小提示:.5,.1
正文:
“1号门”
资料来源:“正确”
身份证号码:1
新闻界:
root.CheckDoor1()
''')
类TestApp(应用程序):
def生成(自):
sm=屏幕管理器()
sm.add_小部件(MazeSolution())
返回sm
TestApp().run()

_pos()
上的
上的
方法执行
kv
将自动为您设置的操作,但必须手动设置,因为
矩形
不是在
kv

中创建的,我认为不支持在
画布
中分配
ID
。但是,您可以通过在
python
中创建
矩形来完成相同的任务:

from kivy.app import App
from kivy.graphics.vertex_instructions import Rectangle
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager


class MazeSolution(Screen):
    def __init__(self):
        super(MazeSolution, self).__init__()
        # make the Rectangle here and save a reference to it
        with self.canvas.before:
            self.rect = Rectangle(source='selection grass.png')

    def on_pos(self, *args):
        # update Rectangle position when MazeSolution position changes
        self.rect.pos = self.pos

    def on_size(self, *args):
        # update Rectangle size when MazeSolution size changes
        self.rect.size = self.size

    def CheckDoor1(self):
        if self.ids.door1.source == "correct":
            print("correct")
            # use the saved reference to change the background 
            self.rect.source = 's-curvee selection.png'
        else:
            print("incorrect")

Builder.load_string('''
<MazeSolution>:
    FloatLayout:
        Button:
            pos_hint: {"top": .8, "right": .75}
            size_hint: .5, .1
            text:
                "Door 1"
            source: "correct"
            id: door1
            on_press:
                root.CheckDoor1()
''')

class TestApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MazeSolution())
        return sm

TestApp().run()
从kivy.app导入应用
从kivy.graphics.vertex\u指令导入矩形
从kivy.lang导入生成器
从kivy.uix.screenmanager导入屏幕,screenmanager
类别MazeSolution(屏幕):
定义初始化(自):
super(MazeSolution,self)。\uuuu init\uuuuu()
#在此处创建矩形并保存对其的引用
使用self.canvas.before:
self.rect=Rectangle(source='selection grass.png')
位置上的def(自身,*参数):
#MazeSolution位置更改时更新矩形位置
self.rect.pos=self.pos
def on_大小(自身,*参数):
#当MazeSolution大小更改时更新矩形大小
self.rect.size=self.size
def检查门1(自身):
如果self.ids.door1.source==“正确”:
打印(“正确”)
#使用保存的参照更改背景
self.rect.source='s-curvee selection.png'
其他:
打印(“不正确”)
Builder.load_字符串(“”)
:
浮动布局:
按钮:
pos_提示:{“top”:.8,“right”:.75}
大小提示:.5,.1
正文:
“1号门”
资料来源:“正确”
身份证号码:1
新闻界:
root.CheckDoor1()
''')
类TestApp(应用程序):
def生成(自):
sm=屏幕管理器()
sm.add_小部件(MazeSolution())
返回sm
TestApp().run()

_pos()
上的
上的
方法执行
kv
将自动为您设置的操作,但必须手动设置,因为
矩形
不是在
kv
中创建的。reload()该解决方案对我不起作用。显示此问题的最小工作代码,以便wwe可以运行它并查看问题。.reload()该解决方案对我不起作用。显示此问题的最小工作代码,以便wwe可以运行它并查看问题。