Windows as packages in Folders but screen is black

13 views
Skip to first unread message

Julian Stiebler

unread,
Nov 1, 2020, 6:02:03 PM11/1/20
to Kivy users support
Hello! So i basically want to have a project structure where i have every window in a seperatore folder with its own .kv file. For example:
root\
    main.py
    main.kv
    signin\
        signin.py
       signin.kv
    settings\
        settings.py
        settings.kv

-------------
I have following code right now which atleast makes a working application with no error, but doesnt show any screen.

main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang.builder import Builder
from kivy.uix.widget import Widget
from kivy.clock import mainthread

from signin.signin import SigninWindow
from settings.settings import SettingsWindow

class manager(BoxLayout):

    widget_signin = SigninWindow()
   widget_settings = SettingsWindow()

    @mainthread
   def on_enter(self, **kwargs):            
       super().__init__(**kwargs)

        self.ids.screen_signin.add_widget(self.widget_signin)
       self.ids.screen_settings.add_widget(self.widget_signin)
       

class main(App):
   def build(self):
       return manager()

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

main.kv
<manager>:
   id: main_window

    ScreenManager:
       id: scrn_mngr_main

        Screen:
           id: screen_signin
           name: "screen_signin"
       Screen:
           id: screen_settings
           name: "screen_settings"

signin.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang.builder import Builder
from kivy.uix.widget import Widget

Builder.load_file("signin/signin.kv")

class Signin(BoxLayout):    
   def __init__(self, **kwargs):
       super().__init__(**kwargs)

class SigninWindow(App):    
    def build(self):
       return Signin()

if __name__=="__main__":    
   sw=SigninWindow()
   sw.run()

signin.kv
<Signin>:
   canvas.before:
       Color:
           rgba: (1,1,1, 1)
       Rectangle:
           size: self.size
           pos: self.pos
   Button:
       text: "Hello"

settings.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang.builder import Builder
from kivy.uix.widget import Widget

class Settings(BoxLayout):    
   def __init__(self, **kwargs):
       super().__init__(**kwargs)


class SettingsWindow(App):      
   def build(self):            
       return Settings()

if __name__=="__main__":    
   sw=SettingsWindow()
   sw.run()

---
How do i decide which screen is current parent-screen? I think thats what im missing here but trying to place a self.parent.current = "screen_login" or something didnt work at all.

Elliot Garbus

unread,
Nov 1, 2020, 7:21:06 PM11/1/20
to kivy-...@googlegroups.com

A kivy program only has one App instance, and only on Window.  There can be multiple screens.  A screen can be all of a window or just a part of a window.

Here are some changes so you can see your Signin Screen.  You can make similar changes to get the settings screen working.

 

Main.py

 

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
import signin.signin
# from settings.settings import SettingsWindow


class manager(BoxLayout):
   
pass
   
# widget_signin = SigninWindow()        This is what you are doing in KV
    # widget_settings = SettingsWindow()
    #
    # @mainthread
    # def on_enter(self, **kwargs):         on_enter is a screen event, not a BoxLayout event
    #     super().__init__(**kwargs)
    #
    #     self.ids.screen_signin.add_widget(self.widget_signin)
    #     self.ids.screen_settings.add_widget(self.widget_signin)


class main(App):
   
def build(self):
       
return manager()


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

Main.kv

 
<manager>:
   
id: main_window

   
ScreenManager:
       
id
: scrn_mngr_main

        Signin:                        # made Signin a screen in signin.py
           
id: screen_signin
            name:
"screen_signin"
#        Screen:                       # you can do something similar for settings…
#            id: screen_settings
#            name: "screen_settings"

 

 

Signin.py

from kivy.app import App
# from kivy.uix.boxlayout import BoxLayout
from kivy.lang.builder import Builder
#from kivy.uix.widget import Widget
from kivy.uix.screenmanager import Screen

Builder.load_file(
"signin/signin.kv")

class Signin(Screen):
   
def __init__(self, **kwargs):
       
super().__init__(**kwargs)

if __name__=="__main__"# move app below the if, and you can still use this file for a standalone test.
   
class SigninWindow(App):
       
def build(self):
           
return Signin()


    sw=SigninWindow()
    sw.run()

 

The file signin.kv unchanged.

--
You received this message because you are subscribed to the Google Groups "Kivy users support" group.
To unsubscribe from this group and stop receiving emails from it, send an email to kivy-users+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/kivy-users/088735eb-1d87-40fc-81d5-d5ba2190e057o%40googlegroups.com.

 

Reply all
Reply to author
Forward
0 new messages