Python 切换kivy小部件

Python 切换kivy小部件,python,widget,kivy,Python,Widget,Kivy,我正在使用Kivy python库 我定义了两个小部件 当程序运行时,我运行第一个小部件 当按下widgets按钮时,我希望它消失并被第二个widget替换 这是两个小部件的.kv #uitest.kv <TestForm>: canvas: Rectangle: pos: self.center_x, 0 size: 10, self.height BoxLayout: size: r

我正在使用Kivy python库

我定义了两个小部件

当程序运行时,我运行第一个小部件

当按下widgets按钮时,我希望它消失并被第二个widget替换

这是两个小部件的.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
我的第一个小部件有一个回调。这就是问题代码所属的位置

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.
这里的想法是有一个用户界面管理器。此管理器不像树那样运行UI,而是像列表和堆栈一样运行UI。该列表包含我的所有UI表单的实例。堆栈保存所述形式的遍历,每当我们跳转到一个形式时,我们将它推到堆栈并“渲染”或其他任何形式

编辑: 我选择了我的答案,但在搜索中我也找到了屏幕对象:
就个人而言,clear()和add()命令更强大,但如果您感兴趣,屏幕会让您失去很多功能。转换效果也是一样。

切换窗口小部件的一个简单方法是让一个窗口小部件的高度为其容器的全高,让第二个窗口小部件的高度为零。当您需要切换时,只需交换高度。

我的建议是使用一个interface manager小部件,然后您可以为您的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()
当然,你不会这样组织它。您可以将所有表单保存在容器对象上的字典中,并拥有一个通用回调函数,该函数通过键提供另一个表单

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])

当然是一个有趣的选择!但是我计划有很多小部件,如果我想从内存中清除一些,这可能不是最好的idea@MintyAnt,在我自己的应用程序中,我只有两个小部件可以切换,这个方法对我来说很好。很抱歉,它不适合您的用例。clear_widgets()和add_widget()是我缺少的秘密命令,非常感谢。没有大量的搜索找到它们,只有“屏幕”对象对kivy来说是非常好的,可能值得在右边浏览,那里列出了所有不同的小部件。当我第一次发现这个图书馆的时候,有很多东西我都想重新发明。你能用Kivy语言给我同样的东西吗。将kivy klanguage与python混合在一起让我感到困惑@用户3620828:可能值得提出另一个问题。请记住提供您迄今为止尝试过的示例。
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])