2017-12-15 25 views
2

これは私がやろうとしていることです:私のアプリケーションの最初の画面に入るとき、私はそれがいくつかのファイルが特定のディレクトリに存在するかどうかをチェックしたい。それらが存在する場合は、すぐに別の画面に切り替えることができます。on_enterイベントを使用してkivyの画面を変更するにはどうすればよいですか?

私は次のことを試してみた:

main.py

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 
from os import listdir 

class Manager(ScreenManager): 
    pass 

class CreateFileScreen(Screen): 

    def on_enter(self): 
     try: 
      files = listdir("data/files") 
      if "file.dat" in files: 
       self.parent.current = "login" 
      else: 
       pass 
     except FileNotFoundError: 
      pass 

class LoginScreen(Screen): 
    pass 

class ExampleApp(App): 

    def build(self): 
     return Manager() 

if __name__ == "__main__": 
    ExampleApp().run() 

example.kv

#:kivy 1.10.0 

<CreateFileScreen>: 
    BoxLayout: 
     Label: 
      text: "This is Create File Screen" 
      font_size: "30sp" 

<LoginScreen>: 
    BoxLayout: 
     Label: 
      text: "This is Login Screen" 
      font_size: "30sp" 

<Manager>: 

    CreateFileScreen: 
     name: "createfile" 
    LoginScreen: 
     name: "login" 

file.datdata/filesに存在しない場合、私は次のエラーを取得: kivyを.uix.screenmanager.ScreenManagerException:名前が "login"のScreenはありません。

これを修正する方法はありますか?

答えて

1

問題は、画面がその名前になる前にon_enterが実行されることです。
change_screenメソッドを作成し、Clock.schedule_onceで呼び出すことができます。そうすれば、それは次のフレームと呼ばれます。

from kivy.clock import Clock 

class CreateFileScreen(Screen): 

    def on_enter(self): 
     Clock.schedule_once(self.change_screen) 

    def change_screen(self, dt): 
     try: 
      files = listdir("data/files") 
      if "file.dat" in files: 
       self.manager.current = "login" 
      else: 
       pass 
     except Exception as e: 
      print(e) 
+0

ありがとう@ EL3PHANTEN、それは完璧に動作しました! – RafaCRz

+0

@RafaCRzようこそ。 – EL3PHANTEN

関連する問題