Kivy Self Manager получить экран - не работает - PullRequest
0 голосов
/ 19 апреля 2020

В последнее время я пытаюсь сделать это приложение с 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 экрана вместе в одном. Код kv "UnteresMenue"

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


    GridLayout:
        cols: 1

        NeuButton: 
            text: root.labeltext 

Теперь для python части:

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

Это прекрасно работает. Но теперь я хочу изменить текст метки в этом «UnteresMenue», когда я нажимаю определенную кнопку в начале приложения (Start Questions). Метка в «Untermenue» должна измениться на определенный текст. Для этого:

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

Для всех остальных классов этот метод работает нормально. Но не для этого определенного класса "UnteresMenue". Это потому, что оно реализовано в вопросе и поэтому kv не распознает его свойства?

За любые небольшие подсказки я был бы более чем признателен!

Вот пример «Мини»:

В главном меню вы попадаете в раздел «Экзамен» (нажмите Вот в примере). При входе в этот раздел (Prüfungsmodus) свойство вопросов должно измениться. «Нажмите здесь» еще раз, чтобы перейти к вопросам.

Обычно в верхней части вопроса говорится «Это должно измениться», и ЭТО должно изменить ярлык на «Zeit» при входе в экран Prüfungsmodus (класс def on_enter, в файле python, но не ...

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:      

и аутсорсинговое меню Top and Button: 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: "==>"        

1 Ответ

0 голосов
/ 20 апреля 2020

Проблема в том, что у вас есть два разных экземпляра экрана 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

Затем в ваш метод on_enter() из Pruefungsmodus, вы можете изменить этот экземпляр с помощью:

def on_enter(self):
    text = "Zeit"

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

Обратите внимание, что это изменяет Label во втором экземпляре OberesMenue, но не влияет на первый. Ваш оригинальный код менял первый экземпляр, но не второй. И вы не можете поместить один и тот же экземпляр в обоих местах одновременно, так как Widget может иметь только одного родителя за раз.

Итак, если эти экземпляры предназначены быть идентичными, то вы необходимо изменить Label в обоих.

Если вы действительно хотите поделиться одним экземпляром, вы можете сохранить свой собственный отчет о том, где он находится, и использовать remove_widget() и add_widget(), чтобы переместить его из одного родитель другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...