python - 如何在 Kivy 中浏览屏幕?
问题描述
我正在尝试创建一个具有两个屏幕的应用程序,一个是登录屏幕,下一个是主页。我无法为我的第二个屏幕合并 Kivy 代码。如何添加代码以便切换到第二个屏幕?
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.label import Label
class SigninWindow(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def validate_user(self):
user = self.ids.username_field
pwd = self.ids.pwd_field
info = self.ids.info
uname = user.text
passw = pwd.text
if uname == '' or passw == '':
info.text = '[color=#FF0000]username and/ or password required[/color]'
else:
if uname == 'admin' and passw == 'admin':
info.text = '[color=#00FF00]Logged In successfully![/color]'
else:
info.text = '[color=#FF0000]Invalid Username and/or Password[/color]'
class SigninApp(App):
def build(self):
return SigninWindow()
if __name__=="__main__":
sa = SigninApp()
sa.run()
kv文件:
<FlatButton@ButtonBehavior+Label>:
font_size: 16
<SigninWindow>:
id: main_win
orientation: "vertical"
spacing: 10
space_x: self.size[0]/3
canvas.before:
Color:
rgba: (1,1,1, 1)
Rectangle:
size: self.size
pos: self.pos
BorderImage:
source: 'E:\pythonpics/blu2.png'
pos: self.pos
size: self.size
BoxLayout:
size_hint_y: None
height: 50
canvas.before:
Color:
rgba: (.06, .45, .45, 1)
Rectangle:
size: self.size
pos: self.pos
Label:
text: "Hello! Dear User Please Sign In"
bold: True
size_hint_x: .9
BoxLayout:
orientation: 'vertical'
padding: main_win.space_x, 10
#spacing: 20
BoxLayout:
orientation: "vertical"
spacing: 10
size_hint_y: None
height: 100
Label:
id: info
text: ''
markup: True
size_hint_y: None
height: 20
TextInput:
id: username_field
hint_text: "Username"
multiline: False
focus: True
on_text_validate: pwd_field.focus = True
TextInput:
id: pwd_field
hint_text: "Password"
multiline: False
password: True
on_text_validate: root.validate_user()
Label:
id: sp
size_hint_y: None
height: 40
Button:
text: "Sign In"
size_hint_y: None
height: 40
background_color: (.06,.45,.45, 1)
background_normal: ''
on_release: root.validate_user()
Label:
id: sp2
解决方案
欢迎来到 Stackoverflow!
你需要一个ScreenManager
和Screen
s。您可以通过 切换到特定屏幕ScreenManager.current = "Name of Other Screen"
。
您可能想要更改您的小部件,因此您可以省略类似App.get_running_app().root.current
.
Your app python code:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.label import Label
Builder.load_string("""
<Rootwidget>:
Screen:
name: "SignIn"
SigninWindow:
Screen:
name: "SignedIn"
Label:
text: "You have signed in."
<FlatButton@ButtonBehavior+Label>:
font_size: 16
<SigninWindow>:
id: main_win
orientation: "vertical"
spacing: 10
space_x: self.size[0]/3
canvas.before:
Color:
rgba: (1,1,1, 1)
Rectangle:
size: self.size
pos: self.pos
BorderImage:
source: 'E:\pythonpics/blu2.png'
pos: self.pos
size: self.size
BoxLayout:
size_hint_y: None
height: 50
canvas.before:
Color:
rgba: (.06, .45, .45, 1)
Rectangle:
size: self.size
pos: self.pos
Label:
text: "Hello! Dear User Please Sign In"
bold: True
size_hint_x: .9
BoxLayout:
orientation: 'vertical'
padding: main_win.space_x, 10
#spacing: 20
BoxLayout:
orientation: "vertical"
spacing: 10
size_hint_y: None
height: 100
Label:
id: info
text: ''
markup: True
size_hint_y: None
height: 20
TextInput:
id: username_field
hint_text: "Username"
multiline: False
focus: True
on_text_validate: pwd_field.focus = True
TextInput:
id: pwd_field
hint_text: "Password"
multiline: False
password: True
on_text_validate: root.validate_user()
Label:
id: sp
size_hint_y: None
height: 40
Button:
text: "Sign In"
size_hint_y: None
height: 40
background_color: (.06,.45,.45, 1)
background_normal: ''
on_release: root.validate_user()
Label:
id: sp2
""")
class Rootwidget(ScreenManager):
pass
class SigninWindow(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def validate_user(self):
user = self.ids.username_field
pwd = self.ids.pwd_field
info = self.ids.info
uname = user.text
passw = pwd.text
if uname == '' or passw == '':
info.text = '[color=#FF0000]username and/ or password required[/color]'
else:
if uname == 'admin' and passw == 'admin':
info.text = '[color=#00FF00]Logged In successfully![/color]'
App.get_running_app().root.current = "SignedIn"
else:
info.text = '[color=#FF0000]Invalid Username and/or Password[/color]'
class SigninApp(App):
def build(self):
return Rootwidget()
if __name__=="__main__":
sa = SigninApp()
sa.run()
推荐阅读
- typescript - 基于属性值的 TypeScript 泛型
- regex - 正则表达式:也匹配带有未知符号的长字符串
- php - 如果尝试以较大的形式以小间隔发布,则 ajax 发布有时会失败
- angular - Ionic V4,JSON 来自 URL 而不是来自 MySQL
- excel - 在 Yahoo Finance 上将 unix 时间戳调整为相同
- neo4j - 使用导入工具导入 csv 时出错
- dynamic-programming - 在一次只能爬 3 层楼梯 k 次的条件下,有多少种方法可以一次爬 N 层楼梯,1,2 和 3 层楼梯?
- php - html不打印输出文本
- unity3d - unity export to 64bit apk 会导致游戏延迟
- azure - 如何使用 Terraform 为 Ansible 播种 SSH 密钥?