2017-07-01 52 views
1

on_releaseを使用して.kvファイル内の画面を切り替えるのは比較的簡単だと思います。しかし、私のボタンを.pyファイルで作成したままにしたいので、このメソッドを使いたくありません。私は、14番目のボタンが押されたときに発生する機能を追加するために以下を行っています。プログラムでボタンが押されると、何も起こりません。 sm.currentへの画面の他の名前を試してエラーを投げた: "kivy.uix.screenmanager.ScreenManagerException:14番目のボタンが押されたときに名前が" InputScreen "の画面がありません。(Kivy Python)ボタンを押して画面を切り替える.pyファイル内

# Kivy Formatting 
kv_text='''\ 

<MyScreenManager>: 
    LandingScreen: 
    InputScreen: 

<[email protected]>: 
    name: 'input_sc' 
    AnchorLayout: 
     id: anchor_1 

<[email protected]>: 
    name: 'landing_sc' 
    GridLayout: 
     id: grid_1 
     cols: 5 
     height: 480 
     width: 800 
     spacing: 25, 20 
     padding: 25,25 

''' 
# Screen Manager 
class MyScreenManager(ScreenManager): 
    pass 

# Main screen with button layout 
class LandingScreen(Screen): 
    def __init__(self, **kwargs): 
     super(LandingScreen, self).__init__(**kwargs) 
     self.buttons = [] # add references to all buttons here 
     Clock.schedule_once(self._finish_init) 

    # IDs have to be used here because they cannot be applied until widget initialized 
    def _finish_init(self, dt): 
     self.ids.grid_1.cols = 5 

     # Loop to make 15 different buttons on screen 
     for x in range(15): 
      self.buttons.append(Button(text='button {}'.format(x))) 
      self.ids.grid_1.add_widget(self.buttons[x]) 
      self.buttons[x].background_normal = 'YOUTUBE.png' 

     def SwitchScreen(self,*args): 
      sm.current = 'input_sc' 

     sm = ScreenManager() 
     sm.add_widget(InputScreen(name='input_sc')) 
     sm.add_widget(LandingScreen(name='landing')) 
     self.buttons[14].bind(on_release=SwitchScreen) 


# Input screen 
class InputScreen(Screen): 
    pass 

class MySubApp(App): 
    def build(self): 
     return MyScreenManager() 

def main(): 
    Builder.load_string(kv_text) 
    app = MySubApp() 
    app.run() 

if __name__ == '__main__': 
    main() 

誰かが私の現在のロジックの穴を理解するのを助けることができたら、私はそれを非常に高く評価します。ありがとう。

答えて

1

各画面にはmanagerプロパティがあり、ScreenManagerのインスタンスが使用されます。あなたが唯一のScreemManagerインスタンスを参照し、そのcurrentメソッドを使用するためにそれを使用する必要があります別の偉大な答えを

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.button import Button 
from kivy.clock import Clock 


# Kivy Formatting 
kv_text='''\ 

<MyScreenManager>: 
    LandingScreen: 
    InputScreen: 

<[email protected]>: 
    name: 'input_sc' 
    AnchorLayout: 
     id: anchor_1 
     Button: 
      text: 'Hello' 

<[email protected]>: 
    name: 'landing_sc' 
    GridLayout: 
     id: grid_1 
     cols: 5 
     height: 480 
     width: 800 
     spacing: 25, 20 
     padding: 25,25 

''' 
# Screen Manager 
class MyScreenManager(ScreenManager): 
    pass 

# Main screen with button layout 
class LandingScreen(Screen): 
    def __init__(self, **kwargs): 
     super(LandingScreen, self).__init__(**kwargs) 
     self.buttons = [] # add references to all buttons here 
     Clock.schedule_once(self._finish_init) 

    # IDs have to be used here because they cannot be applied until widget initialized 
    def _finish_init(self, dt): 
     self.ids.grid_1.cols = 5 

     # Loop to make 15 different buttons on screen 
     for x in range(15): 
      self.buttons.append(Button(text='button {}'.format(x))) 
      self.ids.grid_1.add_widget(self.buttons[x]) 
      self.buttons[x].background_normal = 'YOUTUBE.png' 

     self.buttons[14].bind(on_release=self.switch_screen) 

    def switch_screen(self, *args): 
     self.manager.current = 'input_sc' 

# Input screen 
class InputScreen(Screen): 
    pass 

class MySubApp(App): 
    def build(self): 
     return MyScreenManager() 

def main(): 
    Builder.load_string(kv_text) 
    app = MySubApp() 
    app.run() 

if __name__ == '__main__': 
    main() 
+0

おかげで、私はそのドキュメントの今参照してください。私は一般的にプログラミングに慣れていないので、私を許してください。しかし、Kivyのようなシステムですべてのdescrepenciesを学ぶ最良の方法は何ですか?公式以外の文書はありますか?あるいは経験を通して純粋に知っていることを学んだことがありますか?ありがとう – John

+0

私がKivyを使い始めたとき、公式のドキュメント(それは比較的新しいフレームです)を除いて、情報はほとんどありませんでした。最初のソースは常に公式のドキュメンテーションです([Kivy Tutorials](https://kivy.org/docs/tutorials-index.html)がこれに適しています)、これ以外にもチュートリアル、YouTubeでのビデオチュートリアル、Kivy Googleグループ、もちろん[so]です心配する必要はありません。コードを学習する唯一の真の方法は、練習し、間違いを犯し、それらから学ぶことです。ところで、それは決して終わらない学習プロセスです:) @Austin – FJSevilla

関連する問題