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

Kivy Python应用多语言切换失效问题求助

问题分析

你当前实现的核心问题在于:

  1. Main类中的title等StringProperty仅在类初始化时赋值一次,后续切换语言不会触发重新加载
  2. app.lang和Main类的语言状态完全脱节,语言切换时没有通知Main更新文本
修复方案

以下是重构后的代码,通过集中管理语言状态 + 利用Kivy属性通知机制,实现语言切换后的界面自动刷新:

Python代码修改

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.widget import Widget
from kivy.uix.textinput import TextInput
from kivy.uix.scrollview import ScrollView
from kivy.properties import StringProperty
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
from kivy.core.text import LabelBase
from kivy.uix.floatlayout import FloatLayout
import pandas as pd
from kivy.lang import Builder


LabelBase.register(name='Frutiger', fn_regular="fonts/Frutiger.ttf")
Window.clearcolor = 0, 0.31, 0.624, 1


class WindowManager(ScreenManager):
    pass

class Language_Select(Screen):
    pass
    
class Main(Screen):
    title = StringProperty()
    title2 = StringProperty()
    title3 = StringProperty()
    title4 = StringProperty()

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 绑定App的语言变化事件,自动更新文本
        app = App.get_running_app()
        app.bind(lang=lambda _, __: self.update_texts())
        # 初始化时加载默认语言文本
        self.update_texts()

    def update_texts(self):
        app = App.get_running_app()
        self.title = app.csv_lang.loc[0, app.lang]
        self.title2 = app.csv_lang.loc[1, app.lang]
        self.title3 = app.csv_lang.loc[2, app.lang]
        self.title4 = app.csv_lang.loc[3, app.lang]

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

class MyApp(App):
    lang = StringProperty("EN")  # 全局语言属性,变化时自动触发通知

    def build(self):
        # 将语言数据加载到App实例,全局可访问
        self.csv_lang = pd.read_csv('language/lang.csv', delimiter=";")
        self.csv_catalog = pd.read_csv('csv/catalog.csv', delimiter=";")
        return kv

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

KV文件修改(仅需微调)

#:kivy 2.2
<Button>:
    background_color: (0,0.8,1,0.8)
    font_name: 'Frutiger'
    font_size: 30
<Label>:
    font_name: 'Frutiger'
WindowManager:
    Language_Select:
    Main:
<Language_Select>:
    GridLayout:
        cols: 3
        rows: 1
        padding: 50
        spacing: 50

        Button:
            text: "EN"
            on_release: 
                app.lang = 'EN'
                app.root.current = "main"
                root.manager.transition.direction = "down"
        Button:
            text: "DE"
            on_release: 
                app.lang = 'DE'
                app.root.current = "main"
                root.manager.transition.direction = "down"
        Button:
            text: "FR"
            on_release: 
                app.lang = 'FR'
                app.root.current = "main"
                root.manager.transition.direction = "down"
<Main>:
    name: "main"
    GridLayout:
        cols: 1
        Label:
            text: root.title
        GridLayout:
            rows: 3
            cols: 1

            Button:
                text: root.title2
              
            Button:
                text: root.title3
                
            Button:
                text: root.title4
关键优化点
  1. 集中管理语言状态:将lang设为App的StringProperty,语言变化时Kivy会自动发出通知
  2. 动态文本更新:Main类通过绑定App的lang属性变化事件,自动调用update_texts刷新所有文本
  3. 避免硬编码初始化:移除类定义阶段的静态赋值,改为运行时根据当前语言动态加载文本
  4. 全局数据访问:将语言CSV加载到App实例中,避免全局变量,所有界面可直接调用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:23:17