切换kivy小部件 [英] Switching kivy widgets

查看:114
本文介绍了切换kivy小部件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Kivy python库.

I am using the Kivy python library.

我定义了两个小部件.

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

When the program runs, I run the first widget.

按下该小部件按钮时,我希望它消失并被第二个小部件替换.

When that widgets button is pressed, I want it to dissapear and be replaced with the second widget.

这是两个小部件的.kv

Here is the .kv for the two widgets

#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文件运行该应用程序,并返回第一个小部件

My main python file runs the app, and returns the first widget

#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()

我的第一个小部件具有回调.这就是问题代码所在的地方

My first widget has a callback. This is where the code-in-question belongs

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表单的实例.堆栈保存着上述表单的遍历,每当我们跳转到一个表单时,便将其推入堆栈并渲染"或任何其他形式.

The idea here is to have a user interface manager. This manager doesn't run the UI like a tree, but like a list and stack. The list holds instances of all my UI Forms. The stack holds the traversal of said forms, whenever we jump to a form we push it to the stack and "render" or whatever that one.

我选择了答案,但是在搜索中我还找到了Screen对象: http://kivy.org/docs/api-kivy.uix.screenmanager.html 就个人而言,clear()和add()命令功能更强大,但是如果您感兴趣的话,屏幕上的很多功能都可以从您手中获得.过渡效果也是如此.

I chose my answer, but in my searches I also found the Screen object: http://kivy.org/docs/api-kivy.uix.screenmanager.html Personally, the clear() and add() commands are more powerful, but the screen takes a lot of that out of your hands if you're interested. Transition effects too.

推荐答案

我的建议是拥有一个界面管理器小部件,然后可以为您的UI表单提供各种小部件.

My suggestion is to have an interface manager widget, then you can have various widgets for your UI forms.

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对象上的字典中,并具有一个通用回调,该回调通过键提供另一种形式.

You wouldn't structure it like that of course. You could hold all your forms in a dictionary on the Container object and have a universal callback which provides another form by key.

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

这篇关于切换kivy小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆