Как ссылаться на виджеты разных экранов, созданных в kivy, используя язык kv? - PullRequest
1 голос
/ 04 ноября 2019

Мое приложение состоит из 2 экранов:

Экран 1 - 1 виджет ввода текста и 1 виджет кнопки

Экран 2 - 1 виджет ввода текста

При нажатии кнопки я хочу, чтобызахватить данные, введенные в текстовом вводе Screen1, и распечатать их в текстовом вводе Screen2.

Я пробовал следующий код, но получаю ошибку:

main.py

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

class Screen1(Screen):
    pass

class Screen2(Screen):
    pass  

class WindowManager(ScreenManager):
    txtinp1 = ObjectProperty(None)
    txtinp2 = ObjectProperty(None)

class ResultsApp(App):

    def build(self):
        return Builder.load_file("tutorials\Design3.kv")

    def disp(self):
        self.root.txtinp2.text = self.root.txtinp1.text        

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

design3.kv

WindowManager:
    Screen1:        
    Screen2:     

<Screen1>    
    name:'main'
    txtinp1:textinp1 
    GridLayout:
        cols:1                
        TextInput:
            id:textinp1
        Button:
            text:'Submit'
            on_press: 
                app.root.current = 'second'
                app.disp()
<Screen2>
    name:'second'
    txtinp2:textinp2 
    GridLayout:        
        cols:1        
        TextInput:
            id:textinp2

Ошибка, которую я получаю, приведена ниже.

File "c:/Users/pavan m sunder/projects/kivy/tutorials/tut7(kvlang).py", line 25, in disp
     self.root.txtinp2.text = self.root.txtinp1.text

AttributeError: 'NoneType' object has no attribute 'text'

Я пытался искать решения в stackoverflow, ноне смог найти.

1 Ответ

1 голос
/ 04 ноября 2019

Делая txtinp1: textinp1, вы указываете, что Screen1 отображает объект textinp1 через свойство txtinp1, но затем вы хотите получить доступ к этому свойству через корень, который является ScreenManager, что явно неверно.

Естьмного решений, но в этом случае я покажу, как отобразить свойства каждого экрана в ScreenManager:

WindowManager:
    <b>txtinp1: screen1.textinp1
    txtinp2: screen2.textinp2
    Screen1: 
        id: screen1       
    Screen2:
        id: screen2</b>


 &ltScreen1>    
    textinp1: textinp1
    name:'main'
    GridLayout:
        cols:1        
        TextInput:
            id:textinp1
        Button:
            text:'Submit'
            on_press: 
                app.root.current = 'second'
                app.disp()

 &ltScreen2>
    textinp2: textinp2
    name:'second'
    GridLayout:        
        cols:1        
        TextInput:
            id:textinp2
...