Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类之间的Python Kivy引用_Python_Kivy - Fatal编程技术网

类之间的Python Kivy引用

类之间的Python Kivy引用,python,kivy,Python,Kivy,以下是相关的.py代码: from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition from kivy.uix.boxlayout import BoxLayout from kivy.uix.floatlayout import FloatLayout from kivy.uix.button import Button from kivy.core.ima

以下是相关的.py代码:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.core.image import Image
from kivy.graphics import Color, Rectangle
from kivy.core.audio import SoundLoader
from kivy.core.text import LabelBase

import pygame
from pygame.locals import*

import random

class RootScreen(ScreenManager):
    pass


class LevelOneBedroomScreen(Screen):
    def __init__(self, **kwargs):
        super(LevelOneBedroomScreen, self).__init__(**kwargs)

    def next_text(self):
        if self.ids.level_one_bedroom_text.text == '*YAWN*':
            self.ids.level_one_bedroom_image.source = 'placeholder_background2.png'
            self.ids.level_one_bedroom_text.text = 'Hello'
        elif self.ids.level_one_bedroom_text.text == 'Hello':
            self.manager.current = 'level one bedroom choice'   

class LevelOneBedroomChoiceScreen(Screen):
    def __init__(self, **kwargs):
        super(LevelOneBedroomChoiceScreen, self).__init__(**kwargs)

    def get_image(self):
        #This part is not working
        self.ids.level_one_bedroom_choice_image.source = LevelOneBedroomScreen.ids.level_one_bedroom_image.source


class screensApp(App):
    def build(self):
        return RootScreen()

if __name__ == "__main__":
    screensApp().run()
在底部附近,我对代码中不起作用的部分进行了注释。我有两个几乎相同的屏幕,其中一个LevelOne卧室屏幕有文本,LevelOne卧室选项屏幕有按钮。我需要两个背景图像是相同的,因为第一个屏幕偶尔会更新图像,所以我在.kv文件中写了一些东西,希望能从第一个屏幕中提取图像,但它会导致一个错误。以下是.kv中的相关代码:

#:import FadeTransition kivy.uix.screenmanager.FadeTransition

<RootScreen>:
    transition: FadeTransition() 
    LevelOneBedroomScreen:
    LevelOneBedroomChoiceScreen:

<LevelOneBedroomScreen>:
    name: 'level one bedroom'
    id: level_one_bedroom
    Image:
        id: level_one_bedroom_image
        source: 'placeholder_background.png'
        size: self.size
        pos: self.pos
        allow_stretch: True
        keep_ratio: False
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Image of Bedroom'
        Button:
            text: 'Dialogue'
            background_color: 0,0,0,0       
    BoxLayout:
        size_hint_y: .2
        Label:
            text: 'left arrow'
        Button:
            text: 'choose'  
            on_release: root.manager.current = 'level one bedroom choice'           
        Label:
            text: 'right arrow'         
<LevelOneBedroomChoiceScreen>:
    name: 'level one bedroom choice'
    id: level_one_bedroom_choice
    Image:
        id: level_one_bedroom_choice_image
        source: get_image()
        size: self.size
        pos: self.pos
        allow_stretch: True
        keep_ratio: False
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Image of Bedroom'
        BoxLayout:
            orientation: 'vertical'
            BoxLayout:
                Button:
                    text: 'choice 1'
                Button:
                    text: 'choice 2'
            BoxLayout:
                Button:
                    text: 'choice 3'
                Button:
                    text: 'choice 4'
        BoxLayout:
            size_hint_y: .2
            Label:
                text: 'left arrow'
            Button:
                text: 'home'    
                on_release: root.manager.current = 'levels'         
            Label:
                text: 'right arrow' 
#:导入FadeTransition kivy.uix.screenmanager.FadeTransition
:
转换:FadeTransition()
LevelOne卧室屏幕:
LevelOne卧室选择屏幕:
:
名称:“一层卧室”
id:一层卧室
图片:
id:level_one_卧室_图像
来源:“占位符_background.png”
大小:self.size
pos:self.pos
允许拉伸:真
保留比率:False
盒子布局:
方向:“垂直”
标签:
文字:“卧室图像”
按钮:
文本:“对话”
背景颜色:0,0,0,0
盒子布局:
大小\u提示\u y:.2
标签:
文本:“左箭头”
按钮:
文本:“选择”
发布时:root.manager.current='一级卧室选择'
标签:
文本:“右箭头”
:
名称:“一级卧室选择”
id:一层一居室选择
图片:
id:level\u one\u卧室\u选择\u图像
来源:get_image()
大小:self.size
pos:self.pos
允许拉伸:真
保留比率:False
盒子布局:
方向:“垂直”
标签:
文字:“卧室图像”
盒子布局:
方向:“垂直”
盒子布局:
按钮:
文本:“选择1”
按钮:
文本:“选择2”
盒子布局:
按钮:
文本:“选择3”
按钮:
正文:“选择4”
盒子布局:
大小\u提示\u y:.2
标签:
文本:“左箭头”
按钮:
文字:“家”
发布时:root.manager.current='levels'
标签:
文本:“右箭头”
我插入了一条注释,说明代码的哪一部分导致了错误。提前感谢您,非常感谢您的反馈。

使用self.manager.ids.level\u one\u dombery\u image.source替换levelonebeddroomscreen.ids.level\u one\u dombery\u image.source

实例 main.py 试验电压(千伏)
#:kivy 1.9.1
:
LevelOne卧室屏幕:
id:一层卧室
LevelOne卧室选择屏幕:
id:一层一居室选择
:
名称:“一层卧室”
盒子布局:
方向:“垂直”
图片:
id:level_one_卧室_图像
来源:“卧房.jpeg”#“占位符_background.png”
大小:self.size
pos:self.pos
允许拉伸:真
保留比率:False
按钮:
大小提示:1,0.2
文字:“卧室选择”
发布时:root.manager.current='一级卧室选择'
:
名称:“一级卧室选择”
图片:
id:level\u one\u卧室\u选择\u图像
#下面是失败的代码
#资料来源:
大小:self.size
pos:self.pos
允许拉伸:真
保留比率:False
输出

当LevelOne卧室屏幕也更改背景时,是否希望使用LevelOne卧室选择屏幕?什么是
LevelOne卧室文字
?,请在LevelOne卧室屏幕更改背景时提供,我希望LevelOne bedroom ChoiceScreen具有与level_one_bedroom_text相同的背景?level_one_bedroom_text是布局的id,其中包含我从.kv中排除的文本,这与此无关,我很抱歉,这令人困惑。非常感谢@ikolim,这解决了我的问题。我试过一些方法,但这绝对是最干净的解决方案。
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen


class Home(ScreenManager):
    pass


class LevelOneBedroomScreen(Screen):
    def __init__(self, **kwargs):
        super(LevelOneBedroomScreen, self).__init__(**kwargs)

    def next_text(self):
        if self.ids.level_one_bedroom_text.text == '*YAWN*':
            self.ids.level_one_bedroom_image.source = 'placeholder_background2.png'
            self.ids.level_one_bedroom_text.text = 'Hello'
        elif self.ids.level_one_bedroom_text.text == 'Hello':
            self.manager.current = 'level one bedroom choice'


class LevelOneBedroomChoiceScreen(Screen):
    def __init__(self, **kwargs):
        super(LevelOneBedroomChoiceScreen, self).__init__(**kwargs)

    def on_pre_enter(self, *args):
        self.ids.level_one_bedroom_choice_image.source = self.manager.ids.level_one_bedroom.ids.level_one_bedroom_image.source


class TestApp(App):

    def build(self):
        return Home()


if __name__ == "__main__":
    TestApp().run()
#:kivy 1.9.1

<Home>:
    LevelOneBedroomScreen:
        id: level_one_bedroom
    LevelOneBedroomChoiceScreen:
        id: level_one_bedroom_choice

<LevelOneBedroomScreen>:
    name: 'level one bedroom'
    BoxLayout:
        orientation: 'vertical'
        Image:
            id: level_one_bedroom_image
            source: 'bedroom.jpeg'  # 'placeholder_background.png'
            size: self.size
            pos: self.pos
            allow_stretch: True
            keep_ratio: False
        Button:
            size_hint: 1, 0.2
            text: 'Bedroom Choice'
            on_release: root.manager.current = 'level one bedroom choice'

<LevelOneBedroomChoiceScreen>:
    name: 'level one bedroom choice'
    Image:
        id: level_one_bedroom_choice_image
        #below is the code that fails
        # source:
        size: self.size
        pos: self.pos
        allow_stretch: True
        keep_ratio: False