9

Kivy python ライブラリを使用しています。

2 つのウィジェットが定義されています。

プログラムが実行されると、最初のウィジェットが実行されます。

そのウィジェット ボタンが押されると、消えて 2 番目のウィジェットに置き換えられます。

2 つのウィジェットの .kv は次のとおりです。

#uitest.kv
<TestForm>:
    canvas:
        Rectangle:
            pos: self.center_x, 0
            size: 10, self.height

    BoxLayout:
        size: root.size
        padding: 40
        Button:
            text: 'Hello'
            on_release: root.testCallback()

<TestForm2>:
    canvas:
        Rectangle:
            pos: self.center_x, 0
            size: self.height, 10

私のメインの python ファイルはアプリを実行し、最初のウィジェットを返します

#main.py
from testform import TestForm
from kivy.app import App

class UITestApp(App):
    def build(self):
        return TestForm()

# Main launching point
if __name__ in ('__main__', '__android__'):
    UITestApp().run()

私の最初のウィジェットにはコールバックがあります。これは、問題のコードが属する場所です

from testform2 import TestForm2
from kivy.uix.widget import Widget

class TestForm(Widget):
    def testCallback(self):
        TestForm2() # Code in question goes here. @TODO replace this widget with TestForm2 widget.

ここでのアイデアは、ユーザー インターフェイス マネージャーを用意することです。このマネージャーは、UI をツリーのように実行するのではなく、リストとスタックのように実行します。リストには、すべての UI フォームのインスタンスが保持されます。スタックは、前述のフォームのトラバーサルを保持します。フォームにジャンプするたびに、それをスタックにプッシュして「レンダリング」します。

編集: 私は自分の答えを選びましたが、私の検索では Screen オブジェクトも見つかりました: http://kivy.org/docs/api-kivy.uix.screenmanager.html 個人的には、clear() および add() コマンドがより強力ですが、興味がある場合は、画面がその多くを手放します. トランジション効果も。

4

2 に答える 2

11

私の提案は、インターフェイス マネージャー ウィジェットを用意することです。そうすれば、UI フォームにさまざまなウィジェットを用意できます。

import kivy
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App

class InterfaceManager(BoxLayout):

    def __init__(self, **kwargs):
        super(InterfaceManager, self).__init__(**kwargs)

        self.first = Button(text="First")
        self.first.bind(on_press=self.show_second)

        self.second = Button(text="Second")
        self.second.bind(on_press=self.show_final)

        self.final = Label(text="Hello World")
        self.add_widget(self.first)

    def show_second(self, button):
        self.clear_widgets()
        self.add_widget(self.second)

    def show_final(self, button):
        self.clear_widgets()
        self.add_widget(self.final)


class MyApp(App):
    def build(self):
        return InterfaceManager(orientation='vertical')

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

もちろん、そのように構造化することはありません。Container オブジェクトのディクショナリにすべてのフォームを保持し、キーによって別のフォームを提供するユニバーサル コールバックを持つことができます。

class InterfaceManager(BoxLayout):

    def __init__(self, **kwargs):
        super(InterfaceManager, self).__init__(**kwargs)
        self.forms = {}

    def add_form(self, key, form):
        self.forms[key] = form

    def uniCallback(self, button):
        self.clear_widgets()
        # You could introduce a more elegant key
        # handling system here.
        self.add_widget(self.forms[button.text])
于 2013-02-05T15:19:09.287 に答える
5

ウィジェットを切り替える簡単な方法は、1 つをコンテナの高さいっぱいにし、2 つ目の高さを 0 にすることです。切り替える必要がある場合は、高さを入れ替えるだけです。

于 2013-02-05T05:25:25.450 に答える