Kivy开发麻将计分App:切换屏幕后数据丢失如何解决?
解决Kivy麻将计分App数据丢失问题
问题根源
你当前代码的核心问题有三个:
- 所有玩家输入框用了同一个
id: Name,导致无法单独获取每个玩家的输入值 - 仅用单个
StringProperty存储数据,只能保存最后一个输入的内容,无法存储多玩家信息 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
相关产品推荐
相关产品推荐

