【问题标题】:Kivy self manager get screen - not workingKivy 自我管理器得到屏幕 - 不工作
【发布时间】:2020-04-19 07:51:07
【问题描述】:

最近我尝试用 python 和 kivy 制作那个应用程序。经过数小时的谷歌搜索后,我或多或少拥有了我想要的一切。只缺少一件事:

我有几个屏幕。在应用程序的开头,我有一个菜单。之后我有很多问题;它们都在屏幕底部具有相同的文本和按钮。我设法通过以下方式做到了这一点:

<firstquestion>:
    name: "firstquestion"

    GridLayout:
        cols: 1
        size_hint_y: 1

        GridLayout:
            cols: 1

                NeuLabelinBox:
                    text: "Here the Question"

        GridLayout:
            cols: 1
            size_hint_y: 0.1

            UnteresMenue:       

请注意“UnteresMenue”,它引用了 kv 语言中的另一个类。我想我以某种方式将 2 个屏幕混合在一起。 “UnteresMenue”的kv代码

<UnteresMenue>:
    name: "UnteresMenue"
    #id: UnteresMenue


    GridLayout:
        cols: 1

        NeuButton: 
            text: root.labeltext 

现在是python部分:

class UnteresMenue(Screen):
    labeltext = StringProperty("Answer")

效果很好。但是现在我想更改这个“UnteresMenue”中标签的文本,当我在应用程序的开头按下某个按钮时(开始问题)。 “Untermenue”中的标签应更改为特定文本。所以要这样做:

text: "Exam"
self.manager.get_screen('UnteresMenue').labeltext = text

对于所有其他类,此方法可以正常工作。但不适用于特定课程“UnteresMenue”。是因为它是在问题中实现的,因此 kv 不能识别它的属性吗?

如有任何小提示,我将不胜感激!

这里是一个“迷你”示例:

在主菜单中,您将进入“考试”部分(在示例中按此处)。进入本节 (Prüfungsmodus) 时,问题的属性应该改变。再次“按这里”以回答问题。

通常它在问题的顶部说“这应该改变”并且这应该在进入 Prüfungsmodus 屏幕(python 文件中的类 def on_enter)时将标签更改为“Zeit”,但它没有...

Python 文件:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, TransitionBase
from kivy.properties import ObjectProperty, NumericProperty
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.core.text import LabelBase

from kivy.core.window import Window
from kivy.graphics import Color, InstructionGroup, Line, Rectangle
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

from kivy.properties import ListProperty
from kivy.uix.textinput import TextInput
from kivy.uix.checkbox import CheckBox
from kivy.uix.widget import Widget
from kivy.config import Config
from kivy.properties import StringProperty
from kivy.clock import Clock
from functools import partial
from kivy.uix.image import Image

from kivy.garden.navigationdrawer import NavigationDrawer as ND

from kivy.uix.scatter import Scatter
import random 
import time

Window.clearcolor = (0.2,0.2, 0.2,1)
Window.size = (480, 800)


#---------------------------------             Hauptmenü           -------------------------------------------

class hauptmenue(Screen, Widget):
    pass

class Pruefungsmodus(Screen):


    labeltext2 = StringProperty("hi")


    def on_enter(self):
        text = "Zeit" 

        self.manager.get_screen('OberesMenue').labeltext = text  #DAS Klappt nicht

    def StartPruefung(self):


        sm.current = "ersteFrage"  


class UnteresMenue(Screen):

    background_color_Kappa = ListProperty([0.2,0.2,0.2, 1]) 


class OberesMenue(Screen):

    BildLabeltext = StringProperty("Bilder\Loesung_Bild_pressed.png")
    BildLabeltext2 = StringProperty("Bilder\Loesung_Bild.png")
    labeltext = StringProperty("This should change")



class ersteFrage(Screen):

    pass





class WindowManager(ScreenManager):

    pass




kv = Builder.load_file("my.kv")
sm = WindowManager()


sm.add_widget(hauptmenue(name="hauptmenue"))



sm.add_widget(Pruefungsmodus(name="Pruefungsmodus"))       

sm.add_widget(OberesMenue(name="OberesMenue"))    
sm.add_widget(UnteresMenue(name="UnteresMenue"))   
sm.add_widget(ersteFrage(name="ersteFrage"))  
sm.current = "hauptmenue"






class Vorbrereitung(App):
    pruefung = ObjectProperty(None)
    def build(self):

        return sm

if __name__ == "__main__":
    Vorbrereitung().run()


my.kv 文件:





#:include alleFragen.kv

<NeuLabel2@Label>:


    halign: "center" 
    color:1,1,1,1 # <-----------
    canvas.before:
        Color:
            rgba: 0.2,0.2, 0.2,1
        Rectangle:
            pos: self.pos
            size: self.size  


<NeuLabelinBox@Label>:


    font_size: "22sp"
    color:0,0,0,1 # <-----------
    canvas.before:
        Color:
            rgba: 0.949019608,  0.949019608,  0.949019608, 1
        Rectangle:
            pos: self.pos
            size: self.size  

<NeuCheckBox@CheckBox>:

    color: 0, 0, 0, 1
    canvas.before:
        Color:
            rgba: 0.949019608,  0.949019608,  0.949019608, 1
        Rectangle:
            pos: self.pos
            size: self.size  


<NeuButton@Button>:

    font_size: "22sp"

    background_normal: ''
    #background_normal: "background.png"
    background_color: 0.92549,0.92549,0.92549, 1
    color:0,0,0,1 # <-----------
    canvas.before:
        Color:
            rgba: 0.2,0.2, 0.2,1
        Rectangle:
            pos: self.pos
            size: self.size   


<NeuButtonKappa@Button>:

    font_size: "40sp"

    background_normal: ''

    background_color: 0.2,0.2,0.2, 1
    color:1,1,1,1 # <-----------
    canvas.before:
        Color:
            rgba: 0.2,0.2, 0.2,1
        Rectangle:
            pos: self.pos
            size: self.size              

#----------------------------------            Hauptmenue          ---------------------------------------------------------------------------------

<hauptmenue>:
    name: "Hauptmenue"

    GridLayout:
        cols:1

        #spacing: 20


        GridLayout:
            cols:1
            padding: 20
            size_hint_y: 0.2           


            NeuLabel2:
                size_hint_x: 0.6
                text: ""
                font_size: (root.width**2 + root.height**2) / 13**4
                halign: 'center'
                valign: 'middle'


        GridLayout:
            cols:2
            padding: 30
            spacing: 20

            size_hint_y: 0.5
            BoxLayout:
                NeuButton:
                    text: ''

            BoxLayout:
                NeuButton:
                    text: 'PRESS HERE'
                    on_release:
                        app.root.current = "Pruefungsmodus"
            BoxLayout:
                NeuButton:
                    text: ""
                    halign: 'center'
                    valign: 'middle'

            BoxLayout:
                NeuButton:
                    text: ""
        BoxLayout:
            padding: 10
            size_hint_y: 0.15

            NeuButton:
                text: ''

#----------------------------------            Pruefungsmodus          ---------------------------------------------------------------------------------

<Pruefungsmodus>:
    name: "Pruefungsmodus"
    #background_color: 1, 1, 1, 1
    id: pruefungsmudos

    GridLayout:
        cols:1

        #spacing: 20


        GridLayout:
            cols:3
            padding: 20
            size_hint_y: 0.2           
            Image:
                size_hint_x: 0.2
                source:"Bilder\Logo.png"   

            NeuLabel2:
                size_hint_x: 0.6
                text: 'Pr\u00FCfungs\nmodus'
                font_size: (root.width**2 + root.height**2) / 12**4
                halign: 'center'
                valign: 'middle'

            Image:
                size_hint_x: 0.2
                source:"Bilder\Logo2.png"     


        GridLayout:
            cols:1
            padding: 30
            spacing: 10

            size_hint_y: 0.4
            NeuLabelinBox:
                id: text2
                text: root.labeltext2
                color: 0,0,0,1 # <-----------
                canvas.before:
                    Color:
                        rgba: 0.949019608,  0.949019608,  0.949019608, 1
                    Rectangle:
                        pos: self.pos
                        size: self.size 

        GridLayout:
            cols:2
            padding: 30

            size_hint_y: 0.2    

            BoxLayout:
                padding: 30
                spacing: 10
                NeuButton:
                    size_hint_x: 0.5
                    text: "Press Here" 
                    on_release:
                        app.root.current = "ersteFrage"



                NeuButton:
                    size_hint_x: 0.5
                    text: ""
                    on_release:
                        app.root.current = "hauptmenue"

#----------------------------------             Erste Frage           ---------------------------------------------------------------------------------

<ersteFrage>:
    name: "ersteFrage"


    GridLayout:
        cols: 1
        size_hint_y: 1

        GridLayout:
            cols: 1
            size_hint_y: 0.08

            OberesMenue:


        GridLayout:
            cols: 1

            size_hint_y: 0.1 

            NeuLabel2:
                font_size: "18sp"
                text: "Wie lautet......."        


        GridLayout:
            cols: 1


            size_hint_y: 0.7

            padding: 20
            background_color: 0.92549,0.92549,0.92549, 1  
            rows: 2
            BoxLayout:
                orientation:'horizontal'
                NeuLabelinBox:
                    text: "h+u=ZU" 
                NeuCheckBox:

                NeuLabelinBox:
                    text: "h+u=ZU"                    
                NeuCheckBox:

            BoxLayout:
                orientation:'horizontal'

                NeuLabelinBox:

                    text: "h+u=ZU" 
                NeuCheckBox:

                NeuLabelinBox:
                    text: "h+u=ZU"

                NeuCheckBox:

        GridLayout:
            cols: 1


            size_hint_y: 0.1


            UnteresMenue:      

以及外包的顶部和按钮菜单: alleFragen.kv

<OberesMenue>:
    id: OberesMenueee

    name: "OberesMenue"


    GridLayout:
        cols:1
        GridLayout:
            #size_hint_y: 0.05
            spacing: 20

            cols: 3
            NeuButton:
                text: ""
                size_hint_x: 0.16

                background_color: 1,1,1, 1
                background_down:  root.BildLabeltext
                background_normal:  root.BildLabeltext2
                color:1,1,1,1 # <-----------
                canvas.before:
                    Color:
                        rgba: 0.2,0.2, 0.2,1
                    Rectangle:
                        pos: self.pos
                        size: self.size  

            NeuLabel2:

                size_hint_x: 0.8 

                text: root.labeltext

            NeuButtonKappa: 
                size_hint_x: 0.1 
                text: "MENU"
                background_down: "Bilder\HintergurndFarbe_app.png"
                on_release:
                    app.root.current = "hauptmenue"


<UnteresMenue>:
    name: "UnteresMenue"
    id: UnteresMenuee


    GridLayout:
        cols: 5
        spacing: 20
        padding: 20
        NeuButton: 
            text: "<=="

        NeuButton: 
            text: "<"

        NeuButtonKappa: 
            text: 'k'
            #background_color: root.background_color_Kappa
            background_down:  "Bilder\HintergurndFarbe_app.png"

        NeuButton: 
            text: ">"

        NeuButton: 
            text: "==>"        

【问题讨论】:

  • 你说“不工作”。你会收到 ant 错误消息吗?
  • 一点也不。它只是忽略命令。一切正常,没有任何错误
  • 那么您可能需要发布minimal reproducible example 以获得任何帮助。
  • 我确实用一个例子更新了我的问题。我希望这没问题:/

标签: python kivy


【解决方案1】:

问题是您有两个不同的OberesMenue 屏幕实例。

在你的 python 中创建了一个:

sm.add_widget(OberesMenue(name="OberesMenue"))

您在kv 中创建了另一个:

<ersteFrage>:
    name: "ersteFrage"


    GridLayout:
        cols: 1
        size_hint_y: 1

        GridLayout:
            cols: 1
            size_hint_y: 0.08

            OberesMenue:

为了访问OberesMenue 的第二个实例,您可以添加id

<ersteFrage>:
    name: "ersteFrage"


    GridLayout:
        cols: 1
        size_hint_y: 1

        GridLayout:
            cols: 1
            size_hint_y: 0.08

            OberesMenue:
                id: in_ersteFrage

然后在Pruefungsmoduson_enter() 方法中,您可以使用以下方法更改该实例:

def on_enter(self):
    text = "Zeit"

    self.manager.get_screen('ersteFrage').ids.in_ersteFrage.labeltext = text  #DAS Klappt nicht

请注意,这会更改OberesMenue 第二个实例中的Label,但对第一个实例没有影响。您的原始代码正在更改第一个实例,但不是第二个。而且您不能同时在两个地方放置同一个实例,因为Widget 一次只能有一个父级。

因此,如果这些实例是相同的,那么您需要更改两者中的 Label

如果您真的想共享同一个实例,您可以保留自己的位置记录,并使用remove_widget()add_widget() 将其从一个父级移动到另一个父级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    相关资源
    最近更新 更多