簡體   English   中英

在 Kivy (Python) 中跨屏幕更新標簽 - 與 ScreenManager 的.kv 和 .py 文件之間的交互(缺乏)問題

[英]Updating Labels across Screens in Kivy (Python) - Problem with (lack of) interactions between .kv and .py files with ScreenManager

我正在嘗試構建一個 Kivy 應用程序,該應用程序具有 2 個屏幕,這些屏幕通過不同的文本一遍又一遍地重復使用。

So I go from a FirstScreen with a Label that says "First1" to a SecondScreen with a Label that says "Second1", and then back to the FirstScreen but this time with the Label "First2", then SecondScreen and "Second2", and等等等等。

此代碼非常簡單,但在沒有指定更新按鈕的情況下更新 Label 文本似乎存在問題。 出於某種原因,我的 Python 代碼設法更新了文本,但它沒有在 my.kv 文件中更新。 例如,我的打印語句會告訴我 Label 文本是“First2”,但 Kivy 為我顯示“First1”。 我在下面的屏幕截圖中說明了這一點:

在此處輸入圖像描述

通過添加一個在按下時更新文本的按鈕,所有內容都會更新、同步並正常工作,但我真的希望它能夠在沒有額外用戶輸入的情況下工作。 有誰知道我怎么能 go 關於這個? 我已經左右搜索了文檔和 stackoverflow 問題,但似乎找不到我看似簡單的問題的答案。

這是代碼:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty, ObjectProperty
from kivy.lang import Builder

S_ID = 1  # global screen ID. I'm using this to detect what text to use.


class FirstScreen(Screen):
    text = StringProperty("")
    lbl = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(FirstScreen, self).__init__(**kwargs)
        global S_ID
        print("\nS_ID is ", S_ID)
        self.update()

    def update(self):
        print("FIRST - UPDATE")
        if S_ID == 1:
            print("FIRST1")
            self.text = "FIRST1"
        elif S_ID == 2:
            print("FIRST2")
            self.text = "FIRST2"
            print("self.lbl.text", self.lbl.text)
        else:
            print("FIRST ELSE")
            self.text = "FIRST ELSE"

    def pressed(self):
        sm.current = "second"


class SecondScreen(Screen):
    text = StringProperty("")

    def __init__(self, **kwargs):
        super(SecondScreen, self).__init__(**kwargs)
        self.update()

    def update(self):
        print("SECOND - UPDATE")
        if S_ID == 1:
            print("SECOND1")
            self.text = "SECOND1"
        elif S_ID == 2:
            print("SECOND2")
            self.text = "SECOND2"
        else:
            print("SECOND ELSE")
            self.text = "SECOND ELSE"

    def pressed(self):
        global S_ID
        S_ID += 1
        FirstScreen.update(FirstScreen())
        sm.current = "first"


sm = ScreenManager()
kv = Builder.load_file("test.kv")
sm.add_widget(FirstScreen(name='first'))
sm.add_widget(SecondScreen(name='second'))

sm.current = "first"


class MyApp(App):

    def build(self):
        return sm


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

這是.kv文件:

<FirstScreen>:
    name: "first"
    lbl: lbl:

    GridLayout:
        cols:2
        Label:
            id: lbl
            text: root.text

        Button:
            text: "next"
            on_press: root.pressed()

<SecondScreen>:
    name: "second"

    GridLayout:
        cols:2
        Label:
            text: root.text

        Button:
            text: "next"
            on_press:
                root.pressed()

問題是你的陳述:

FirstScreen.update(FirstScreen())

此語句正在創建FirstScreen的新實例並更新該實例。 不幸的是,該實例不是您的 GUI 中顯示的實例。 您可以通過將上述語句替換為:

    first_screen = self.manager.get_screen('first')
    first_screen.update()

此代碼從ScreenManager獲取FirstScreen的實例並在該實例上調用update()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM