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不是同一个属性。
解决思路是把积分数据抽成单例类,让所有模块都访问同一个数据源:
- 新建一个数据存储类:
from kivy.properties import NumericProperty from kivy.event import EventDispatcher class DataStore(EventDispatcher): # 全局共享的积分属性 Num = NumericProperty(5) # 创建单例实例,所有地方都用这个 data_store = DataStore()
- 修改
Rewards_Handler里的奖励逻辑:
def on_rewarded(self, reward_name, reward_amount): data_store.Num += 1 # 用单例的积分属性 print("User Given 1 reward")
- 修改
PlayScreen的兑换逻辑:
def Purchase_For_points(self): data_store.Num -= 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
相关产品推荐
相关产品推荐

