在使用小部件命令add_widget和clear_widgets时,我的小部件看起来很好,它们看起来很好,在屏幕的左下角非常小。
我将在这里解释我的所有步骤,所以请耐心等待。
我有一个系统可以从一个Widget切换到另一个Widget。 “小部件”基本上是整个表单,基本画布和布局。
据我了解,这些必须有一个基本布局。所以首先我将一个根元素放入其中,然后用我的根管理我的UI管理器。
class MyApp(App):
rootForm = BoxLayout()
ui = UserInterface(rootForm)
return rootForm
我的UI处理窗口小部件的切换。它在创建时将所有小部件保存在列表中。它还为用户界面提供了一个引用,用于回调目的。
class UserInterface():
__WidgetDictionary = {}
__RootWidget = None
def __init__(self, inRootWidget):
self.__RootWidget = inRootWidget # Keep track of our root
# Generate two forms to be swapped in/out
self.__WidgetDictionary["form1"] = FirstWidget()
self.__WidgetDictionary["form1"].SetUIreference(self)
self.__WidgetDictionary["form2"] = SecondWidget()
self.__WidgetDictionary["form2"].SetUIReference(self)
self.ChangeWidget("MainMenu")
ChangeWidget,真正的核心,清理根小部件并添加一个新小部件。
def ChangeWidget(self, inWidgetName):
self.__RootWidget.clear_widgets() # Clear out the widgets
self.__RootWidget.add_widget( self.__WidgetDictionary[inWidgetName] ) # Add our new widget
这显示我的表格很好,有一个按钮。单击该按钮时,它附加了一个回调函数,将表单从Form1更改为Form2。
#FirstWidget.py
class FirstWidget(BoxLayout):
__UserInterfaceReference = None
def SetUIReference(self, inUserInterface):
self.__UserInterfaceReference = inUserInterface
def ChangeWidget(self, inWidgetName):
self.__UserInterfaceReference.ChangeWidget(inWidgetName)
相应的.kv文件
#FirstWidget.kv
<FirstWidget>:
BoxLayout:
orientation: 'vertical'
padding: 50
spacing: 10
Button:
on_release: root.ChangeWidget('form2')
单击按钮后,将发生错误。 Form1和Form2几乎相同。 Form2比form2有一个butotn。 Form1和Form2之前的代码完全相同,除了类名。 同样,在它自己的环境中,form2看起来很完美。
以下是该错误的屏幕截图:
编辑: 目前,我转而使用屏幕管理器:http://kivy.org/docs/api-kivy.uix.screenmanager.html
答案 0 :(得分:1)
将上面的代码合并到一个文件中如果我运行以下代码::
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
Builder.load_string(
'''
<FirstWidget>:
BoxLayout:
orientation: 'vertical'
padding: 50
spacing: 10
Button:
text: 'change to form 2'
on_release: root.ChangeWidget('form2')
<SecondWidget>:
TextInput:
BubbleButton:
text: 'change to form 1'
on_release: root.ChangeWidget('form1')
''')
class UserInterface():
__WidgetDictionary = {}
__RootWidget = None
def __init__(self, inRootWidget):
self.__RootWidget = inRootWidget # Keep track of our root
# Generate two forms to be swapped in/out
self.__WidgetDictionary["form1"] = FirstWidget()
self.__WidgetDictionary["form1"].SetUIReference(self)
self.__WidgetDictionary["form2"] = SecondWidget()
self.__WidgetDictionary["form2"].SetUIReference(self)
self.ChangeWidget("form1")
def ChangeWidget(self, inWidgetName):
# Clear out the widgets
self.__RootWidget.clear_widgets()
# Add our new widget
self.__RootWidget.add_widget(self.__WidgetDictionary[inWidgetName])
class FirstWidget(BoxLayout):
__UserInterfaceReference = None
def SetUIReference(self, inUserInterface):
self.__UserInterfaceReference = inUserInterface
def ChangeWidget(self, inWidgetName):
self.__UserInterfaceReference.ChangeWidget(inWidgetName)
class SecondWidget(BoxLayout):
__UserInterfaceReference = None
def SetUIReference(self, inUserInterface):
self.__UserInterfaceReference = inUserInterface
def ChangeWidget(self, inWidgetName):
self.__UserInterfaceReference.ChangeWidget(inWidgetName)
class MyApp(App):
def build(self):
rootForm = BoxLayout()
ui = UserInterface(rootForm)
return rootForm
if __name__ == '__main__':
MyApp().run()
一切都表现得像它应该的那样。由于您没有提供完整的代码,因此很难确定出错的地方并提供解释。尝试查看我发布的代码与您自己的代码之间的差异,以确定您在做什么不同。
希望这有帮助。