Можно ли в kivy иметь структуру на основе папок? - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь сделать приложение. Он работает так, что все мои файлы находятся в одной папке, но он становится очень грязным, и я хотел бы разделить мои файлы на отдельные папки структуры: Start, Prelogin , and FirebaseLoginScreen`. Так возможно ли то, что я пытаюсь сделать в Киви?

Я пробовал #: импортировать имя xyz в качестве указателя, где x - это имя папки, y - это имя kv-файла, а z - это класс в kv-файле, который я хочу импортировать, но я получаю такмного странных ошибок, когда я пытаюсь это сделать. Я в значительной степени добавил каждую папку и все в свою PYTHONPATH, но ничего не работает.

Start содержит main.py и main.kv, где main.kv затем указывает на screenmanger в `` Prelogin. Prelogin содержит несколько файлов, которые состоят из меток и текста о приложении, а затем указывает на менеджер экрана в FirebaseLoginScreen. FirebaseLoginScreen содержит множество файлов для системы входа в систему.

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Да, я дам вам пример с такой структурой папок

-Project\
--main.py
--main.kv
--folder1\
----window1.py
----window1.kv
--folder2\
----window2.py
----window3.py
--folder3\
----window4.py
----window4.kv

folder \ window1.py будет выглядеть как

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

kivy.require("1.11.1")
# Builder is neccesary to work with multiple files
Builder.load_file("folder1/window1.kv")

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

class login_window(App):        
    def build(self):            
        return login() 

if __name__=="__main__":    
    aplicacion=login_window()
    aplicacion.run()

folder1 \ window1.kv указывать необязательно.

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

# Import files like
from folder1.window1 import login_window
from folder2.window2 import example2_window
from folder3.window3 import example3_window

class manager(BoxLayout):

    # Add screens to main
    login_widget=login_window()
    example2_widget=example2_window()
    example3_widget=example3_window()        

    def __init__(self, **kwargs):            
        super().__init__(**kwargs)

        # Check kv file to understand these lines
        self.ids.screen_login.add_widget(self.login_widget)
        self.ids.screen_example2.add_widget(self.example2_widget)
        self.ids.screen_example3.add_widget(self.example3_widget)            

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

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

main.kv будет похоже на (в котором есть ScreenManager!)

#:kivy 1.11.1
<manager>:
    id: main_window

    ScreenManager:
        id: scrn_mngr_main

        Screen:
            id: screen_login
            name:'screen_login'
        Screen:
            id: screen_example2
            name:'screen_example2'
        Screen:
            id: screen_example3
            name:'screen_example3'       

Теперь для управления потоком программы вам нужно добавить эти строки в window1.py

        self.parent.current='screen_login'
        self.parent.current='screen_example2'
        self.parent.current='screen_example3'

Адаптировано из 3 видеоуроков на Youtube

0 голосов
/ 03 ноября 2019

Ответ прост: «да», нет ничего особенного в разборе импорта на языке kv или в Python при использовании Kivy. Если у вас возникли проблемы, это потому, что вы пытаетесь сделать это неправильно или недостаточно, что невозможно отладить из объема предоставленной вами информации.

Если вы хотите следовать ейвверх, опубликуйте другой вопрос с примером, который, по вашему мнению, должен работать, учитывая ваши манипуляции с PYTHONPATH.

...