3

ボタンをクリックすると画面を切り替えるメインメニューを作ろうとしていますが、ボタンからマネージャーを参照する方法がわかりません。

メインメニューページ(kvファイル)のセットアップがあります:

<MainMenu>:  #AnchorLayout
     BoxLayout:
         Button:
             text: "button 1"
         Button:
             text: "change screen"
             on_release: root.manager.current = "OtherPage"

<MainWidget>:
    screen_manger: screen_manager
    ScreenManger:
        id: screen_manger
        Screen:
            name: "MainMenu"
            MainMenu
        Screen:
            name: "OtherPage"
            OtherPage    #this is defined in the kv file, just lazy to type it.

Button をクリックすると、次のChange Screenようになります。

AttributeError: 'MainMenu' object has no attribute 'manager'

正直なところ、これは私を驚かせません。BoxLayoutすべてのレイアウトを Python コードで記述し、またはウィジェットにスクリーン マネージャーへの参照を追加することで、これを回避できるとMainMenu思いますが、kv ファイルでこれを行う方法がわかりません。

4

1 に答える 1

3

問題をよりよく理解した後、回答をやり直す:

MainWidget インスタンスは screen_manager 参照を認識せず、渡されません (そして、そのルールrootでは MainWidget インスタンスではなく MainWidget インスタンスを参照しますScreenManager

インスタンスmanager: screen_managerの宣言 (15 行目) の下に置き、 ObjectProperty を MainWidget の python 宣言に追加すると、バインディングが機能します。MainWidgetmanager

パイソン:

class MainWidget(Widget):
    manager = ObjectProperty(None)

kv:

<MainWidget>:
    screen_manger: screen_manager
    ScreenManger:
        id: screen_manger
        Screen:
            name: "MainMenu"
            MainMenu:
                manager: screen_manager
        Screen:
            name: "OtherPage"

その後、必要に応じて動作するはずです。

編集: また、qua-non によるこの wiki エントリが役立つかもしれませんhttps://github.com/kivy/kivy/wiki/Linking-ScreenManager-to-a-different-Widget

于 2013-03-28T14:19:06.753 に答える