10

KV ファイル/KV 言語を使用せずに、ボタンにバインドされた on_press イベントを使用して画面を変更する方法を知りたいです。

Kivy のドキュメントを読みましたが、KV ファイルを使用して解決策を見つけることしかできませんでした。

例:

on_press: root.manager.current = 'screen2'

次を使用して、メインの python ファイルの画面を変更することもできます。

screenmanager.current = 'screen2'

しかし、ボタンを使用して同じことを達成する方法がわかりません。

4

3 に答える 3

11

2 つの画面があり、kv ファイルがなく、すべてが Python で行われた作業例:

import kivy
kivy.require('1.8.0')

from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager 
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.properties import ObjectProperty

class ScreenOne(Screen):

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

        my_box1 = BoxLayout(orientation='vertical')
        my_label1 = Label(text="BlaBlaBla on screen 1", font_size='24dp')
        my_button1 = Button(text="Go to screen 2",size_hint_y=None, size_y=100)
        my_button1.bind(on_press=self.changer)
        my_box1.add_widget(my_label1)
        my_box1.add_widget(my_button1)
        self.add_widget(my_box1)

    def changer(self,*args):
        self.manager.current = 'screen2'

class ScreenTwo(Screen):

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

        my_box1 = BoxLayout(orientation='vertical')
        my_label1 = Label(text="BlaBlaBla on screen 2",font_size='24dp')
        my_button1 = Button(text="Go to screen 1",size_hint_y=None, size_y=100)
        my_button1.bind(on_press=self.changer)
        my_box1.add_widget(my_label1)
        my_box1.add_widget(my_button1)
        self.add_widget(my_box1)

    def changer(self,*args):
        self.manager.current = 'screen1'

class TestApp(App):

        def build(self):
            my_screenmanager = ScreenManager()
            screen1 = ScreenOne(name='screen1')
            screen2 = ScreenTwo(name='screen2')
            my_screenmanager.add_widget(screen1)
            my_screenmanager.add_widget(screen2)
            return my_screenmanager

if __name__ == '__main__':
    TestApp().run()
于 2015-02-12T16:34:45.917 に答える
3

別の解決策は、setterEventDispatcher のメソッドを使用して、screen_manager.current のセッター関数への参照を取得することでした。

button.bind(on_press=partial(sm.setter('current'), (sm, 'whatever'))

もちろん、それはあまりセクシーではありません。そのため、kv はこれらのことに対するよりクリーンなソリューションであることがよくありますが、うまくいくはずです。

ps: ご存じない場合、これpartialfunctoolsモジュールからのものであり、プリロードされたパラメーターを使用してこの種のコールバックを作成すると便利なことがよくあります。

于 2013-10-22T11:15:10.637 に答える