【问题标题】:How to get field value from another screen?如何从另一个屏幕获取字段值?
【发布时间】:2023-04-05 12:12:01
【问题描述】:

我在 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'

【问题讨论】:

    标签: python kivymd pygithub


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 2022-12-07
      相关资源
      最近更新 更多