2016-07-07 16 views
0

Ich wollte eine App mit zwei Sprachen (Deutsch und Englisch) und Einstellungen erstellen, damit ich zwischen den Sprachen wechseln kann. Da die Sprachklasse Teil der App ist, muss ich sie mit app.Lanuage verwenden, aber ich habe die obige Fehlermeldung erhalten.kivy error NameError: globaler Name 'app' ist nicht definiert

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

Sie haben nur 'App' im Bereich, also entweder Sie' App.Language' oder Sie meinen das 'kivy.app' Modul dann wäre es entweder' kivy.app.Sprache' oder 'von kivy Import App ; App.Sprache'. Eigentlich habe ich weder in meinem Kivy-Paket. Sind Sie sicher, dass kivy eine Sprachschule/ein Sprachmodul hat? – syntonym

+0

Nein, ich habe die Sprachklasse selbst erstellt und der App eine Instanz hinzugefügt. Und es funktionierte auch perfekt in kivy Sprache, aber nicht in Python –

+1

Ah, Sie möchten einen Verweis auf die aktuelle App. Sie können das über 'App.get_running_app()' [Dokumentation] (https://kivy.org/docs/api-kivy.app.html#kivy.app.App.get_running_app) erreichen. – syntonym

Antwort

1

Beispiel:

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() 
  • Verwendung app Stichwort erhalten App in kv
  • Verwendung App.get_running_app() wenn Sie app in Python
  • Gebrauch verwenden möchten self.<object> innerhalb App Klasse (innerhalb build(self))

Ansonsten sehe ich keine anderen Probleme, die auftreten könnten, wenn Sie tatsächlich auf die App in Ihrem Code zugreifen.

+0

Warum gibt App.get_running_app() keine zurück? –

+0

@GilgameschvonUruk Meinst du in 'App' Klasse? – KeyWeeUsr

+0

Nein, in einer anderen Klasse –

Verwandte Themen