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

Kivy开发麻将计分App:切换屏幕后数据丢失如何解决?

解决Kivy麻将计分App数据丢失问题

问题根源

你当前代码的核心问题有三个:

  1. 所有玩家输入框用了同一个id: Name,导致无法单独获取每个玩家的输入值
  2. 仅用单个StringProperty存储数据,只能保存最后一个输入的内容,无法存储多玩家信息
  3. Player_Screen的save_data()方法未实现,没有实际执行数据保存逻辑

修正方案

1. 修改Python代码

更新ScreenManagement和Player_Screen类,用字典属性存储多玩家数据,并实现数据保存方法:

Window.size = (360, 600)
from kivy.properties import DictProperty

class MainScreen(Screen):
    pass

class Player_Screen(Screen):
    def save_data(self):
        # 获取四个输入框内容,保存到ScreenManager的共享字典
        self.manager.shared_data = {
            "player1": self.ids.player1.text,
            "player2": self.ids.player2.text,
            "player3": self.ids.player3.text,
            "player4": self.ids.player4.text
        }

class ScreenManagement(ScreenManager):
    # 用DictProperty存储多玩家数据,支持后续扩展分数字段
    shared_data = DictProperty({})

Mahjong = Builder.load_file('trial_app.kv')

class MainApp(App):
    def build(self):
        return Mahjong

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

2. 修改KV文件

给每个输入框设置唯一ID,移除重复的id: Name,并修正屏幕跳转逻辑:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import App kivy.app.App

ScreenManagement:
    transition: FadeTransition()
    MainScreen:
        id: title
    Player_Screen:
        id: Players
        name: 'Players'

<MainScreen>:
    name: "main"
    canvas.before:
        Color:
            rgba: 0.2, 0.5, 1, 0.5
        Rectangle:
            pos: self.pos
            size: self.size
    GridLayout:
        cols : 1
        Button:
            text: "Mahjong"
            background_normal:'Mahjong.JPG'
        Button:
            text: "Let's Play"
            on_release: app.root.current = "Players"

<Player_Screen>:
    BoxLayout:
        orientation: 'vertical'
        TextInput:
            id: player1
            hint_text:'Enter Player1'
        TextInput:
            id: player2
            hint_text:'Enter Player2'
        TextInput:
            id: player3
            hint_text:'Enter Player3'
        TextInput:
            id: player4
            hint_text:'Enter Player4'
        Button:
            text: 'Back'
            on_press: self.background_color =  0,0,0,1
            on_release: root.manager.current = 'main'
        Button:
            text: 'Next'
            on_press: root.save_data()
            on_release: root.manager.current = 'Score'

分数保存扩展

如果要保存玩家分数,只需在shared_data字典中添加分数字段即可。比如在分数输入屏幕中实现保存逻辑:

# 假设你定义了Score_Screen类
class Score_Screen(Screen):
    def save_scores(self):
        self.manager.shared_data.update({
            "player1_score": self.ids.player1_score.text,
            "player2_score": self.ids.player2_score.text,
            "player3_score": self.ids.player3_score.text,
            "player4_score": self.ids.player4_score.text
        })

通过ScreenManager的shared_data字典,所有屏幕都可以共享和读写数据,切换屏幕时数据不会丢失。

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

相关产品推荐
方舟 Agent Plan

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

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