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'