問題描述
我正在使用 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 表單的實例.堆棧保存所述表單的遍歷,每當我們跳轉到一個表單時,我們將其推送到堆棧并渲染"或其他任何一個.
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 小部件的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!