Как сохранить одинаковый текст метки между двумя экранами kivy - PullRequest
0 голосов
/ 30 мая 2020

Я новичок в kivy и python, поэтому мой код не идеален. Я пытаюсь создать программу с двумя экранами: на первом экране есть метка с текстом, который не определен и который может изменяться, и на втором экране, который сохраняет тот же текст, что и на первом экране.

Я искал неделю и попытался создать глобальную переменную, которую я редактирую, и которая становится текстом второй метки, но это не работает.

Я тоже пробовал с String. свойство () или объект. property (), но я больше не получил результатов и не совсем понимал, как его использовать.

Любая помощь будет приветствоваться <3 </p>

(извините за мой engli sh)

Вот часть моего кода, которую я максимально упростил:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen


Builder.load_string("""

<MenuScreen>:
    label_wid : ratio
    FloatLayout:         
        Button:
            text: "options"
            pos: 270, 240
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press: root.manager.current = 'settings'
         Label:
            id:ratio
            text: ""
            pos: 0,90
            font_size:30
            color:1,0,0,1


<SettingsScreen>:
    label_wid2 : ratio
    FloatLayout:
        Label:
            id:ratio
            text: str(root.texte2())
            pos: 0,90
            font_size:30
            color:1,0,0,1

""")

u=""

class MenuScreen(Screen):

    def texte(self):
        global u
        u= self.label_wid.text = 'exemple' 
    pass

class SettingsScreen(Screen):

    def texte2(self):
        self.label_wid2.text=u


    pass


class Quizz(App):
    def build(self):
        self.title = 'Quizz'
        Window.clearcolor = (0, 1, 1, 0.25)
        return sm


sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))


if __name__ == '__main__':
    Quizz().run()
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen


Builder.load_string("""

<MenuScreen>:
    label_wid : ratio
    FloatLayout:         
        Button:
            text: "options"
            pos: 270, 240
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press: root.manager.current = 'settings'
         Label:
            id:ratio
            text: ""
            pos: 0,90
            font_size:30
            color:1,0,0,1


<SettingsScreen>:
    label_wid : ratio
    FloatLayout:
        Label:
            id:ratio
            text: root.texte2()
            pos: 0,90
            font_size:30
            color:1,0,0,1

""")

u=""

class MenuScreen(Screen):

    def texte(self):
        global u
        u= self.label_wid.text = 'exemple' 
    pass

class SettingsScreen(Screen):

    def texte2(self, text):
        u


    pass


class Quizz(App):
    def build(self):
        self.title = 'Quizz'
        Window.clearcolor = (0, 1, 1, 0.25)
        return sm


sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))


if __name__ == '__main__':
    Quizz().run() ```



1 Ответ

0 голосов
/ 30 мая 2020

Использование StringProperty в ScreenManager и другого в SettingsScreen обеспечивает источник текста для Labels в разных Screens. И изменение StringProperty может изменить как Labels:

from kivy.app import App
from kivy.clock import Clock
from kivy.properties import StringProperty
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen


class MenuScreen(Screen):
    pass


class SettingsScreen(Screen):
    # this is the text to be used when the first Label text is not '1'
    theOtherText = StringProperty('Not One')


class MyScreenManager(ScreenManager):
    # This is the text that both Labels may display
    theText = StringProperty('0')


kv = """
MyScreenManager:
    MenuScreen:
        name: 'menu'
    SettingsScreen:
        name: 'settings'

<MenuScreen>:
    label_wid : ratio
    FloatLayout:         
        Button:
            text: "options"
            pos: 270, 240
            size_hint: .30, .10
            background_color: 0,1,0,0.75
            on_press: root.manager.current = 'settings'
        Label:
            id:ratio
            # Use theText Property from MyScreenManager
            text: root.manager.theText
            pos: 0,90
            font_size:30
            color:1,0,0,1

<SettingsScreen>:
    label_wid : ratio
    FloatLayout:
        Label:
            id:ratio
            # Use theText Property from MyScreenManager
            text: '1' if root.manager.theText == '1' else root.theOtherText
            pos: 0,90
            font_size:30
            color:1,0,0,1

"""


class Quizz(App):
    def build(self):
        self.title = 'Quizz'
        Window.clearcolor = (0, 1, 1, 0.25)
        Clock.schedule_once(self.change_text, 4)
        return Builder.load_string(kv)

    def change_text(self, dt):
        print('changing text')
        self.root.theText = '1'


if __name__ == '__main__':
    Quizz().run()

Создание MyScreenManager в kv устраняет необходимость проверять, установлен ли атрибут manager для Screens . Это упрощает лог c в kv. Затем строка в kv:

text: '1' if root.manager.theText == '1' else root.theOtherText

устанавливает текст второго Label в 1, если первый Label текст равен 1, в противном случае он устанавливается в значение theOtherText в SettingsScreen.

Я добавил Clock.schedule_once() только для тестирования.

...