如何使用来自另一个 kivy 应用程序的参数启动 kivy 应用程序

Posted

技术标签:

【中文标题】如何使用来自另一个 kivy 应用程序的参数启动 kivy 应用程序【英文标题】:How to start kivy app with arguments from another kivy app 【发布时间】:2021-04-08 07:24:18 【问题描述】:

我希望文本输入中的变量在启动时传递给另一个类。所以我有一个类是登录屏幕(使用 python 和 kivy 完成),当用户输入它的用户名时,我希望将其传递给另一个类(在不同的 .py 文件中),以便新启动的类能够用它的名字问候用户。

我该怎么做?

login_screen.py:

from kivy.app import App
import user_specific_greeting_screen

class LoginUser():
    def__init__(self):
        pass

def login(self):
    username_to_pass_on = self.user.text
    self.canvas.clear()
    user_specific_greeting_screen.ReturnApp2().run()  # <----  Want to pass var: 
                                                      #         username_to_pass_on
    

class  ReturnApp1(App):
    def build(self):
        return LoginUser()

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

returnapp1.kv:

<LoginUser>:
    user: user_kv
    BoxLayout:
        orientation: 'vertical'
        rows: 2
        BoxLayout:
            TextInput:
                id: user_kv
                hint_text: 'input username'
        BoxLayout:
            Button:
                text: 'Login'
                on_press: root.login()

user_specific_greeting_screen.py

from kivy.app import App

class UserGreet():
    def __init__(self):
        self.label.text = 'Hello ' + username_i_want_passed  # <--- Want username inserted 
                                                             #      here from app_1.py

class ReturnApp2(App):
    def build(self):
        return UserGreet()

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


    

returnapp2.kv:

<UserGreet>:
    label: label_kv
    Label:
        id: label_kv

我希望代码能解释我想要做什么。 另外,我是否在整体上“正确”地考虑这个问题?我的意思是一个 .py 文件用于登录屏幕,另一个用于用户特定的问候屏幕等?目前正在学习kivy和python以及编程。

提前致谢!

【问题讨论】:

您确定需要启动另一个应用程序吗?您不能只显示另一个显示“用户特定问候”的Screen 吗?看看ScreenManager。 感觉像一个旋钮,但这可能正是我需要研究的。非常感谢您抽出宝贵时间! 【参考方案1】:

您应该在 Kivy 中使用ScreenManager(),而不是制作 2 个不同的 python 和 kivy 文件。这允许您创建多个Screen(),每个Screen() 在一个应用程序中都有自己的一组小部件。

Python 文件 (main.py)

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager


class LoginUserScreen(Screen):

    username_to_pass_on = ""

    def login(self):
        self.username_to_pass_on = self.ids["user_kv"].text
        self.canvas.clear()
        self.manager.current = "UserGreetScreen"


class UserGreetScreen(Screen):
    
    def on_enter(self):
        self.ids["label_kv"].text = 'Hello ' + self.manager.get_screen("LoginUserScreen").username_to_pass_on


class MyApp(App):

    def build(self):
        Builder.load_file("styling.kv")
        sm = ScreenManager()
        sm.add_widget(LoginUserScreen())
        sm.add_widget(UserGreetScreen())
        return sm


MyApp().run()

Kivy 文件 (styling.kv)

#:kivy 1.11.1


<LoginUserScreen>:
    name: "LoginUserScreen"

    BoxLayout:
        orientation: 'vertical'
        rows: 2

        BoxLayout:
            TextInput:
                id: user_kv
                hint_text: 'input username'

        BoxLayout:
            Button:
                text: 'Login'
                on_press: root.login()


<UserGreetScreen>:
    name: "UserGreetScreen"

    Label:
        id: label_kv

注意事项:

    使用屏幕时,可以直接访问ID,而不必在.kv文件中创建属性(不需要label: label_kv,可以直接self.ids["&lt;widget id&gt;"]) 您在 .py 和 .kv 中分别声明 Screens,就像主小部件一样,但都在一个文件中 您需要为每个屏幕命名,这可能与类名不同,但保持相同有助于保持一致性 我们现在使用self.manager.current = "ScreenName" 切换屏幕,而不是切换应用程序 我已将username_to_pass_on 设为屏幕的属性,允许从任何其他屏幕轻松访问 我们使用Builder加载文件并在build中初始化ScreenManager(),并一一添加画面,最后返回manager。 为了访问其他屏幕的属性和小部件,您可以在屏幕上使用self.manager.get_screen("ScreenName").property

【讨论】:

@Sixtenson 如果对您有帮助,请考虑将其标记为正确的

以上是关于如何使用来自另一个 kivy 应用程序的参数启动 kivy 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

kivy 使用附加类来存储来自多个屏幕的数据

为啥我的 kivy 程序没有从另一个类调用函数?

从另一个线程更改 kivy 属性

使用来自另一个脚本的参数启动 python 脚本,以编程方式设置 argparse 值

在 Kivy 中,我如何从另一个以 kv 语言显示的另一个屏幕获取变量

如何在 kivy 中播放来自网络的视频,例如 youtube