Python Kivy将数据从一个屏幕传递到另一个屏幕,并直接传递到另一个类

Python Kivy将数据从一个屏幕传递到另一个屏幕,并直接传递到另一个类,python,kivy,Python,Kivy,我是Kivy的新手,我正在试用我的第一个应用程序。我正在努力解决类之间的数据直接交换问题。我已经尝试了一些实施建议,这里已经提到了。不幸的是没有成功。 我想直接访问其他类中的“TextInput”,将文本分配给变量(值),并将其打印到命令行。 我显然错了,但是像这样的模式不应该工作吗:app.screenmanager.screen.textinput.text? 我最后一次尝试的是类似这样的东西:App.get\u running\u App().root.ids.sm.get\u scree

我是Kivy的新手,我正在试用我的第一个应用程序。我正在努力解决类之间的数据直接交换问题。我已经尝试了一些实施建议,这里已经提到了。不幸的是没有成功。 我想直接访问其他类中的“TextInput”,将文本分配给变量(值),并将其打印到命令行。 我显然错了,但是像这样的模式不应该工作吗:app.screenmanager.screen.textinput.text? 我最后一次尝试的是类似这样的东西:App.get\u running\u App().root.ids.sm.get\u screen('settingscreen').ids.id\u textinp 触发器中的错误是:'super'对象没有属性'getattr' 主屏幕中的错误为:“非类型”对象没有属性“根”

问题:

  • 类的数据是私有的吗
  • 是否可以在“主屏幕”类中打印“值”?因为我不确定现在是否已经创建了完整的“设置屏幕”,包括“文本输入”。而且它只执行一次。需要为打印(值)安排一个函数吗
  • 在这两种情况下(类主屏幕和类触发器),如何访问数据?类“触发器”的“比较”功能循环运行,因此至少在这里可以打印出“值”
  • 还有其他(最佳实践)方法吗
  • 提前感谢您的帮助

    我的测试代码简化为必要的:

    import kivy
    kivy.require('1.11.1')
    
    from kivy.app import App
    from kivy.uix.label import Label
    from kivy.core.window import Window
    from kivy.clock import Clock
    from kivy.uix.button import Button
    from kivy.uix.togglebutton import ToggleButton
    from kivy.uix.textinput import TextInput
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.image import Image
    from kivy.uix.slider import Slider
    from kivy.clock import Clock
    from kivy.graphics import Color, Rectangle
    from kivy.uix.behaviors import ButtonBehavior
    from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
    from kivy.properties import StringProperty
    from kivy.properties import ObjectProperty
    from kivy.lang import Builder
    from functools import partial
    
    import requests
    import time
    
    class Trigger:
        def compare(callbacktime,test2, test3):
            value="Trigger: nothing in here"
            #value = App.get_running_app().root.ids.sm.get_screen('settingscreen').ids.id_textinp
            print (value)
            pass
    
    class MainScreen(Screen):
        def __init__(self, **kwargs):
            super(MainScreen, self).__init__(**kwargs)        
    
            self.alert=Trigger
            paraDict={'test2':"222",'test3':"333"}
            value="MainScreen: nothing in here"
            #value = App.get_running_app().root.ids.sm.get_screen('settingscreen').ids.id_textinp
            print (value)
            Clock.schedule_interval(partial(self.alert.compare,**paraDict), 1)
    
            self.btn2 = Button(text='Settings', size_hint=(.15, .1), pos_hint={'center_x': .9, 'center_y': .95})
            self.add_widget(self.btn2)
            self.btn2.bind(on_press = self.screen_transition_alarm)
    
        def screen_transition_alarm(self, *args):
            self.manager.current = 'settingscreen'
    
    class SettingScreen(Screen):
        def __init__(self, **kwargs):
            super(SettingScreen, self).__init__(**kwargs)
            
            self.add_widget(Label(text='Hi Im The SettingScreen', size_hint=(.45, .1), pos_hint={'x': .05, 'y': .9}))
    
            self.btn = Button(text='back', size_hint=(.15, .1), pos_hint={'center_x': .9, 'center_y': .95})
            self.add_widget(self.btn)
            self.btn.bind(on_press = self.screen_transition_back)  
    
            self.hour = TextInput(id='id_textinp', text='1337', size_hint=(.3, .3), pos_hint={'center_x': .3, 'center_y': .7},input_filter="int",multiline=False, font_size=30, halign="center")
            self.add_widget(self.hour)
    
        def screen_transition_back(self, *args):
            self.manager.current = 'mainscreen'
    
    sm = ScreenManager(transition=FadeTransition())
    sm.add_widget(MainScreen(name='mainscreen',id='id_mainscreen'))
    sm.add_widget(SettingScreen(name='settingscreen', id='id_settingscreen'))
    
    class MainApp(App):
        title = 'mainprogram'
    
        def build(self):
            return sm #return Screenmanager
    
    if __name__ == '__main__':
        MainApp().run()
    

    在python代码中添加
    ids
    不会将它们放入任何
    ids
    字典中。这必须在
    kv
    中完成。尝试类似
    App.get\u running\u App()的操作。root.get\u screen('settingscreen')。hour
    感谢您的回答。我认为在kv中完成的所有工作都可以在python代码中完成。App.get\u running\u App()中完成.root.get_screen('settingscreen').hour在触发器类中工作!它返回TextInput的对象。在App.get_运行的情况下,\u App().root.get_screen('settingscreen').hour.text我终于得到了TextInput的文本。谢谢!