2017-05-02 18 views
0

私は最初の画面のテキスト入力から受け取る入力が2番目の画面の結果に影響するという単純な作業を行う必要があります。グローバル変数などのすべてのことを試しました。変数を格納して使用し、クラスを互いに入れても何も動作しないようです。何が最初の画面から入力を取り、私は2番目の画面で、後で使用できる変数にそれを格納するための最も簡単な方法..ですので、関係なく、私は何をすべきかテキスト入力データを格納する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() 

下記のコードの一部はありません2番目の画面では、gender.textが変更されていると確信している間、最初のラベルには常に「理由」と表示されます。 何が間違っていますか?

答えて

0

最も簡単な方法は、Kivyの方法です:
- あなたが使用できることを意味しfrom kivy.app import app

に忘れてはいけない - そして、あなたはapp.get_running_app().your_class_variable_name
で値を取得することができます - あなたのMyApp
でクラス変数を宣言2つのモジュール間の通信を管理する中間変数を作成するkivyの方法。単一のモジュールを使用してすべての共有変数を保持するPythonの方法も使用できます。次に、あなたが望むモジュールをimportにして、その値にアクセスできます。あなたが新しいファイルを必要としないので、これは多くの点で迅速です。

ここでは2つの画面を保持するメインファイルがありますが、2つの画面が同じファイルにあるか2つの異なるファイルにあるかは関係ありません。ここではそれらをすべて素早くハックするためにmain.pyに入れています。必要に応じてそれらを分けることができます。あなたはどのように見ることができます次の画面に移動します

:1

  • 移動によってMY_NUMBERを追加します。MY_NUMBER
  • 変更の読み値:

    すべての画面には、3つのボタン

    • 読み取りを持っています2つの画面で同じ共有変数にアクセスして変更することができます

      そして私はここに2つの方法を示してshaにアクセスします赤の変数:
      - .kvファイルにアクセスする方法。
      - アクセス方法.pyファイルです。

      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() 
      
  • 関連する問題