繁体   English   中英

为什么我不能关闭 kivy 弹出窗口?

[英]Why can't I dismiss kivy popup?

我创建了一个应用程序,在启动时,会出现一个弹出窗口 window 询问登录凭据。 提供正确的凭据后,此弹出窗口应关闭,因此可以访问其后面的“主窗口”。

主要.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()

我的.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但我得到一个错误,“'function' object has no attribute 'popupWindow '

这是因为“popupWindow” object 是用另一个名称实例化的吗? 我怎样才能解决这个问题?

(我取出了一些其他屏幕的my.kv代码,因为它们没有被使用。)

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM