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



我有一个叫做StatSummary的类,它有标签,在底部有一个叫做"重置"的按钮。当我按下这个按钮时,会弹出一个按钮,上面也写着"重置"。当我按下弹出窗口"重置"时;按钮,我想更新类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方法而改变。

在reset的on_release按钮方法中,你有:

Factory.StatSummary().resetStatSummary()

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

Factory.StatSummary().resetStatSummary()

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

最新更新