7 Stimmen

Kivy - Screen Manager - Zugriff auf Attribut in anderer Klasse

Mit dem Kivy Screen Manager erstelle ich zwei Screens. Während ich mich im Screen 1 befinde, möchte ich ein Label im Screen zwei ändern. Ich markiere den problematischen Bereich in meinem Code:

Mein test.ky:

#: import ScreenManager kivy.uix.screenmanager.ScreenManager
#: import Screen kivy.uix.screenmanager.ScreenManager
#: import SettingsScreen screen

ScreenManager:
    MenuScreen:
    SettingsScreen:

:
    name: 'MenuScreen'
    BoxLayout:
        Button:
            text: 'Goto nn'
            on_press: 
                root.manager.current = 'SettingsScreen'
                root.change_text()

:
    name: 'SettingsScreen'
    label_id: label_field
    BoxLayout:
        Label:
            id: label_field
            text: "to_be_changed"

und mein screen.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen

class MenuScreen(Screen):
    def change_text(self):
        pass
        # HIER: so etwas wie
        # root.SettingsScreen.label_field.text = 'neuer Text'

class SettingsScreen(Screen):
    pass

class TestApp(App):
    pass

TestApp().run()

Jede Hilfe ist sehr geschätzt! Vielen Dank, Nico

12voto

Totem Punkte 7209

Wie wäre es damit:

Wenn Sie die Schaltfläche auf der MenuScreen drücken, wird ein Attribut mit dem gewünschten Text im Einstellungen-Bildschirm Label auf sich selbst gesetzt. Dann wird dem MenuScreen im kv-Datei eine ID-Wert zugewiesen, der verwendet wird, um auf dieses Attribut zu verweisen. Beispiel:

main.py

class MenuScreen(Screen):
    text = StringProperty('')
    def change_text(self):
        self.text = "Der Text, den Sie setzen möchten"
        self.manager.current = "SettingsScreen"

class SettingsScreen(Screen):
    label_text = StringProperty('')

kv-Datei

ScreenManager:
    id: screen_manager
    MenuScreen:
        id: menu_screen
        name: 'MenuScreen'
        manager: screen_manager
    SettingsScreen:
        name: 'SettingsScreen'
        manager: screen_manager
        label_text: menu_screen.text

:
    BoxLayout:
        Button:
            text: 'Gehe zu nn'
            on_press:
                root.change_text()

:
    BoxLayout:
        Label:
            text: root.label_text

Wie Sie sehen können, habe ich die Namen und IDs der Bildschirme unter ScreenManager selbst in der kv-Datei festgelegt, da dies normalerweise das ist, was ich tun würde, um dies zum Laufen zu bringen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X