为什么我不能解雇kivy popup?

问题描述 投票:0回答:1

我创建了一个应用程序,在开始时会出现一个弹出窗口,要求输入登录凭据。提供正确的凭据后,该弹出窗口应关闭,因此可以访问其后面的“主窗口”。

main.py:

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.graphics import  Rectangle
from kivy.graphics import Color
from kivy.graphics import Line
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.config import Config
from kivy.uix.popup import Popup
from kivy.clock import Clock
from kivy.core.window import Window

Config.set('graphics', 'width', '1024')
Config.set('graphics', 'height', '768')


class LoginWindow(Screen):
    pass


class MainWindow(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class LoginPopup(Screen):  # Popup Window
    def login_popup(dt):  # Function to call Popup Window
        show = LoginPopup()
        popupWindow = Popup(title="Please log in", content=show, size_hint=(None, None), size=(400, 125),
                            auto_dismiss=False)
        popupWindow.open()


kv = Builder.load_file("my.kv")


class MainApp(App):
    def dismiss(self):
        self.dismiss()

    def build(self):
        Clock.schedule_once(LoginPopup.login_popup, 1)  # Loading the login popup 1 second after initialising
        return kv


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

my.kv

<LoginPopup>:
    id: popupWindow
    GridLayout:
        rows: 2
        FloatLayout:
            size_hint: 1,0.5
            rows: 1
            cols: 2
            Label:
                pos: (0,40)
                text: "Password: "
                text_size: self.size

            TextInput:
                pos: (80,35)
                size_hint_y: (.8)
                size_hint_x: (.785)
                password: True
                id: password
                multiline: False
        Button:
            id: login_button
            text: "Login"
            size_hint: 1,0.5
            pos_hint: {"x":0,"y":0.1}
            on_release:
                root.login_popup.popupWindow.dismiss() if password.text == "XXX" else None
                print(password.text)

在my.kv内部,我想用root.login_popup.popupWindow.dismiss() if password.text == "XXX" else None关闭弹出窗口,但出现“函数对象没有属性'popupWindow'的错误”

这是因为“ popupWindow”对象是用另一个名称实例化的吗?我该如何解决?

((由于未使用其他屏幕,我取出了一些my.kv代码。)

python python-3.x kivy kivy-language
1个回答
0
投票

您代码中的popupWindow变量是login_popup()方法的局部变量。通过将LoginPopup类更改为:

,可以将该类级别变量设置为:
class LoginPopup(Screen):  # Popup Window
    popupWindow = None

    def login_popup(dt):  # Function to call Popup Window
        show = LoginPopup()
        LoginPopup.popupWindow = Popup(title="Please log in", content=show, size_hint=(None, None), size=(400, 125),
                            auto_dismiss=False)
        LoginPopup.popupWindow.open()

然后您可以在kv中以以下方式访问它:

        on_release:
            root.popupWindow.dismiss() if password.text == "XXX" else None
            print(password.text)
© www.soinside.com 2019 - 2024. All rights reserved.