2013-10-21 10 views
7

ボタンにバインドされたon_pressイベントを使用して、KVファイル/ KV言語を使用せずに画面を変更する方法を知りたいと思います。Kivy:on_pressイベントで画面マネージャーの画面を変更する

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

例:

screenmanager.current = 'screen2'

しかし、私はボタンを使用して同じことを達成する方法を見つけ出すカント:私も使用して、メインのpythonファイルに画面を変更することができます

on_press: root.manager.current = 'screen2'

。これを達成する

答えて

6

一つの簡単な方法は、あなた自身のボタンサブクラスを定義することです:

class ScreenButton(Button): 
    screenmanager = ObjectProperty() 
    def on_press(self, *args): 
     super(ScreenButton, self).on_press(*args) 
     self.screenmanager.current = 'whatever' 

on_press方法は、ボタンが押されたときに自動的に呼び出されるので、ScreenManagerでのcurrentプロパティが変更されます。

sm = ScreenManager() 

sc1 = Screen(name='firstscreen') 
sc1.add_widget(ScreenButton(screenmanager=sm)) 

sc2 = Screen(name='whatever') 
sc2.add_widget(Label(text='another screen')) 

sm.add_widget(sc1) 
sm.add_widget(sc2) 

必要に応じて画面を切り替える必要があるボタンをクリック:

次に、あなたのようなコードに何かを持つことができます。

もう1つの方法(おそらくkv言語が実際にどのようにしているか)は、手動でbindメソッドを使用することです。

def switching_function(*args): 
    some_screen_manager.current = 'whatever' 

some_button.bind(on_press=switching_function) 

これはsome_buttonが押されるたびにswitching_functionが呼び出されることを意味します。もちろん、ここでは関数を定義する方法とタイミングについて柔軟性があります。たとえば、スクリーンマネージャを関数の最初の引数として渡すようなもっと一般的な方法があります。

私はこのコードをテストしなかったし、完全なアプリではありませんが、うまくいけば意味がはっきりしています。いずれの方法でもうまくいくはずですが、最も賢明な方法を選択できます。私は後でより完全な例を作るかもしれない。

+0

感謝。サブクラスのソリューションを使用すると、私がやろうとしていたことを達成するのに役立ちました。再度、感謝します。 – Derick

2

別の解決策は、当然のscreen_manager.current

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

用セッター関数への参照を取得するには、のEventDispatcherのsetter方法を使用していた、それはKVが頻繁にクリーンである理由です、非常にセクシーではありませんこれらのことを解決することはできますが、うまくいくはずです。

ps:あなたがそれについて知らない場合、partialfunctoolsモジュールから来ており、これらの種類のコールバックをプリロードされたパラメータで構築すると便利なことがよくあります。

+0

私はかなりkivyに新しいので、sexinessは私のリストでは高くありません。これは私のために非常に便利になるでしょう。ありがとうございました。 – Derick

5

二つの画面、Pythonで行われていないKVファイルすべてと作業例:あなたの答えのための

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

これはKivy 1.9.2では動作しないという特別な理由はありますか? –

関連する問題