【问题标题】:Get variable from one Screen Class into another (KivyMD issue)从一个屏幕类获取变量到另一个屏幕类(KivyMD 问题)
【发布时间】:2023-02-04 04:14:38
【问题描述】:

我正在构建一个 KivyMD 应用程序,但是我在将一个 Screen 类中定义的变量转换为另一个 Screen 类时遇到了一些问题。请参阅下面的脚本:

from kivymd.app import MDApp, Builder
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty
from api import gen_5_images

# --- this changes the app's default background --- #
Window.clearcolor = (.9, .9, .9, 1)
Window.size = (400, 500)

class HomeScreen(Screen):
    source = StringProperty()
    def __init__(self, **kwargs): 
        super(HomeScreen, self).__init__(**kwargs)
        self.text = 'dog'

    def get_text(self):
        self.text = self.ids.input.text
        return self.text

class ResultsScreen(HomeScreen):
    source = StringProperty()
    def on_manager(self, *args):
        # gets run when manager property is changed
        self.urls = gen_5_images(self.manager.get_screen('home').text)
        self.source = self.urls[0]
        
class Main(MDApp):
    def build(self):
        Builder.load_file("layout.kv")
        sm = ScreenManager()
        sm.add_widget(HomeScreen(name='home'))
        sm.add_widget(ResultsScreen(name='results'))
        return sm

Main().run()

当我从 HomeScreen 切换到 ResultsScreen 时,我得到变量“dog”(在 HomeScreen 的在里面) 作为文本,我想要“get_text”函数的输出。

请参阅下面我的 .kv 文件:

#:import hex kivy.utils.get_color_from_hex
<HomeScreen>:
    name: 'home'
    MDFloatLayout:
        md_bg_color: hex('#003153') # background color
        MDLabel:
            text: "DreamGen"
            color: hex('#f5deb3')
            halign: "center"
            pos_hint: {"center_x": .5, "center_y": .9}
            font_size: "40sp"
            font_name: "Pacifico"
        MDTextField:
            id: input
            hint_text: "I had a dream..."
            hint_text_color_normal: hex("#00aae4")
            hint_text_color_focus: hex("#00aae4")
            helper_text_color_focus: hex("#00aae4")
            line_color_normal: hex('#003153') #make line color of background
            line_color_focus: hex('#003153') #make line color of background
            helper_text: "Write what comes to your mind"
            helper_text_mode: "on_focus"
            text_color_focus: hex('#add8e6') # color of text clicked
            text_color_normal: hex('#add8e6') # color of text without clicked
            mode: "rectangle"
            multiline: True
            size_hint_x: 0.7
            size_hint_y: 0.5
            pos_hint: {"center_x": .5, "center_y": .5}
        MDFillRoundFlatButton:
            text: "Generate"
            text_color: hex('#003153')
            md_bg_color: hex('#add8e6')
            pos_hint: {"center_x": .5, "center_y": .1}
            font_size: "15sp"
            on_release: 
                root.get_text()
                root.manager.current = "results"

<ResultsScreen>:
    name: 'results'
    MDFloatLayout:
        md_bg_color: hex('#003153') # background color
        MDLabel:
            text: "DreamGen"
            color: hex('#f5deb3')
            halign: "center"
            pos_hint: {"center_x": .5, "center_y": .9}
            font_size: "40sp"
            font_name: "Pacifico"
        AsyncImage:
            size_hint: None,None
            size: root.height, root.height
            source: root.source
            mipmap: True
        MDFillRoundFlatButton:
            text: "Try again!"
            text_color: hex('#003153')
            md_bg_color: hex('#add8e6')
            pos_hint: {"center_x": .5, "center_y": .1}
            font_size: "15sp"
            on_release: root.manager.current = "home"

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    你的代码:

    self.urls = gen_5_images(HomeScreen().text)
    

    正在创建 HomeScreen 的新实例并访问该新实例的 text 变量。 HomeScreen 的新实例不是您的 GUI 中使用的实例。要访问 HomeScreen 的正确实例,请尝试将该代码更改为:

    self.urls = gen_5_images(self.manager.get_screen('home').text)
    

    糟糕,该代码可以工作,但不能在 __init__() 方法中使用,因为当时尚未设置 manager 属性。您可以等待 manager 属性被设置来处理。尝试更换:

    class ResultsScreen(HomeScreen):
        source = StringProperty()
        def __init__(self, **kwargs):
            super().__init__()
            self.urls = gen_5_images(HomeScreen().text)
            self.source = self.urls[0]
    

    和:

    class ResultsScreen(HomeScreen):
        source = StringProperty()
    
        # def __init__(self, **kwargs):
        #     super().__init__()
        #     # self.urls = gen_5_images(HomeScreen().text)
        #     # self.source = self.urls[0]
    
        def on_manager(self, *args):
            # gets run when manager property is changed
            self.urls = gen_5_images(self.manager.get_screen('home').text)
            self.source = self.urls[0]
    

    【讨论】:

    • 嗨,谢谢约翰。我收到以下错误:AttributeError: 'NoneType' object has no attribute 'get_screen'
    • 查看更新的答案。
    • 非常感谢约翰!我相信我们快到了,但它仍然返回“dog”而不是在“get_text()”上定义的新变量。我将对初始问题进行必要的更改,您的提示已经集成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多