首页 > 解决方案 > Kivy 将数据从一个屏幕传递到另一个屏幕并直接传递到另一个类

问题描述

我是 Kivy 的新手,正在尝试我的第一个应用程序。我正在为类之间的直接数据交换而苦苦挣扎。我已经尝试了一些实施建议,这里提到了这些建议。不幸的是没有成功。我想直接访问其他类中的“TextInput”,将文本分配给一个变量(值)并将其打印到命令行。我显然错了,但不应该像这样的架构工作:app.screenmanager.screen.textinput.text?我尝试的最后一件事是这样绝望的: App.get_running_app().root.ids.sm.get_screen('settingscreen').ids.id_textinp 触发器中的错误是:'super' object has no attribute ' getattr ' Error in MainScreen 是:'NoneType' 对象没有属性 'root'

问题:

  1. 类的数据是私有的吗?
  2. 是否可以在“MainScreen”类中打印出“值”?因为我不确定此时是否已经创建了包括“TextInput”在内的完整“SettingScreen”。而且它只执行一次。需要为打印(值)安排一个功能吗?
  3. 在这两种情况下(MainScreen 类和 Trigger 类)如何访问数据?“触发器”类的“比较”功能循环运行,所以至少在这里应该可以打印出“值”
  4. 还有其他(最佳实践)方法吗?

提前感谢您的帮助!

我的测试代码减少到必要的:

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()

标签: pythonkivy

解决方案


推荐阅读