python - Kivy 动态类 - 第二个屏幕未链接
问题描述
我正在尝试使用动态类技术来更好地格式化我的代码,而不是将所有内容都放在一个.kv
文件中。我查看了这个答案,并尝试尽可能地将其复制到我所拥有的内容中,但遇到了一个问题。
该代码有效,但在正确输入密码后不会转换到“选择”屏幕。相反,输入文本被清除(应该如此),但不会转换。几乎就像“选择”屏幕没有正确链接一样。我不确定我哪里出错了。有人可以为我提供一些帮助吗?
主文件
from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
def invalid_login():
app = App.get_running_app()
app.root.current = "Main"
# Create a BoxLayout to add multiple lines or buttons to a PopUp
box = BoxLayout()
# Create PopUp
pop = Popup(
title="Invalid Password",
size_hint=(None, None), size=(200, 100),
content=box,
auto_dismiss=False
)
# Dismiss PopUp
box.add_widget(Button(text="Close", on_release=pop.dismiss))
pop.open()
class MainWindow(Screen):
def login(self):
if self.ids.password.text == "Password":
# Clear TextInput
self.ids.password.text = ""
# Go to the next page
app = App.get_running_app()
app.root.current = "Select"
else:
self.ids.password.text = ""
invalid_login()
class SelectWindow(Screen):
pass
class TrainingWindow(Screen):
pass
class ModelWindow(Screen):
pass
class TrainModelWindow(Screen):
pass
class ParametersWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
kv_main = Builder.load_file('main.kv')
kv_select = Builder.load_file('select.kv')
kv_training = Builder.load_file('training.kv')
kv_model = Builder.load_file('model.kv')
kv_train_model = Builder.load_file('train_model.kv')
kv_parameters = Builder.load_file('parameters.kv')
class MyApp(App):
def build(self):
return kv_main
if __name__ == '__main__':
MyApp().run()
主文件
#:import utils kivy.utils
#:include main.kv
#:include select.kv
#:include training.kv
#:include model.kv
#:include train_model.kv
#:include parameters.kv
MainWindow:
name: "Main"
GridLayout:
cols: 1
BoxLayout:
orientation: "vertical"
canvas.before:
Color:
rgba: 0,0,0,1
Rectangle:
pos: self.pos
size: self.size
Label:
size_hint: 1, 1
text: "App"
font_size: 50
color:
utils.get_color_from_hex('#FF0000')
Label:
size_hint: 1, 1
text: "This App Does...."
font_size: 40
BoxLayout:
size_hint: 1, 0.005
canvas.before:
Color:
rgba: (1,1,1,1)
Rectangle:
size: self.size
pos: self.pos
BoxLayout:
orientation: "horizontal"
size_hint: (0.35, 0.35)
padding: (0,0,25,0)
Label:
font_size: 20
text: "Password"
size_hint: (0.5, 0.35)
pos_hint: {'x': 1, 'y': 0.4}
background_color: (0,0,0,1)
canvas.before:
Color:
rgba: self.background_color
Rectangle:
size: self.size
pos: self.pos
TextInput:
id: password
multiline: False
size_hint: (0.5, 0.35)
pos_hint: {'x': 1, 'y': 0.4}
focus: True
background_color:
utils.get_color_from_hex('#18B8D9')
cursor_color: (0,0,0,1)
password: True
Button:
text: "Submit"
on_release: root.login()
选择.kv
<SelectWindow@Screen>:
name: "Select"
BoxLayout:
orientation: "vertical"
Button:
text: "Go Back"
on_release:
app.root.current = "Main"
root.manager.transition.direction = "right"
解决方案
正如@inclement 评论的那样,我试图将屏幕用作我的屏幕管理器。我将我main.kv
的更新为以下内容,一切都解决了。
WindowManager:
MainWindow:
SelectWindow:
TrainingWindow:
ModelWindow:
TrainModelWindow:
ParametersWindow:
<MainWindow>
name: "Main"
推荐阅读
- java - 如何使用 Java 更改 XML 模式版本
- python - 反幂律的lambdify积分解
- javascript - 创建追加设置内部html并在一行中给元素一个类?
- video - pyav / ffmpeg / libav 访问端数据而不解码视频
- c - 扭曲个人 __VA_ARGS__
- javascript - 为什么 axios 忽略 .then?
- python - 结构模式匹配 Python - 匹配集合 / Frozenset
- node.js - TypeError:OAuth2Strategy 需要一个 clientID 选项
- java - 如何检查用户输入是否与二维数组的元素匹配?爪哇
- python - 如何使用 pyrebase 将文件从 firebase 存储下载到特定目录