python 中的kivy widget 到kv 文件,如何控制它
Kivy widget in python to kv file, how control it
我有一个简单的测试程序:
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 中创建一些自动内容)或者更好的是在没有 kv 文件的情况下在 python 中创建所有内容?我想做这样的事情:始终显示左侧菜单的应用程序和右侧另一个具有基于屏幕(从菜单中单击)的动态内容的屏幕可能是另一个简单的解决方案。任何人都可以一步一步地解释我吗? :)
属性错误
AttributeError的解决方法,请将test.kv文件中的"id: 'test'"替换为"id: test"。
动态内容
可以根据菜单中的点击显示带有动态内容的屏幕。但记得删除退出屏幕时添加的小部件 (TestScreen/SettingsScreen)。如果您不删除小部件,您将在每次进入屏幕时获得每个添加的小部件的 duplicates/multiples (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'
输出
我有一个简单的测试程序:
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 中创建一些自动内容)或者更好的是在没有 kv 文件的情况下在 python 中创建所有内容?我想做这样的事情:始终显示左侧菜单的应用程序和右侧另一个具有基于屏幕(从菜单中单击)的动态内容的屏幕可能是另一个简单的解决方案。任何人都可以一步一步地解释我吗? :)
属性错误
AttributeError的解决方法,请将test.kv文件中的"id: 'test'"替换为"id: test"。
动态内容
可以根据菜单中的点击显示带有动态内容的屏幕。但记得删除退出屏幕时添加的小部件 (TestScreen/SettingsScreen)。如果您不删除小部件,您将在每次进入屏幕时获得每个添加的小部件的 duplicates/multiples (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'