如何在两个屏幕之间保持相同的标签文本

时间:2020-05-30 13:35:26

标签: python android mobile kivy kivy-language

我是kivy和python的新手,所以我的代码并不完美。 我正在尝试制作一个具有2个屏幕的程序,第一个屏幕上有一个标签,其中标签的文字未定义并且可以更改,第二个屏幕保留与第一个屏幕相同的文本。

我一直在搜索一个星期,所以尝试制作一个要编辑的全局变量,该变量成为第二个标签的文本,但是它不起作用。

我也尝试过String。属性()或对象。 property(),但我没有得到更多结果,我也不真正了解如何使用它。

任何帮助都将受到欢迎<3

(对不起,我的英语)

这是我的代码中已尽可能简化的一部分:

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 :(得分:0)

TableView中使用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的{​​{1}}属性是否已设置。这简化了manager中的逻辑。然后是Screens中的行:

kv

如果第一个kv的文本为text: '1' if root.manager.theText == '1' else root.theOtherText ,则将第二个Label的文本设置为1,否则将其设置为{ Label

我添加了一个1只是用于测试。