在没有 .kv 文件的情况下使用屏幕管理器时出现一些问题

2024-02-20

我正在尝试使用 Pthon 和 kivy 制作应用程序。我正在研究其中的登录/注册部分。我试图为每个屏幕(登录和注册)创建一个屏幕,并将它们与 ScreenManager 连接,但没有 .kv 文件。如果不可能,我想在 hte .kv 文件中写尽可能少的内容

我看过一些教程说我必须为每个窗口类继承“Screen”并为 ScreenManager 创建一个类。然后,在 .kv 文件中,为每个类设置“name”变量。之后,我应该在“on_click”函数中使用“root.app.current =”。我尝试仅使用 python 来完成此操作,然后使用一点 KvLang 来完成此操作,但没有成功。

我尝试使用代码的注释部分,但它也不起作用

.py 文件

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition


class ScreenManagement(ScreenManager):
    def __init__(self, **kwargs):
        super(ScreenManagement, self).__init__(**kwargs)
        #self.transition = FadeTransition()
        #self.add_widget(RegisterWindow(name='register'))
        #self.add_widget(LoginWindow(name='login'))

    def screen_transition(self, *args):
        self.current = 'register'


class RegisterWindow(Screen, FloatLayout):
    def __init__(self, **kwargs):
        super(RegisterWindow, self).__init__(**kwargs)
        self.name = 'register'
        self.add_widget(Label(text='Username', size_hint=(.45, .1), pos_hint={'x': .05, 'y': .7}))
        self.username = TextInput(multiline=False, size_hint=(.45, .1), pos_hint={'x': .5, 'y': .7})
        self.add_widget(self.username)
        self.add_widget(Label(text='Password', size_hint=(.45, .1), pos_hint={'x': .05, 'y': .5}))
        self.password = TextInput(multiline=False, password=True, size_hint=(.45, .1), pos_hint={'x': .5, 'y': .5})
        self.add_widget(self.password)
        self.add_widget(Label(text='E-mail', size_hint=(.45, .1), pos_hint={'x': .05, 'y': .3}))
        self.email = TextInput(multiline=False, size_hint=(.45, .1), pos_hint={'x': .5, 'y': .3})
        self.add_widget(self.email)
        self.btn = Button(text='Register', size_hint=(.9, .2), pos_hint={'center_x': .5, 'y': .03})
        self.add_widget(self.btn)
        self.btn.bind(on_press=self.submit)

    def submit(self, instance):
        username = self.username.text
        password = self.password.text
        email = self.email.text

        info = {'Username': username,
                'Password': password,
                'Email': email}

        file = open('data.csv', 'a+')
        file.write(f'{info["Username"]},{info["Password"]},{info["Email"]}\n')
        file.close()

        self.username.text = ''
        self.password.text = ''
        self.email.text = ''

        print(info)


class LoginWindow(Screen, FloatLayout):
        def __init__(self, **kwargs):
            super(LoginWindow, self).__init__(**kwargs)
            self.name = 'login'
            self.btn2 = Button(text='Go')
            self.add_widget(self.btn2)
            self.btn2.bind(on_press = ScreenManagement().screen_transition())


class Application(App):
    def build(self):
        return LoginWindow()


if __name__ == "__main__":
    Application().run()

.kv 文件

#:import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManagement:
    transition: FadeTransition()
    RegisterWindow:
        name: 'register'
    LoginWindow:
        name: 'login'

它引发异常:kivy.uix.screenmanager.ScreenManagerException:没有名称为“register”的屏幕。


你实际上不需要任何kv根本不。这是您的代码的一个版本,没有kv:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition


class ScreenManagement(ScreenManager):
    def __init__(self, **kwargs):
        super(ScreenManagement, self).__init__(**kwargs)


class RegisterWindow(Screen):
    def __init__(self, **kwargs):
        super(RegisterWindow, self).__init__(**kwargs)
        self.add_widget(Label(text='Username', size_hint=(.45, .1), pos_hint={'x': .05, 'y': .7}))
        self.username = TextInput(multiline=False, size_hint=(.45, .1), pos_hint={'x': .5, 'y': .7})
        self.add_widget(self.username)
        self.add_widget(Label(text='Password', size_hint=(.45, .1), pos_hint={'x': .05, 'y': .5}))
        self.password = TextInput(multiline=False, password=True, size_hint=(.45, .1), pos_hint={'x': .5, 'y': .5})
        self.add_widget(self.password)
        self.add_widget(Label(text='E-mail', size_hint=(.45, .1), pos_hint={'x': .05, 'y': .3}))
        self.email = TextInput(multiline=False, size_hint=(.45, .1), pos_hint={'x': .5, 'y': .3})
        self.add_widget(self.email)
        self.btn = Button(text='Register', size_hint=(.9, .2), pos_hint={'center_x': .5, 'y': .03})
        self.add_widget(self.btn)
        self.btn.bind(on_press=self.submit)

    def submit(self, instance):
        username = self.username.text
        password = self.password.text
        email = self.email.text

        info = {'Username': username,
                'Password': password,
                'Email': email}

        file = open('data.csv', 'a+')
        file.write(f'{info["Username"]},{info["Password"]},{info["Email"]}\n')
        file.close()

        self.username.text = ''
        self.password.text = ''
        self.email.text = ''

        print(info)


class LoginWindow(Screen):
        def __init__(self, **kwargs):
            super(LoginWindow, self).__init__(**kwargs)
            self.btn2 = Button(text='Go')
            self.add_widget(self.btn2)
            self.btn2.bind(on_press = self.screen_transition)

        def screen_transition(self, *args):
            self.manager.current = 'register'


class Application(App):
    def build(self):
        sm = ScreenManagement(transition=FadeTransition())
        sm.add_widget(LoginWindow(name='login'))
        sm.add_widget(RegisterWindow(name='register'))
        return sm


if __name__ == "__main__":
    Application().run()

主要变化是建设ScreenManagement实例和孩子Screens in the App build()方法。另外,还更改了绑定Go Button to a screen_transition()方法在同一个类中。和你的Screen类不需要扩展FloatLayout (Screen is a RelativeLayout).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在没有 .kv 文件的情况下使用屏幕管理器时出现一些问题 的相关文章

随机推荐

  • 为 STL 随机数生成器编写工厂方法

    我正在尝试通过配置文件提供一个界面 以便我的用户为他们正在使用的某些参数选择一个发行版 我想使用 STL 随机数生成器算法来实现此目的 假设我的程序从命令行读取 JSON 对于下面提供的 JSON 程序需要意识到它应该根据给定均值和标准差的
  • C# 是否有一个好的 leveldb 端口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望在我的纯 C 项目中使用 leveldb 我在 google 上搜索了 leveldb 的 C 版本 但没有找到 谁能告诉我在哪里可
  • JAXB 按原样使用 String

    我使用 REST 我想知道是否可以告诉 jaxb 将字符串字段 按原样 插入到传出的 xml 中 当然 我想在返回之前将其拆开 但我想节省这一步 XmlRootElement name unnestedResponse public cla
  • 在 Three.js 继承模式中对原型使用扩展有什么好处?

    使用优秀的 Three js 框架 目前正在寻找良好的 javascript 继承模式 我了解了 Three js 中所做的事情 我现在对正在发生的事情有了很好的了解 除了一些 类 例如 Vector3 特别是 我不清楚为什么有些方法是直接
  • 如何在 svelte 中访问 websocket?

    我正在尝试将 svelte 连接到 fastapi 后端 但使用 svelte 套件时出现此错误 我明白了 WebSocket is not defined ReferenceError WebSocket is not defined e
  • cherrypy.HTTPRedirect 使用绝对路径重定向到 IP 而不是主机名

    我在 nginx 后面运行 CherryPy 并需要处理重定向 在我的在 127 0 0 1 8080 上运行的开发机器上 这会正确重定向到 127 0 0 1 8080 login 然而 当通过 nginx 在cherrypy mydom
  • 将数据块读入matlab数组

    我有一个如下所示的数据文件 3 1 0 1 4 1 7 2 1 2 1 5 1 1 1 2 1 1 1 2 对于每一行 第一个整数表示该行中浮点数的数量 现在我想将所有数据加载到一个matlab数组中 并忽略第一列 也就是说 我想得到一个像
  • 原则:多个(whereIn OR whereIn)查询?

    我在用 Doctrine 编写一个相当简单的查询时遇到了麻烦 我有两个数组 countries cities 我需要检查数据库记录值是否与其中的任何一个匹配 我正在寻找类似的东西 gt whereIn country city countr
  • 当文件在其他进程中使用时删除该文件

    In DocumentViewerControl在 WPF 中 我想在关闭事件处理程序中关闭控件后删除该文件 我试图删除它 但 VS 告诉我它被另一个进程使用 我怎样才能删除它 TextBlock tb TextBlock e TabIte
  • Akka设计原则

    在开发一个相当大的 Akka 应用程序时 我在使用普通方法和非 Akka 类时遇到了一个非常简单的结构 但在使用 Akka 时实际上很难确定 这就是为什么我来这里问你什么建议是解决此问题的最佳方法 所以问题是这样的 我有一个父角色 我们称他
  • 在没有 Adob​​e Reader 的情况下将 pdf 文件显示到浏览器中

    我需要在没有 Adob e Reader 的情况下在浏览器中打开 pdf 文件 是否有 PHP 的 API 可以在浏览器中打开 PDF 文件 Regards No PHP 在服务器上运行 它可以访问的唯一 浏览器 API 是 HTTP 如果
  • 如何在非 root 运行的容器中安装新包?

    我需要在正在运行的容器中安装简单的包 例如curl 但我遇到了这个错误 apk add curl ERROR Unable to lock database Permission denied ERROR Failed to open ap
  • 将 System.out 和 System.err 重定向到 slf4j

    我需要重定向System out err println输出到 slf4j 我知道这不是正确进行日志记录的方法但有一个外部库 它记录到System out 您可以使用slf4j 上的系统输出 http projects lidalia or
  • 否定打字稿类型?

    我想在打字稿中创建一个简单的 NOT 运算符 您可以将所有基元组合到某种类型 A 的联合中 这些基元不是第二种类型 B 的联合的基元成员 这可以使用条件类型来完成 例如 如果您有类型 type A a b c type B c d e 然后
  • 如何从 ByteBuffer 获取短[]

    我在 Android 项目中使用 JNI 代码 其中 JNI 本机函数需要一个短 参数 但是 原始数据存储为 ByteBuffer 我正在尝试按如下方式转换数据格式 ByteBuffer rgbBuf ByteBuffer allocate
  • 同一库的多个版本

    我有项目 A 它曾经有模块 A1 使用 dagger v 1 2 2 现在我想添加到项目 A 模块 A2 它依赖于 dagger v 2 0 但我不能 因为这两个匕首库是冲突的 我可以在不同的 android 模块中以某种方式处理多个版本的
  • 使用 Ruby 正则表达式使用常规双引号转义 '“'

    我的文本包含这些奇特的双引号 我想使用 Ruby gsub 和正则表达式将它们替换为常规双引号 这是一个例子以及我到目前为止所拥有的 sentence This is a quote Hey guys I couldn t figure o
  • (Android Xamarin) 获取资源字符串值而不是 int

    我刚刚开始使用 VS2012 使用 Xamarin 创建一个简单的 Android 应用程序 我知道有一种类型的资源仅用于字符串 在我的资源文件夹中 我有一个如下所示的 xml 文件
  • 当启用面板向左滚动时,如何显示我的页面在左侧部分可见?

    IN this link http view jquerymobile com 1 3 2 dist demos widgets panels 我可以发现有一个覆盖选项 我可以在其中隐藏或显示右侧或左侧的面板 但我想在面板中显示面板 90
  • 在没有 .kv 文件的情况下使用屏幕管理器时出现一些问题

    我正在尝试使用 Pthon 和 kivy 制作应用程序 我正在研究其中的登录 注册部分 我试图为每个屏幕 登录和注册 创建一个屏幕 并将它们与 ScreenManager 连接 但没有 kv 文件 如果不可能 我想在 hte kv 文件中写