【问题标题】:sm.current does not switch the screensm.current 不切换屏幕
【发布时间】:2021-06-12 08:25:52
【问题描述】:

我是 Kivy / MD 平台的新手,正在尝试构建一个简单的登录屏幕,但不幸的是在身份验证部分,屏幕管理器没有切换到选择屏幕。有人可以在这里帮助我吗?

我的 test.kv 文件是这样的

windowManager:
    Welcome:
    SelectionOption:


<Welcome>:
    id: welcome
    name: 'welcome'
    manager: 'sm'
    emailInput: emailInput
    passwordInput: passwordInput
    MDScreen :
        md_bg_color : [102/255,153/255,153/255,1]
        MDCard :
            size_hint : None, None
            size : 300, 450
            pos_hint : {"center_x":.5,"center_y":.5}
            padding : 20
            spacing : 30
            orientation : "vertical"

            MDLabel :
                text : 'Manager'
                font_style : 'Overline'
                font_size : 30
                halign : "center"
                size_hint_y : None
                height : self.texture_size[1]
                padding_y : 10

            MDTextFieldRound :
                id: emailInput
                hint_text : "Email address"
                icon_right : "account"
                size_hint_x : None
                width : 220
                font_size : 15
                pos_hint : {"center_x":.5}
                color_active : [0.2,0.2,0.1,1]
                TextInput:
                    multiline: False

            MDTextFieldRound :
                id: passwordInput
                hint_text : "password"
                icon_right : "eye-off"
                size_hint_x : None
                width : 220
                font_size : 15
                pos_hint : {"center_x":.5}
                color_active : [0.2,0.2,0.1,1]
                password : True
                TextInput:
                    multiline: False

            MDRoundFlatButton :
                text : 'Login'
                pos_hint : {'center_x':0.5, 'center_y':0.5}
                font_size : 20
                text_color: 0, 0, 0, 0
                on_press:
                    root.validatelogin()

            MDRoundFlatButton :
                text: 'NEW USER'
                pos_hint: {'center_x':.5, 'center_y':0.4}
                font_size: 20
                text_color: 0, 0, 0, 0
                on_press:
                    root.signup()

            Widget :
                size_hint_y : None
                height : 30

<SelectionOption>:
    info : info
    name : 'selection'
    MDLabel:
        id: info
        text : 'Selection Option'
        font_style : 'Overline'
    MDRoundFlatButton :
        text: 'Login'
        pos_hint : {'center_x':0.5, 'center_y':0.5}
        font_size : 20
        text_color: 0, 0, 0, 0

验证函数如下所示

from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.core.window import Window
from kivy.properties import ObjectProperty

Window.size = (350, 580)

class Welcome(Screen):
    emailInput = ObjectProperty(None)
    passwordInput = ObjectProperty(None)

    def validatelogin(self):

        if self.emailInput.text == "123" and self.passwordInput.text == "123":
            sm.current = "selection"


class SelectionOption(Screen):
    pass


class windowManager(ScreenManager):
    pass


sm = windowManager()
sm.add_widget(Welcome(name='welcome'))
sm.add_widget(SelectionOption(name='selection'))


class Console(MDApp):

    def build(self):
        return Builder.load_file('../Files/test.kv')


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

【问题讨论】:

    标签: python-3.x kivy kivymd


    【解决方案1】:

    sm.current = "selection" 不改变当前Screen 的原因是因为smScreenManager,但不是您的GUI 中的ScreenManager。我最近看到很多这种情况。您正在构建您的 GUI 两次。一次与行:

    sm = windowManager()
    sm.add_widget(Welcome(name='welcome'))
    sm.add_widget(SelectionOption(name='selection'))
    

    但是上面几行的结果并没有实际使用。您在运行代码时看到的 GUI 是由以下行构建的:

    return Builder.load_file('../Files/test.kv')
    

    在您的 build() 方法中。

    因此,您可以安全地消除这三行未使用的代码。

    然后,当您想要更改当前的Screen 时,您只需要获取在您的GUI 中使用的ScreenManager 的引用。如果您是从Screens 之一执行此操作,则可以从Screen 获取参考。因此,从Screen 中更改当前Screen 的行可以是:

    self.manager.current = "selection"
    

    【讨论】:

    • 嗨@John Anderson,感谢您的回复。我想在 .py 代码中进行屏幕切换,而不是在 .kv 文件中。因此,我尝试使用这种方法在 .py 文件中添加 ScreenManager。你能告诉我如何在上面的当前代码中使用它而不是 .kv 吗?请问.kv 或.py 文件有什么变化?
    • 我不明白你的问题。屏幕切换在python代码中完成(self.manager.current = "selection")。我的回答没有改变你的任何kv。你想消除kv吗?
    • 我尝试在 validate 函数下的 Welcome 类中添加以下部分。 ``` def validatelogin(self): sm = ScreenManager() # ScreenManager 对象 if self.emailInput.text == "123" and self.passwordInput.text == "123": sm.current = "selection" ```但我收到以下错误,因为它无法识别屏幕。但是在我的 .kv 文件中,我在其中为 SelectionOption 屏幕指定了名称:“selection” ``` kivy.uix.screenmanager.ScreenManagerException:没有名称为“selection”的屏幕。 ```
    • 你又犯了同样的错误。代码sm = ScreenManager() 正在创建ScreenManager 的一个新实例,但它不是您的GUI 中的那个。尝试删除该行并将该方法中的sm 替换为self.manager
    • 如果我这样做了,我就会开始收到这个错误。文件“/Users/MobileApps/Python/AuthNavigation.py”,第 18 行,在 validatelogin self.manager.current = 'selection' AttributeError: 'str' object has no attribute 'current' 但我可以在 ScreenManager 中看到当前定义为 StringProperty课也是。詹姆斯,我们还应该在这里做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多