簡體   English   中英

如何從另一個 kivy 應用程序使用 arguments 啟動 kivy 應用程序

[英]How to start kivy app with arguments from another kivy app

我希望文本輸入中的變量在啟動時傳遞給另一個 class。 So I have a class that is a loginscreen (done with python with kivy), when the user enters it's username I want this to be passed along to another class (in a different.py file) so that the newly started class will be able用它的名字問候用戶。

我該怎么做呢?

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()

返回app1.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()


    

返回app2.kv:

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

我希望代碼能解釋我想做的事情。 另外,我是否在整體上“正確”地考慮這個問題? 我的意思是一個.py 文件用於登錄屏幕,另一個用於用戶特定的問候屏幕等? 目前正在學習 kivy 和 python 和編程。

提前致謝!

而不是制作 2 個不同的 python 和 kivy 文件,您應該使用 Kivy 中的ScreenManager() 這允許您創建多個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

注意事項:

  1. 使用屏幕時,可以直接訪問ID,而不必在.kv文件中創建屬性( label: label_kv ,可以直接self.ids["<widget id>"]
  2. 您可以在 .py 和 .kv 中單獨聲明 Screens,就像主小部件一樣,但都在一個文件中
  3. 您需要為每個屏幕命名,這可能與 class 名稱不同,但保持相同有助於保持一致性
  4. 我們現在不是切換應用程序,而是使用self.manager.current = "ScreenName"切換屏幕
  5. 我制作了username_to_pass_on ,這是屏幕的一個屬性,允許從任何其他屏幕輕松訪問
  6. 我們使用Builder加載文件並在構建中初始化ScreenManager() ,將畫面一一添加,最后返回管理器。
  7. 為了訪問其他屏幕的屬性和小部件,您可以使用屏幕中的self.manager.get_screen("ScreenName").property

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM