Min*_*Ant 8 python widget kivy
我正在使用Kivy python库.
我定义了两个小部件.
程序运行时,我运行第一个小部件.
当按下该窗口小部件按钮时,我希望它消失并被第二个窗口小部件替换.
这是两个小部件的.kv
#uitest.kv
<TestForm>:
canvas:
Rectangle:
pos: self.center_x, 0
size: 10, self.height
BoxLayout:
size: root.size
padding: 40
Button:
text: 'Hello'
on_release: root.testCallback()
<TestForm2>:
canvas:
Rectangle:
pos: self.center_x, 0
size: self.height, 10
Run Code Online (Sandbox Code Playgroud)
我的主python文件运行应用程序,并返回第一个小部件
#main.py
from testform import TestForm
from kivy.app import App
class UITestApp(App):
def build(self):
return TestForm()
# Main launching point
if __name__ in ('__main__', '__android__'):
UITestApp().run()
Run Code Online (Sandbox Code Playgroud)
我的第一个小部件有一个回调.这是代码所属的地方
from testform2 import TestForm2
from kivy.uix.widget import Widget
class TestForm(Widget):
def testCallback(self):
TestForm2() # Code in question goes here. @TODO replace this widget with TestForm2 widget.
Run Code Online (Sandbox Code Playgroud)
这里的想法是拥有一个用户界面管理器.此管理器不像树一样运行UI,而是像列表和堆栈一样运行UI.该列表包含我所有UI表单的实例.堆栈保存所述表单的遍历,每当我们跳转到一个表单时,我们将它推送到堆栈并"渲染"或任何那个.
编辑:我选择了我的答案,但在我的搜索中我也找到了Screen对象:http://kivy.org/docs/api-kivy.uix.screenmanager.html就 个人而言,clear()和add()命令更多功能强大,但是如果你感兴趣的话,屏幕会占用很多.过渡效果也是如此
我的建议是拥有一个界面管理器小部件,然后你可以为你的UI表单提供各种小部件.
import kivy
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
class InterfaceManager(BoxLayout):
def __init__(self, **kwargs):
super(InterfaceManager, self).__init__(**kwargs)
self.first = Button(text="First")
self.first.bind(on_press=self.show_second)
self.second = Button(text="Second")
self.second.bind(on_press=self.show_final)
self.final = Label(text="Hello World")
self.add_widget(self.first)
def show_second(self, button):
self.clear_widgets()
self.add_widget(self.second)
def show_final(self, button):
self.clear_widgets()
self.add_widget(self.final)
class MyApp(App):
def build(self):
return InterfaceManager(orientation='vertical')
if __name__ == '__main__':
MyApp().run()
Run Code Online (Sandbox Code Playgroud)
当然,你不会那样构造它.您可以将所有表单保存在Container对象的字典中,并具有通用回调,该回调按键提供另一个表单.
class InterfaceManager(BoxLayout):
def __init__(self, **kwargs):
super(InterfaceManager, self).__init__(**kwargs)
self.forms = {}
def add_form(self, key, form):
self.forms[key] = form
def uniCallback(self, button):
self.clear_widgets()
# You could introduce a more elegant key
# handling system here.
self.add_widget(self.forms[button.text])
Run Code Online (Sandbox Code Playgroud)