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()
我有一个名为 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()