Ищу хороший способ организовать большой проект kivy

#python #oop #kivy

#python #ооп #kivy

Вопрос:

Я новичок в kivy, мне интересно, как использовать какую-то часть приложения в отдельном каталоге. Я хочу легко повторно использовать код и иметь хорошую организацию в проекте. Мне не нравится помещать все в один модуль, как показано во многих руководствах, поэтому, может быть, есть какой-нибудь способ поместить виджет в модули. Например:

 -main:
    -modules/
       -login/
          -main.py
          -main.kv
       -other/
          -ohter.kv
          -other.kv
    -main.py #<- here I want to put widgets from 'login' and 'other'
    -main.kv
 

Ответ №1:

Обычно я помещаю каждый виджет полностью в один файл:

 from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder

Builder.load_string('''
<LoginMain>:
    Label:
        text: 'hi'
    Button:
        text: 'press me'
''')

class LoginMain(BoxLayout):
    ...
 

Затем вам просто нужно сообщить Kivy, где найти каждый виджет, используя Factory . Это проще всего сделать в методе сборки вашего приложения:

 class MyApp(App):
    def build(self):
        Factory.register('LoginMain', module='myapp.modules.login.main')
        Factory.register('Other', module='myapp.modules.other.other')
        return Factory.LoginMain()
 

Комментарии:

1. Я думаю, что удобнее получать доступ к виджетам через обычный импорт python, поскольку это работает (на практике) точно так же, но не использует новый набор инструментов.

2. Мне нравится способ регистрации на заводе, но я думаю, что правильный ответ — Builder, потому что я могу создавать или импортировать kv из любого места, поэтому моя структура может быть организована правильно

3. @inclument Я продемонстрировал Factory.register() использование вместо этого, поскольку это явно делает виджет доступным в kv, а не является побочным эффектом импорта модуля.