如何从另一个屏幕获取字段值?

问题描述

我在 TokenScreen 中有一个字段,在 ListScreen 中有一个 MDList。问题是,我找不到从 TokenScreen 字段中获取值并将其传递给 ListScreen 类的方法,以便用小部件填充容器。我尝试使用 init ,但这是不可能的。

它应该从 MDField 获取文本值并将其传递给 g = Github(TOKEN)

py 文件

class passVarClass():
    def __init__(self):
        self.tokenPassVar = ""


class MainApp(MDApp):
    screen = Screen()

    def build(self):
        self.theme_cls.primary_palette = 'Blue'
        screen = Builder.load_file('layout.kv')
        return screen

    def set_screen(self,screen):
        self.root.current = screen
        print("switching screen to tokenscreen")


class TokenScreen(Screen):
    def on_pre_leave(self,*args):
        objectPass = passVarClass()

        objectPass.tokenPassVar = self.ids.tokenFieldID.text
        print(objectPass.tokenPassVar + "test_tokenClass")

    # pass


class ListScreen(Screen):
    def on_pre_enter(self,*args):

        objectPass = passVarClass()

        g = Github(objectPass.tokenPassVar)
        user = g.get_user()
        repos = user.get_repos()
        for x in repos:
            if x.language is not None:
                self.ids.container.add_widget(
                    TwoLineListItem(text=x.name,secondary_text=x.language)
                )

        pass


class RepoScreen(Screen):
    pass


sm = ScreenManager()
sm.add_widget(TokenScreen(name='tokenscreen'))
sm.add_widget(ListScreen(name='listscreen'))
sm.add_widget(RepoScreen(name='reposcreen'))

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

kv 文件

ScreenManager:
    id:scr_mngr
    TokenScreen:
    ListScreen:
    RepoScreen:

<TokenScreen>:
    id:tokenscreenID
    name:'tokenscreen'
    MDToolbar:
        id:toolbarID
        title:"TokenScreen"
        md_bg_color: app.theme_cls.primary_color
        elevation : 10
        left_action_items : [["arrow-left",lambda x: x]]
        pos_hint:{"top":1}
    MDTextFieldRound:
        id:tokenFieldID
        name:"tokenFieldName"
        hint_text:"token"
        mode:"rectangle"
        pos_hint: {'center_x':0.5,'center_y':0.6}
        size_hint_x:None
        width:250
    MDRectangleFlatButton:
        text:"test"
        pos_hint:{'center_x':0.5,'center_y':0.5}
        on_press: root.manager.current = 'listscreen'
        on_press:print("Switching to listscreen")
<ListScreen>:
    id:listScreenID
    name:'listscreen'
    BoxLayout:
        orientation: 'vertical'
    MDToolbar:
        id:toolbarID
        title:"ListScreen"
        md_bg_color: app.theme_cls.primary_color
        elevation : 10
        left_action_items : [["arrow-left",lambda x: app.set_screen("tokenscreen")]]
        pos_hint:{"top":1}
    ScrollView:
        y: -toolbarID.height
        MDList:
            id:container
<RepoScreen>:
    id:repoScreenID
    name:'reposcreen'

解决方法

您必须定义一个属性。首先阅读此来源:

https://kivy.org/doc/stable/api-kivy.properties.html

这是一个简单的属性定义示例:

.kv

Manager:
    mgr: sc_mgr
    Main:
        id: sc_mgr
    About:

<MyPaintWidget>:
    on_touch_down: self.on_touch_down
    on_touch_move: self.on_touch_move

<Main>:
    name: "main"
    draw: main_draw
    BoxLayout:
        orientation: "vertical"

        MyPaintWidget:
            id: main_draw
            size_hint: 1,0.9

        GridLayout:
            size_hint: 1,0.1
            cols: 3
            padding: 10

            Button:
                text: "About"
                on_press:
                    root.manager.current= "about"
                    root.manager.transition.direction= "left"
            Label:
            
            Button:
                text: "Clear"
                on_release: app.root.cleaner()

<About>:
    name: "about"
    BoxLayout:
        orientation: "vertical"
        padding: 10

        Label:
            size_hint: 1,0.9
            text: "This is a test app."

        Button:
            size_hint: 1,0.9
            text:"Back to Main"
            on_press:
                root.manager.current= "main"
                root.manager.transition.direction= "right"

.py

from random import random
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Ellipse,Color,Line
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.lang import Builder
from kivy.properties import ObjectProperty

class Main(Screen):
    draw = ObjectProperty(None)

class About(Screen):
    pass

class Manager(ScreenManager):
    mgr = ObjectProperty(None)

    def cleaner(self):
        self.mgr.draw.clean()


class MyPaintWidget(Widget):

    def clean(self):
        self.canvas.clear()
    
    def on_touch_down(self,touch):
        # self.rect.pos = touch.pos
        color = (random(),random(),random())
        with self.canvas:
            Color(*color)
            Ellipse(pos=(touch.x,touch.y),size=(20,20))
            touch.ud['line'] = Line(points=(touch.x,touch.y))

    def on_touch_move(self,touch):
        # self.rect.pos = touch.pos
        touch.ud['line'].points += [touch.x,touch.y]
        

main_style = Builder.load_file("ms_paint.kv")

class MyPaintApp(App):
    def build(self):
        return main_style


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