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

Kivy中激励视频广告积分奖励正常但积分扣除失效问题求助

积分兑换未扣除的问题排查与修复

嘿,折腾几周解决这个问题确实够闹心的!我帮你梳理下代码里的关键问题,分两种最可能的情况给你解决方案:

情况1:界面标签没同步更新(最常见)

看你Kivy代码里的MDLabel:

text:" Points : "+str(app.Num)

这种写法只会在PlayScreen初始化时计算一次文本,当app.Num变化时,标签不会自动刷新。你会看到广告奖励的积分更新,大概率是因为看完广告后重新进入了PlayScreen,标签重新初始化显示了新值,但兑换时只是修改了Num,界面没同步。

修复方法:用Kivy的动态绑定表达式,让文本自动跟随Num变化:

<PlayScreen>:
    name: 'PlayScreen'
    MDLabel:
        text: "Points : {}".format(app.Num)
        pos_hint:{"top":1.35}

情况2:实例属性访问不一致(面向对象问题)

虽然理论上MDApp.get_running_app()应该返回你的SlipsApp实例,但如果App初始化逻辑有隐藏问题,可能导致你在Purchase_For_points里修改的app.Num和奖励时修改的self.game.Num不是同一个属性。

解决思路是把积分数据抽成单例类,让所有模块都访问同一个数据源:

  1. 新建一个数据存储类:
from kivy.properties import NumericProperty
from kivy.event import EventDispatcher

class DataStore(EventDispatcher):
    # 全局共享的积分属性
    Num = NumericProperty(5)

# 创建单例实例,所有地方都用这个
data_store = DataStore()
  1. 修改Rewards_Handler里的奖励逻辑:
def on_rewarded(self, reward_name, reward_amount):
    data_store.Num += 1 # 用单例的积分属性
    print("User Given 1 reward")
  1. 修改PlayScreen的兑换逻辑:
def Purchase_For_points(self):
    data_store.Num -= 1 # 直接操作单例的积分属性
  1. 更新Kivy代码里的标签绑定:
<PlayScreen>:
    name: 'PlayScreen'
    MDLabel:
        text: "Points : {}".format(data_store.Num)
        pos_hint:{"top":1.35}

额外排查步骤

如果还是没解决,先加个打印确认逻辑是否执行:

def Purchase_For_points(self):
    app = MDApp.get_running_app()
    print(f"当前积分:{app.Num},准备扣除1分")
    app.Num -= 1
    print(f"扣除后积分:{app.Num}")
  • 如果打印里积分确实减少了,那就是界面没更新的问题,按情况1修复;
  • 如果积分没变化,检查按钮是否正确绑定了Purchase_For_points方法,比如Kivy里的按钮有没有写on_press: root.Purchase_For_points()。

内容的提问来源于stack exchange,提问作者Abhay Jaiswal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:08:15