Kivy:在另一个 Class 中更新标签文本的函数调用不起作用

Kivy: Function Call to Update Label Text in Another Class Not Working

我有一个名为 StatSummary 的 class,它有标签,底部有一个名为“重置”的按钮。当我按下这个按钮时,会出现一个弹出窗口,上面还有一个按钮,上面还写着“重置”。当我按下弹出的“重置”按钮时,我想更新 class StatSummary 的标签文本。我在 StatSummary 中创建了一个名为 resetStatSummary 的方法,它使用 ID 更新标签的文本。

但是,当我从 ResetPopup 调用 Factory.StatSummary().resetStatSummary() 时,屏幕上的标签不会更新。这尤其令人困惑,因为我在我的 Python 文件中添加了一个 print 语句来查看该函数是否运行并且它确实运行了,但是标签的文本没有更新。

Python 文件:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.config import Config
from kivy.uix.popup import Popup

class StatSummary(Screen):
    def resetStatSummary(self):  # resets StatSummary text when "Reset" button is pressed
        self.ids.summaryShotFractionLabel.text = "0/0"
        self.ids.summaryShotPercentLabel.text = "0.0%"
        self.ids.summaryLongStreakLabel.text = "Longest Streak: 0"
        print("resetStatSummary ran")

class ResetPopup(Popup):
    pass

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file('basketball.kv')

class MainApp(App):
    def build(self):
        return kv

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

.kv 文件:

#:import Factory kivy.factory.Factory

WindowManager:        
    StatSummary

<StatSummary>
    name: "statSummary"        
    GridLayout:
        BoxLayout:
            orientation: "vertical"

            Label:
                id: summaryShotFractionLabel
                text: "0/0"
                
            Label:
                id: summaryShotPercentLabel
                text: "0.0%"
                
        BoxLayout:
            orientation: "vertical"
            Label:
                id: summaryLongStreakLabel
                text: "Longest Streak: 0"                    

    BoxLayout:
        orientation: "horizontal"            
        Button:
            text: "Reset"
            on_release:
                Factory.ResetPopup().open()

<ResetPopup>:
title: "Wait..."
BoxLayout:
    cols: 1
    orientation: "vertical"
    Label:
        text: "Are you sure you want to reset?"

    Button:
        text: "Go back"
        on_release:
            root.dismiss()

    Button:
        text: "Reset"
        on_release:
            root.dismiss()
            Factory.StatSummary().resetStatSummary()
            app.root.current = "interact"
            app.root.transition.direction = "right"

标签没有改变,因为你调用了错误对象的 resetStatSummary 方法。

在重置的 on_release 按钮方法中,您有:

Factory.StatSummary().resetStatSummary()

这意味着:创建新的 StatSummary 对象(StatSummary() 将创建和 return 新对象 - class StatSummary 实例),然后调用它方法resetStatSummary()。所以你在全新的对象上调用这个方法,而不是这个由 kv 文件创建的对象。要访问预期的 StatSummary class 实例,只需替换行:

Factory.StatSummary().resetStatSummary()

app.root.get_screen('statSummary').resetStatSummary()