위젯 명령 add_widget 및 clear_widgets를 사용하는 동안 화면의 왼쪽 하단에 위젯 자체가 매우 작아 보이게되었습니다.위젯을 추가 및 삭제할 때 Kivy 레이아웃 문제가 발생했습니다.
나는 여기 모든 단계를 설명 할 것이므로 나와 함께 견뎌주십시오.
한 위젯에서 다른 위젯으로 전환 할 수있는 시스템이 있습니다. "위젯"은 기본적으로 전체 양식, 기본 캔버스 및 레이아웃입니다.
제가 알고 있듯이, 기본 레이아웃이 있어야합니다. 먼저 루트 요소를 넣은 다음 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")
여기에 진정한 핵심은 Change Widget이 루트 위젯을 제거하고 새 위젯을 추가합니다.
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
상자 레이아웃/인터페이스 관리자를 구성한 다음 'return rootForm'을 생성하는'def build (self)'가 있으면 수업에서 차이가 있습니까? 더 일반적으로 나는'self.__ RootWidget.add_widget (blah)'를 호출하는 대신 BoxLayout에서 UserInterface 서브 클래스를 사용하는 것을 고려해 볼 것이다.'self.add_widget (foo)'를 호출 할 수있다. – Horba
코드의 모든 관련 부분을 생략하고 있는데,'MainMenuWidget'을위한 KV 언어는 당신이 MainWidget 클래스에 대한 py 코드를 제공하지 않지만 그 클래스의'ChangeWidget' 메소드를 호출하고 있음을 암시합니다. 두 번째로 코드가 완전성을 위해 비슷하다해도 코드를 제공해야합니다.py와 kv는 FirstWidget의 Second 위젯 클래스의 일부입니다. 그것이 그렇듯이, 사람들은 대부분 물건이 어떻게 쓰여졌을지 추측해야합니다. == 정보가 충분하지 않습니다. –
@ qua-non 문구 실수가 있었지만 MainMenuWidget은 실제로 FirstWidget이었습니다. 이를 반영하기 위해 코드를 편집했습니다. 두 번째 위젯이 생략되었으므로 두 번째 위젯을 생략하고 게시물의 크기를 줄입니다. – MintyAnt