2017-05-02 3 views
0

Ich muss die einfachste Aufgabe, die die Eingabe ich empfange von der ersten Bildschirm Texteingabe Auswirkungen auf die Ergebnisse auf dem zweiten Bildschirm, ich habe versucht alles, was ich weiß, wie globale Variablen. in Variablen zu speichern, dann die Klassen zu benutzen und sogar ineinander zu setzen scheint nichts zu funktionieren. was der einfachste Weg ist, um die Eingabe von dem ersten Bildschirm und speichern sie in Variablen zu nehmen, die ich später auf dem zweiten Bildschirm verwenden kann .. gibt es ein Stück des Codes unterSpeichern von Text Eingabedaten kivy python

def screenswitch(self): 
    sm.current= 'settings' 



class LoginScreen(GridLayout): 
    def __init__(self, **kwargs): 
      super(LoginScreen, self).__init__(**kwargs) 
      self.cols = 2 
      self.spacing = [5,140] 
      self.test=Label(text='nothing') 
      self.add_widget(self.test) 
      self.add_widget(Label(text='Gender',color=(1, 0, 0, 1), font_size= 42)) 
      self.gender = TextInput(text='why',multiline=False,font_size=32,write_tab=False) 
      self.add_widget(self.gender) 
      self.gender.bind(text=self.test.setter('text')) 
      self.btn1=(Button(text='Submit')) 
      self.add_widget(self.btn1) 
      self.btn1.bind(on_press=screenswitch) 




class MenuScreen(Screen): 
    def __init__(self,**kwargs): 
      super(MenuScreen, self).__init__(**kwargs) 
      self.loginscreen = LoginScreen() 
      self.add_widget(self.loginscreen) 


class TestScreen(BoxLayout): 

    def __init__(self, **kwargs): 
     super(TestScreen, self).__init__(**kwargs) 
     self.loginscreen = LoginScreen() 
     print self.loginscreen.gender.text 
     self.orientation = 'vertical' 
     self.add_widget(Label(text=self.loginscreen.gender.text)) 
     self.add_widget(Label(text='password')) 



class SettingsScreen(Screen): 
    def __init__(self,**kwargs): 
     super(SettingsScreen,self).__init__(**kwargs) 
     self.testscreen = TestScreen() 
     self.add_widget(self.testscreen) 

sm = ScreenManager() 
sm.add_widget(MenuScreen(name='menu')) 
sm.add_widget(SettingsScreen(name='settings')) 

class MyApp(App): 

    def build(self): 
     return sm 


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

also egal, was ich tue, auf dem zweiten Bildschirm zeigt das erste Etikett immer "warum" an, während ich sicher bin, dass sich der gender.text ändert und ich ihn ändere was mache ich falsch?

Antwort

0

Der einfachste Weg ist Kivy Weg:
- zu Ihren MyApp
eine Klassenvariable deklarieren - Dann können Sie den Wert von app.get_running_app().your_class_variable_name
bekommen - Vergessen Sie nicht, from kivy.app import app

Das heißt, Sie können Der kivy Weg, eine mittlere Variable zu erstellen, um die Kommunikation zwischen zwei Modulen zu verwalten. Sie können auch Python-Methoden verwenden, die ein einzelnes Modul für alle gemeinsam genutzten Variablen verwenden. Dann können Sie einfach import das Modul, das Sie wollen, und auf ihre Werte zugreifen. So viele Möglichkeiten, diese ist schnell, da Sie keine neue Datei benötigen.

Hier ist die Hauptdatei, um die 2 Bildschirme zu halten, es ist egal, ob die 2 Bildschirme in der gleichen Datei oder in 2 verschiedenen Dateien sind, hier stelle ich sie alle in main.py nur für einen schnellen Hack. Sie können sie trennen, wenn Sie brauchen.

Jeder Bildschirm verfügt über 3 Tasten

  • Lesen: Lesewert von my_number
  • ändern: add my_number von 1
  • Go: Zum nächsten Bildschirm

Sie sehen können, wie die zwei Bildschirme können auf die gleiche gemeinsame Variable zugreifen und ändern

Und ich zeige 2 Wege hier auf den sha zuzugreifen rote Variable:
- wie Sie darauf zugreifen in .kv Datei.
- wie Sie darauf zugreifen in .py Datei.

from kivy.app import App 
from kivy.lang.builder import Builder 
from kivy.uix.screenmanager import Screen, ScreenManager 

Builder.load_string(""" 
<LoginScreen>: 
    BoxLayout: 
     orientation:'vertical' 
     Label: 
      text: 'I am LoginScreen' 
     Label: 
      id: lbl1 
     Button: 
      text: 'Read' 
      on_press: root.press_read() 
     Button: 
      text: 'Change' 
      on_press: 
       app.MY_NUMBER = app.MY_NUMBER + 1 
       root.ids.lbl1.text = 'SharedVar is ' + str(app.MY_NUMBER) 
     Button: 
      text: 'Go to ScreenTwo' 
      on_press: app.sm.current = "screen_2" 
<MenuScreen>: 
    BoxLayout: 
     orientation:'vertical' 
     Label: 
      text: 'I am MenuScreen' 
     Label: 
      id: lbl2 
     Button: 
      text: 'Read' 
      on_press: root.press_read() 
     Button: 
      text: 'Change' 
      on_press: 
       app.MY_NUMBER = app.MY_NUMBER + 1 
       root.ids.lbl2.text = 'SharedVar is ' + str(app.MY_NUMBER) 
     Button: 
      text: 'Go to ScreenOne' 
      on_press: app.sm.current = "screen_1" 
""") 

class LoginScreen(Screen): 
    def press_read(self): 
     app = App.get_running_app() 
     self.ids.lbl1.text = "SharedVar is " + str(app.MY_NUMBER) 

class MenuScreen(Screen): 
    def press_read(self): 
     app = App.get_running_app() 
     self.ids.lbl2.text = "SharedVar is now " + str(app.MY_NUMBER) 

class HandSetApp(App): 
    MY_NUMBER = 0 
    sm = ScreenManager() 

    def build(self): 
     HandSetApp.sm.add_widget(ScreenOne(name='screen_1')) 
     HandSetApp.sm.add_widget(ScreenTwo(name='screen_2')) 
     return HandSetApp.sm 

if __name__ == '__main__': 
    HandSetApp().run()