Kivy виджет в Python для файла KV, как это контролировать

У меня есть простая тестовая программа:

main.py

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen
from kivy.clock import mainthread


class TestScreen(Screen):
@mainthread
def on_pre_enter(self): #Is loaded before kv buttons etc? how make it work
   pass
@mainthread
def on_enter(self): #Load after kv buttons etc?
    button = Button(text="Work?")
    #how now add it to display?
    #how control where display it? on end or begin is just about on_pre and on?

class TestApp(App):
    pass

if __name__ == '__main__':
    TestApp().run()

И файл test.kv

#:import NoTransition kivy.uix.screenmanager.NoTransition 
<TestScreen>:   
    name:'try'
    GridLayout:
        id:'test'
        cols:2
        Button:
            text:'Test'
            on_press:app.root.current='Main'
ScreenManager:
    transition: NoTransition()
    Screen:
        name: 'Main'
        GridLayout:
            cols:1
            Button:
                text:'1'                
            Button:
                text:'2'
            Button:
                text:'Test'
                on_press:root.current='try'
    TestScreen:

Легко ли управлять виджетами kv и python (но я не знаю как, но проще писать виджеты и т. Д. В файле kv, но все же нужно создать некоторые в python для автоматического содержимого) или лучше просто создать все в python без kv файла? Я хочу сделать что-то вроде этого: приложение с всегда отображаемым левым меню, а с правой стороны другой экран с динамическим контентом, основанным на экране (по нажатию из меню), возможно, еще одно простое решение для этого. Кто-нибудь может объяснить мне шаг за шагом?:)

1 ответ

Решение

AttributeError

Решение для AttributeError, пожалуйста, замените "id: 'test'" на "id: test" в файле test.kv.

Динамический контент

Можно отображать экран с динамическим контентом на основе нажатых из меню. Но не забудьте удалить виджеты, которые были добавлены при выходе из экрана (TestScreen/SettingsScreen). Если вы не удалите виджеты, вы получите дубликаты / кратные значения каждого виджета, добавляемые при каждом входе в экран (TestScreen/SettingsScreen). Я рекомендую использовать методы on_pre_enter и on_leave. Пожалуйста, обратитесь к примеру ниже для деталей.

пример

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button


class MyScreenManager(ScreenManager):
    pass


class MenuScreen(Screen):
    pass


class SettingsScreen(Screen):
    def on_pre_enter(self, *args):
        self.ids.test.add_widget(Button(text="Work?"))

    def on_leave(self, *args):
        self.ids.test.remove_widget(self.ids.test.children[0])


class TestApp(App):
    title = "Add & Remove Widgets Dynamically"

    def build(self):
        return MyScreenManager()


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

test.kv

#:kivy 1.10.0
#:import NoTransition kivy.uix.screenmanager.NoTransition

<MyScreenManager>:
    transition: NoTransition()
    MenuScreen:
    SettingsScreen:

<MenuScreen>:
    name: 'menu'
    GridLayout:
        cols: 1
        Button:
            text: '1'
        Button:
            text: '2'
        Button:
            text: 'Test'
            on_press: root.manager.current = 'settings'

<SettingsScreen>:
    name:'settings'
    GridLayout:
        id: test
        cols: 2
        Button:
            text: 'Test'
            on_press: root.manager.current = 'menu'

Выход

Другие вопросы по тегам