首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两次加载kivy模块时无法编辑文本输入

两次加载kivy模块时无法编辑文本输入
EN

Stack Overflow用户
提问于 2017-07-23 10:17:50
回答 1查看 492关注 0票数 0

我正在做一个项目,下面是kivy python模块的流程。视频->登录-> HomeScreen ->视频(重复)。这是第一次,事情完美无缺。

  1. 显示视频播放和点击登录屏幕。
  2. 用户输入凭据并成功登录会带他到主屏幕。
  3. 一旦用户单击主屏幕上的一个按钮,请重复步骤1

之后,登录屏幕上的密码文本框是不可编辑的,不能继续下去。在控制台上,它给了我一个信息:

警告文件../login.kv多次加载,您可能会有不想要的行为。

我使用一个kv文件来加载登录屏幕中的控件。我遵循了一个博客建议,将on_parent:self.focus = True分配给控件,但我有两个。将此属性分配给两个控件(Login和passwd),使第三步之后只有一个可编辑。

以下是我的登录屏幕代码。如果我漏掉了什么基本的东西就告诉我。

代码语言:javascript
复制
#!/usr/bin/python3
# -*- coding: <UTF-8> -*-

from kivy.app import App
from kivy.properties import StringProperty
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivy.properties import ObjectProperty, StringProperty
from pysqlcipher import dbapi2 as sqlcipher

import os, sys
import logging

try:
    Builder.load_file("login.kv")
except Exception as e:
    logging.error('login::failed to load kv file')

class Login(Screen):
    user_id = StringProperty()
    user_pass = StringProperty()

    def __init__(self,  **kwargs):
        super(Login, self).__init__()
        self.user_id = self.reset_user_id()
        self.user_pass = self.reset_user_pass()

    def reset_user_id(self):
        return ""

    def reset_user_pass(self):
        return ""

    def do_login(self, loginText, passwordText):

        do_validation = self.validate(loginText, passwordText)
        if do_validation:
            LoginApp.get_running_app().stop()
            try:
                Builder.unload_file("login.kv")
            except Exception as e:
                logging.error('failed to unload kv file')

            from app.HomeScreen import HomeScreen
            HomeScreen.HSApp().run()    #run another kivy python module

    def validate(self, uname, passw):
    #database handling
    return True

    def resetForm(self):
        self.reset_user_id()
        self.reset_user_pass()

class LoginApp(App):
    def build(self):
        return Login()

if __name__ == '__main__':
    LoginApp().run()

以下是登录kv文件

代码语言:javascript
复制
<Login>:
    BoxLayout
        id: login_layout
        orientation: 'vertical'
        padding: [10,50,10,50]
        spacing: 25

        Label:
            text: 'Welcome'
            font_size: 28

        BoxLayout:
            orientation: 'vertical'

            Label:
                text: 'Login'
                font_size: 14
                halign: 'left'
                text_size: root.width-20, 20

            TextInput:
                id: login
                multiline:False
                font_size: 14
                height: 14
                hint_text: 'Enter your ID'
                on_parent:self.focus = True
        BoxLayout:
            orientation: 'vertical'

            Label:
                text: 'Password'
                halign: 'left'
                font_size: 14
                text_size: root.width-20, 20

            TextInput:
                id: password
                multiline: False
                password: True
                font_size: 14
                height: 14
                hint_text: 'Enter your pass'
        Button:
            text: 'OK'
            font_size: 14

            on_press: root.do_login(login.text, password.text)

        Button:
            text: 'Reset'
            font_size: 14

            on_press: root.resetForm()

        Label:
            id: status
            multiline:False
            font_size: 14

另一个问题是,我正在为各自的屏幕多次加载/卸载kv文件。这会造成问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-23 10:28:06

您需要将所有屏幕配置添加到一个.kv文件中并加载它。

为什么?

kivy应用程序中的Screens与其他应用程序中的widows不同,在其他应用程序中,打开一个新的window基本上就是创建一个新实例;在kivy中,只有一个window加载了所有的screens,一旦您想要切换到特定的screenScreenManager就会隐藏当前的一个,并显示您所请求的那个。

我还注意到您正在为每个screen运行一个新应用程序,相反,您应该将所有屏幕添加到同一个应用程序中的同一个python模块中。

代码语言:javascript
复制
if do_validation:
    LoginApp.get_running_app().stop()
    try:
        Builder.unload_file("login.kv")
    except Exception as e:
    logging.error('failed to unload kv file')

    from app.HomeScreen import HomeScreen
    HomeScreen.HSApp().run()    #run another kivy python module

如果不使用ScreenManager,则必须更改此代码,请查看这份文件

编辑:

下面是ScreenScreenManager如何工作的一个小例子:

代码语言:javascript
复制
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager


class LoginScreen(Screen):
    pass

class HomeScreen(Screen):
    pass

class SM(ScreenManager):
    pass

app_string = Builder.load_string("""
SM:
    LoginScreen:
    HomeScreen:

<LoginScreen>:
    name: 'login'
    BoxLayout:
        Button:
            text: 'Next screen'
            on_release:
                root.manager.current = 'home'

<HomeScreen>:
    name: 'home'
    BoxLayout:
        Button:
            text: 'Back to login'
            on_release:
                root.manager.current = 'login'
""")

class MyApp(App):

    def build(self):
        return app_string

if __name__ == '__main__':
    MyApp().run()

如果你运行这个应用程序,你会注意到的行为,屏幕上的变化时,点击按钮。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45263957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档