如何使用来自另一个 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["<widget id>"]
)
您在 .py 和 .kv 中分别声明 Screens,就像主小部件一样,但都在一个文件中
您需要为每个屏幕命名,这可能与类名不同,但保持相同有助于保持一致性
我们现在使用self.manager.current = "ScreenName"
切换屏幕,而不是切换应用程序
我已将username_to_pass_on
设为屏幕的属性,允许从任何其他屏幕轻松访问
我们使用Builder加载文件并在build中初始化ScreenManager()
,并一一添加画面,最后返回manager。
为了访问其他屏幕的属性和小部件,您可以在屏幕上使用self.manager.get_screen("ScreenName").property
【讨论】:
@Sixtenson 如果对您有帮助,请考虑将其标记为正确的以上是关于如何使用来自另一个 kivy 应用程序的参数启动 kivy 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用来自另一个脚本的参数启动 python 脚本,以编程方式设置 argparse 值