2017-12-15 1 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"인 화면이 없습니다.

해결 방법에 대한 의견이 있으십니까?

답변

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

관련 문제