2013-02-06 5 views
-1

위젯 명령 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가 완벽 해 보입니다. 이 AddedWidgetMessedUp

편집 : 당분간 , 나는 화면 관리자 사용하여 전환 : 위의 하나 개의 파일에 코드를 결합 http://kivy.org/docs/api-kivy.uix.screenmanager.html

+1

상자 레이아웃/인터페이스 관리자를 구성한 다음 'return rootForm'을 생성하는'def build (self)'가 있으면 수업에서 차이가 있습니까? 더 일반적으로 나는'self.__ RootWidget.add_widget (blah)'를 호출하는 대신 BoxLayout에서 UserInterface 서브 클래스를 사용하는 것을 고려해 볼 것이다.'self.add_widget (foo)'를 호출 할 수있다. – Horba

+0

코드의 모든 관련 부분을 생략하고 있는데,'MainMenuWidget'을위한 KV 언어는 당신이 MainWidget 클래스에 대한 py 코드를 제공하지 않지만 그 클래스의'ChangeWidget' 메소드를 호출하고 있음을 암시합니다. 두 번째로 코드가 완전성을 위해 비슷하다해도 코드를 제공해야합니다.py와 kv는 FirstWidget의 Second 위젯 클래스의 일부입니다. 그것이 그렇듯이, 사람들은 대부분 물건이 어떻게 쓰여졌을지 추측해야합니다. == 정보가 충분하지 않습니다. –

+0

@ qua-non 문구 실수가 있었지만 MainMenuWidget은 실제로 FirstWidget이었습니다. 이를 반영하기 위해 코드를 편집했습니다. 두 번째 위젯이 생략되었으므로 두 번째 위젯을 생략하고 게시물의 크기를 줄입니다. – MintyAnt

답변

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

모든 것이 정상적으로 동작합니다. 전체 코드를 제공하지 않았기 때문에 어디서 잘못되었는지 확인하고 설명을하기가 어렵습니다. 내가 게시 한 코드와 자신의 코드 간의 차이점을보고 다르게하고 있는지 확인하십시오.

희망이 도움이됩니다.

관련 문제