You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kivy的Output类中获取Cost与Tip类的用户输入值?

在Kivy的Output Screen中获取其他Screen输入值的解决方案

问题背景

使用Kivy开发Python应用时,需要在Output(Screen)类中获取用户在Cost(Screen)和Tip(Screen)界面输入的值。目前已能在Cost和Tip类中读取输入并打印到控制台,但尚未实现跨Screen调用这些值的逻辑。


解决方案

方法一:通过ScreenManager直接访问目标Screen实例

所有Screen都隶属于ScreenManager,可以通过self.manager.get_screen("屏幕名称")获取对应Screen的实例,进而访问其输入控件或存储的数据。

修改后的Python代码

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

class Cost(Screen):
    cost = ObjectProperty(None)

    def btn(self):
        cost = self.ids.cost.text
        print(cost)

class Tip(Screen):
    tip = ObjectProperty(None)

    def btn(self):
        tip = self.ids.tip.text
        print(tip)

class Output(Screen):
    def on_enter(self, *args):
        # 获取Cost屏幕实例及输入值
        cost_screen = self.manager.get_screen("Cost")
        bill_cost = cost_screen.ids.cost.text
        
        # 获取Tip屏幕实例及输入值
        tip_screen = self.manager.get_screen("Tip")
        tip_percent = tip_screen.ids.tip.text
        
        # 处理数据并更新显示
        if bill_cost and tip_percent:
            total = float(bill_cost) * (1 + float(tip_percent)/100)
            self.ids.output_label.text = f"总金额:${total:.2f}"
        else:
            self.ids.output_label.text = "请输入完整数据"

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file("att.kv")

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

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

修改后的kv文件(Output部分)

给Output界面添加用于显示结果的Label并设置id:

<Output>
    name: "Output"

    Label:
        id: output_label
        size_hint:{0.3, 0.2}
        pos_hint: {"x":0.20, "y":0.5}
        color:1.0,1.0,1.0,1
        text: "Output"

    # 原有按钮代码保持不变
    Button:
        size_hint:{0.2, 0.1}
        pos_hint: {"x":0.5, "y":0.2}
        text: "[b]Close[/b]"
        on_press: app.stop()

    Button:
        size_hint:{0.2, 0.1}
        pos_hint: {"x":0.27, "y":0.2}
        text: "[b]Start Over[/b]"
        on_press:
            app.root.current = "Cost"
            root.manager.transition.direction = "right"

方法二:在App类中存储全局数据(推荐)

将输入数据存储在App类的属性中,所有Screen可直接通过App实例访问,适合多Screen共享数据的场景。

修改后的Python代码

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

class Cost(Screen):
    cost = ObjectProperty(None)

    def btn(self):
        app = App.get_running_app()
        app.bill_cost = self.ids.cost.text
        print(app.bill_cost)

class Tip(Screen):
    tip = ObjectProperty(None)

    def btn(self):
        app = App.get_running_app()
        app.tip_percent = self.ids.tip.text
        print(app.tip_percent)

class Output(Screen):
    def on_enter(self, *args):
        app = App.get_running_app()
        # 安全获取属性,避免未输入跳转导致的错误
        bill_cost = getattr(app, 'bill_cost', '')
        tip_percent = getattr(app, 'tip_percent', '')
        
        if bill_cost and tip_percent:
            total = float(bill_cost) * (1 + float(tip_percent)/100)
            self.ids.output_label.text = f"总金额:${total:.2f}"
        else:
            self.ids.output_label.text = "请输入完整数据"

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file("att.kv")

class ATT(App):
    # 初始化全局存储属性
    bill_cost = ""
    tip_percent = ""
    
    def build(self):
        return kv

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

kv文件修改同方法一

同样需要给Output界面的Label添加id: output_label。


注意事项

  • 需将TextInput的字符串值转换为数值类型(如float)后再进行计算,避免类型错误。
  • 使用getattr可防止用户未输入就跳转导致的属性不存在异常。

内容的提问来源于stack exchange,提问作者Brian Tomasetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:03:11