我最近开始使用Kivy框架来创建一个应用程序,它有多个我想要合并的屏幕,这样,例如,在登录屏幕上按下一个按钮就可以打开另一个页面。我已经尝试使用ScreenManager库好几天了,但是我不能让它工作,互联网上有几个教程,但是每个人使用的变体都不一样。下面我附上了登录页面的代码,按下“登录”按钮,应打开第二个屏幕。
login.py:
from kivy.core.text import LabelBase
from kivy.lang import Builder
from kivy.core.window import Window
from kivymd.app import MDApp
Window.size = (350, 580)
kv = """
MDFloatLayout:
md_bg_color: 0, 0, 0, 1
Image:
source: "img\\logo5.png"
pos_hint: {"center_x": .5, "center_y": .85}
size_hint: .18, .18
MDFloatLayout:
size_hint: .9, .07
pos_hint: {"center_x": .5, "center_y": .68}
canvas:
Color:
rgb: 250/255, 250/255, 250/255, 1
RoundedRectangle:
size: self.size
pos:self.pos
radius: [4]
canvas.before:
Color:
rgb: 217/255, 217/255, 217/255, 1
Line:
width: 1.1
rounded_rectangle: self.x, self.y, self.width, self.height, 4, 4, 4, 4, 100
TextInput:
hint_text: "Phone number, username or e-mail"
size_hint: 1, None
pos_hint: {"center_x": .5, "center_y": .5}
height: self.minimum_height
background_color: 1, 1, 1, 0
font_size: "14sp"
font_name: "MRoboto"
hint_text_color: 170/255, 170/255, 170/255, 1
padding: 13
cursor_color: 0, 0, 0, 1
MDFloatLayout:
size_hint: .9, .07
pos_hint: {"center_x": .5, "center_y": .59}
canvas:
Color:
rgb: 250/255, 250/255, 250/255, 1
RoundedRectangle:
size: self.size
pos:self.pos
radius: [4]
canvas.before:
Color:
rgb: 217/255, 217/255, 217/255, 1
Line:
width: 1.1
rounded_rectangle: self.x, self.y, self.width, self.height, 4, 4, 4, 4, 100
TextInput:
hint_text: "Password"
size_hint: 1, None
pos_hint: {"center_x": .5, "center_y": .5}
height: self.minimum_height
background_color: 1, 1, 1, 0
font_size: "14sp"
font_name: "MRoboto"
password: "true"
hint_text_color: 170/255, 170/255, 170/255, 1
padding: 13
cursor_color: 0, 0, 0, 1
Button:
text: "Log in"
color: 1, 1, 1, 1
size_hint: .9, .07
pos_hint: {"center_x": .5, "center_y": .43}
background_color: 1, 1, 1, 0
font_size: "13sp"
font_name: "BRoboto"
canvas.before:
Color:
rgb: 98/255, 170/255, 243/255, 1
RoundedRectangle:
size: self.size
pos: self.pos
radius: [4]
MDLabel:
text: "Don't have an account?"
color: 172/255, 172/255, 172/255, 1
pos_hint: {"center_x": .74, "center_y": .095}
font_size: "13sp"
font_name: "MRoboto"
MDTextButton:
text: "Sign up"
color: 98/255, 170/255, 243/255, 1
pos_hint: {"center_x": .685, "center_y": .095}
font_size: "13sp"
font_name: "MRoboto"
MDCheckbox:
size_hint: None, None
size: "48dp", "48dp"
pos_hint: {"center_x": .1, "center_x": .1}
on_active: app.show_password(*args)
MDLabel:
id: password_text
text: "Show Password"
pos_hint: {"center_x": .7, "center_x": .43}
"""
class Login(MDApp):
def build(self):
return Builder.load_string(kv)
def show_password(self, checkbox, value):
if value:
self.root.ids.password.password = False
self.root.ids.password_text.text = "Hide Password"
else:
self.root.ids.password.password = True
self.root.ids.password_text.text = "Show Password"
if __name__ == "__main__":
LabelBase.register(name="BRoboto", fn_regular="font\\Roboto-Bold.ttf")
LabelBase.register(name="MRoboto", fn_regular="font\\Roboto-Medium.ttf")
Login().run()
list.py:
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.factory import Factory
from kivy.uix.image import Image
from kivymd.app import MDApp
from kivymd.uix.list import IRightBodyTouch, ILeftBody
from kivymd.uix.selectioncontrol import MDCheckbox
Window.size = (350, 580)
kv = """
<ListItemWithCheckbox@OneLineAvatarIconListItem>:
MyAvatar:
source: "data/logo/kivy-icon-128.png"
MyCheckbox:
<Lists@BoxLayout>
name: "lists"
orientation: "vertical"
MDTopAppBar:
title:"Hide the story to:"
md_bg_color: app.theme_cls.primary_color
elevation: 3
ScrollView:
MDList:
id: scroll
"""
Builder.load_string(kv)
class MyCheckbox(IRightBodyTouch, MDCheckbox):
pass
class MyAvatar(ILeftBody, Image):
pass
class Users(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def build(self):
self.title = "Liste"
self.theme_cls.primary_palette = "Teal"
self.theme_cls.theme_style = "Dark"
list = Factory.Lists()
for i in range(30):
list.ids.scroll.add_widget(Factory.ListItemWithCheckbox(text="Item %d" % i))
self.root = list
if __name__ == "__main__":
Users().run()
在我的测试中,我尝试在login.py代码和从头创建的第三个新文件中示例化ScreenManager。
2条答案
按热度按时间yhqotfr81#
让我来给你介绍一下Kivy屏幕的基本知识。下面是一个有3个屏幕的示例应用程序。每个屏幕都包含按钮:
在
screenssample.kv
文件的顶部有一个屏幕层次结构。类MyScreens
是一个屏幕管理器,是三个屏幕的父级:MyScreen1
,MyScreen2
,MyScreen3
。要转到另一个屏幕,您必须将其屏幕名称分配给管理器的当前属性manager.current
。main.py
screenssample.kv
我希望这个示例容易理解,但是即使基于这个简单的py和kv文件,您也可能会注意到,将所有screen放在一个kv文件中,将所有screen类放在一个py文件中,将产生难以开发和维护的巨大文件。
下面是相同的例子,但是每个屏幕都是在单独的kv和py文件中定义的。我认为这使得代码更可读,更容易开发/维护。
main.py
screenssample.kv
screen1.py
screen1.kv
screen2.py
screen2.kv
screen3.py
screen3.kv
此外,在
screen1.py
中,我还介绍了如何访问与kv文件相同的方法,而不是Python的screen方法。正如您可能注意到的,如何从kv文件和Python代码访问方法(或属性)存在细微差异,例如:xdnvmnnf2#
我更新了你的代码,所以所有的东西都在login.py中。它使用屏幕管理器在屏幕之间切换。你也可以把list类放在一个list.py文件中,然后把它使用的导入移到那个文件中。