我创建了一个应用程序,在开始时会出现一个弹出窗口,要求输入登录凭据。提供正确的凭据后,该弹出窗口应关闭,因此可以访问其后面的“主窗口”。
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代码。)
您代码中的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)