Переключение виджетов 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

Мой основной файл 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.

Идея здесь состоит в том, чтобы иметь менеджер пользовательского интерфейса. Этот менеджер управляет пользовательским интерфейсом не как дерево, а как список и стек. Список содержит экземпляры всех моих форм пользовательского интерфейса. Стек содержит обход указанных форм, всякий раз, когда мы переходим к форме, мы помещаем ее в стек и «рендерим» или что-то еще.

EDIT: я выбрал свой ответ, но в своих поисках я также нашел объект Screen: http://kivy.org/docs/api-kivy.uix.screenmanager.html Команды clear() и add() более эффективны, но если вы заинтересованы, то многое зависит от экрана. Эффекты перехода тоже.


person MintyAnt    schedule 05.02.2013    source источник


Ответы (2)


Мое предложение состоит в том, чтобы иметь виджет менеджера интерфейса, тогда у вас могут быть различные виджеты для ваших форм пользовательского интерфейса.

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])
person Adam    schedule 05.02.2013
comment
clear_widgets() и add_widget() были секретными командами, которых мне не хватало, большое спасибо. Никакой объем поиска не обнаружил их, только экранный объект - person MintyAnt; 05.02.2013
comment
Документация отлично подходит для kivy, и, вероятно, стоит просто просмотреть справа, где перечислены все различные виджеты. Есть множество вещей, которые я пытался заново изобрести, когда впервые нашел библиотеку. - person Adam; 05.02.2013
comment
Можете ли вы дать то же самое на языке Kivy. Смешивание kivy klanguage с python сбивает меня с толку! - person Wally; 14.08.2014
comment
@user3620828: user3620828: Наверное, стоит поднять еще один вопрос. Не забудьте привести примеры того, что вы уже пробовали. - person Adam; 14.08.2014

Простой способ переключения виджетов состоит в том, чтобы один из них был на всю высоту своего контейнера, а второй имел нулевую высоту. Когда вам нужно переключиться, просто поменяйте местами высоты.

person Mark Ransom    schedule 05.02.2013
comment
Конечно интересный вариант! Но я планирую иметь много виджетов, и если я хочу очистить память от некоторых, это может быть не лучшей идеей. - person MintyAnt; 05.02.2013
comment
@MintyAnt, в моем собственном приложении у меня есть только 2 виджета для переключения между ними, и этот метод хорошо работает для меня. Мне жаль, что это не соответствует вашему варианту использования. - person Mark Ransom; 05.02.2013