Почему я не могу закрыть всплывающее окно kivy? - PullRequest
0 голосов
/ 09 мая 2020

Я создал приложение, в котором при запуске появляется всплывающее окно с запросом учетных данных для входа. После ввода правильных учетных данных это всплывающее окно должно закрываться, чтобы «главное окно» за ним было доступно.

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, но получаю сообщение об ошибке, что «объект 'function' не имеет атрибута 'popupWindow'

Это потому, что" popupWindow "создается с другим именем? Как это исправить?

(Я удалил часть кода my.kv других экранов, поскольку они не используются.)

1 Ответ

0 голосов
/ 09 мая 2020

Переменная 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)
...