如何在kivy的另一个屏幕中更改标签文本值

How to change label text value in another screen in kivy

所以我正在使用 Kivy/KivyMD 制作在线井字游戏,我有点卡在这里试图编辑另一个屏幕的标签值。

这里是main.py

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager, Screen
from requests import get

ip = get('https://api.ipify.org').text

class OptionScreen(Screen):
    pass

class JoinServer(Screen):
    pass

class CreateServer(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class TicTacToeApp(MDApp):
    def __init__(self, **kwargs):
        self.title = "TicTacToe Online"
        super().__init__(**kwargs)

    def build(self):
        TicTacToeApp.build.kv = Builder.load_file('styles\main.kv')
        self.theme_cls.theme_style = "Dark"
        self.theme_cls.primary_palette = "Gray"

        return TicTacToeApp.build.kv

    def join(self):
        TicTacToeApp.build.kv.current = 'join'
        

    def create(self):
        TicTacToeApp.build.kv.current = 'create'


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

这是 main.kv 文件:

#:kivy 2.0.0

WindowManager:
    OptionScreen:
        name: 'option'
    JoinServer:
        name: 'join'
    CreateServer:
        name: 'create'


<OptionScreen>:
    MDCard:
        size_hint: None, None
        size: 700, 500
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        spacing: 25
        padding: 25
        orientation: 'vertical'

        MDLabel:
            text: "Choose an option"
            font_size: "28"
            padding_y: 15
            size_hint_y: None
            halign: 'center'
            pos_hint: {'center_x': 0.5,'center_y':0.5}

        MDRoundFlatButton:
            text:"Join Server"
            font_size: 20
            pos_hint: {'center_x':0.5}
            on_press: app.join()

        MDRoundFlatButton:
            text:"Create Server"
            font_size: 20
            pos_hint: {'center_x':0.5}
            on_press: app.create()

        Widget:
            size_hint_y: None
            height: 90
            
<JoinServer>:
    MDCard:
        size_hint: None, None
        size: 700, 500
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        spacing: 25
        padding: 25
        orientation: 'vertical'

        MDLabel:
            text: "Join Server"
            font_size: "28"
            padding_y: 15
            size_hint_y: None
            halign: 'center'
            pos_hint: {'center_x': 0.5,'center_y':0.5}

        Widget:
            size_hint_y: None
            height: 325       

<CreateServer>:
    MDCard:
        size_hint: None, None
        size: 700, 500
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        spacing: 25
        padding: 25
        orientation: 'vertical'

        MDLabel:
            text: "Create Server"
            font_size: 40
            padding_y: 15
            size_hint_y: None
            halign: 'center'
            pos_hint: {'center_x': 0.5,'center_y':0.5}

        MDLabel:
            text: "Server Address: "
            id: address
            font_size: 18
            size_hint_y: None
            halign: 'center'
            pos_hint: {'center_x': 0.5,'center_y':0.5}

        MDTextField:
            mode: 'round'
            id: passw
            hint_text: "Password"
            size_hint_x: None
            width: 150
            font_size: 18
            pos_hint: {'center_x': 0.5}
            

        MDRoundFlatButton:
            text:"Create Server"
            font_size: 20
            pos_hint: {'center_x': 0.5}
            on_press: app.create_s()

        Widget:
            size_hint_y: None
            height: 20

我想在切换到 CreateServer 屏幕后立即将 CreateServer 屏幕中 ID 为 address 的标签文本更改为其他内容。

我也想知道如何在kivy中一切换屏幕就执行代码

要在 CreateServer 屏幕中更改 ID 为 address 的标签,只需转到 CreateServer class 并进行以下更改。

class CreateServer(Screen):
    def on_enter(self, *args):
        self.manager.get_screen("create").ids.address.text = "your new text value"

并在切换屏幕时执行代码。 使用上面答案中使用的 on_enter 函数。 on_enter 功能在屏幕激活后立即触发。 我希望它回答了你的问题。