2016-07-07 30 views
0

2つの言語(ドイツ語と英語)と設定のAppを作成したいので、言語を切り替えることができます。 言語クラスはAppの一部であるため、app.Lanuageを使用してそれを評価する必要がありますが、上記のエラーメッセージが表示されます。kivyエラーNameError:グローバル名 'app'が定義されていません

from kivy.app import App 
from kivy.lang import Builder 

from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.settings import SettingsWithSidebar 

from setjson import * 

Builder.load_string(''' 
<Interface>: 
    orientation: 'vertical' 
    Button: 
     text: app.Lanuage.first_caption 
     font_size: 150 
     on_release: app.open_settings() 
''') 

class Interface(BoxLayout): 
    def __init__(self, **kwargs): 
     super(Interface, self).__init__(**kwargs) 
     self.test = app.Lanuage.all_button 

class SettingsApp(App): 
    def build(self): 
     config = SettingsApp.get_running_app().config 
     language = config.getdefault("example", "optionsexample", "English").lower() 

     if language == 'english': 
      from lang_engl import Lang 
     if language == 'deutsch': 
      from lang_deutsch import Lang 
     self.Lanuage = Lang() 

     self.settings_cls = SettingsWithSidebar 
     self.use_kivy_settings = False 
     setting = self.config.get('example', 'boolexample') 
     return Interface() 

    def build_config(self, config): 
     config.setdefaults('example', { 
      'optionsexample': 'English', 
      'stringexample': 'some_string', 
      'pathexample': '/some/path'}) 

    def build_settings(self, settings): 
     settings.add_json_panel('Panel Name', 
       self.config, 
       data=settings_json) 

    def on_config_change(self, config, section, key, value): 
     print 'value: ' + str(value) 


SettingsApp().run() 
+0

あなたはスコープ内に 'App'しか持っていないので、' App.Language'を意味するか、 'kivy.app'モジュールを意味します。' kivy.app.Language'か 'from kivy import app ; app.Language'となります。実際に私はkivyパッケージにはいません。 kivyにLanguageクラス/モジュールがありますか? – syntonym

+0

いいえ、私は自分で言語クラスを作成し、そのインスタンスをアプリケーションに追加しました。また、キビ言語では問題なく動作しましたが、Pythonでは正しく動作しませんでした。 –

+1

ああ、現在のアプリケーションへの参照が必要です。 'App.get_running_app()' [documentation](https://kivy.org/docs/api-kivy.app.html#kivy.app.App.get_running_app)で取得できます。 – syntonym

答えて

1

例:あなたはAppクラス内で使用self.<object>

  • pythonでアプリを使用する場合(kv
  • 使用App.get_running_app()でアプリを取得する

    from kivy.app import App 
    from kivy.lang import Builder 
    from kivy.uix.button import Button 
    from kivy.uix.boxlayout import BoxLayout 
    
    Builder.load_string(''' 
    <MyBtn>: 
        text: str(self)+self.a.test 
    <Test>: 
        Button: 
         text: str(self)+app.test 
        MyBtn: 
    ''') 
    
    
    class Test(BoxLayout): 
        pass 
    
    
    class MyBtn(Button): 
        def __init__(self, **kw): 
         super(MyBtn, self).__init__(**kw) 
         self.a = App.get_running_app() 
    
    
    class My(App): 
        test = '\nHi!' 
    
        def build(self): 
         return Test() 
    My().run() 
    
    • 使用appキーワード内側build(self)

    その他の点では、実際にコード内のAppにアクセスした場合に発生する可能性のあるその他の問題はありません。

  • +0

    なぜApp.get_running_app()が返されないのですか? –

    +0

    @GilgameschvonUruk 'App'クラスの意味ですか? – KeyWeeUsr

    +0

    いいえ、別のクラス –

    関連する問題