【问题标题】:Switching kivy widgets切换 kivy 小部件
【发布时间】:2013-01-19 21:25:36
【问题描述】:

我正在使用 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

我的主要 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()

我的第一个小部件有一个回调。这是有问题的代码所属的地方

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 表单的实例。堆栈保存所述表单的遍历,每当我们跳转到一个表单时,我们将其推送到堆栈并“渲染”或其他任何一个。

编辑: 我选择了我的答案,但在搜索中我还找到了 Screen 对象:http://kivy.org/docs/api-kivy.uix.screenmanager.html 就个人而言,clear() 和 add() 命令更强大,但如果您有兴趣,屏幕会从您手中夺走很多东西。过渡效果也是如此。

【问题讨论】:

    标签: python widget kivy


    【解决方案1】:

    我的建议是有一个界面管理器小部件,然后您可以为您的 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()
    

    当然,你不会那样组织它。您可以将所有表单保存在 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])
    

    【讨论】:

    • clear_widgets() 和 add_widget() 是我缺少的秘密命令,非常感谢。没有多少搜索发现它们,只有“屏幕”对象
    • The docs 非常适合 kivy,可能值得只浏览列出所有不同小部件的右侧。当我第一次找到图书馆时,我试图重新发明很多东西。
    • 你能用 Kivy 语言提供同样的内容吗?将 kivy klanguage 与 python 混合让我感到困惑!
    • @user3620828:可能值得提出另一个问题。请记住提供您迄今为止尝试过的示例。
    【解决方案2】:

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

    【讨论】:

    • 当然是一个有趣的选择!但我计划有很多小部件,如果我想从内存中清除一些小部件,这可能不是最好的主意
    • @MintyAnt,在我自己的应用程序中,我只有 2 个小部件可以切换,这种方法对我来说效果很好。很抱歉,它不适合您的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2015-03-19
    • 2014-05-11
    相关资源
    最近更新 更多