Попытка вызвать класс компоновки в макете экрана — киви

#python #kivy

Вопрос:

По сути, у меня есть несколько экранов, управляемых диспетчером экранов (в основном для входа в систему), однако на главном экране он разделен на заголовок, панель навигации и раздел для тела. В разделе «Тело» я хочу иметь возможность вызывать различные макеты, для которых у меня есть классы, и добавлять и удалять их по мере нажатия кнопок на панели навигации.

Я использую kivy для управления всеми аспектами графического интерфейса, но я довольно новичок в этом. На данный момент у меня есть:

 Builder.load_string('''
<MainMenu>:
    FloatLayout:
        canvas.before:
            Color:
                rgba: 0.235, 0.271, 0.302, 1
            Rectangle:
                pos: self.pos
                size: self.size
        BoxLayout:
            orientation: 'vertical'
            rows: 4
            Label:
                size_hint: 1,0.12
                text: "ProductName"
                text_size: self.size
                halign: 'left'
                valign: 'middle'
                font_size: 32
                color: [0.114,0.18,0.224,1]
                
            StackLayout:
                size_hint: 1,0.10
                orientation: 'lr-tb'
                #Purchase Order System
                Button:
                    id: butpos
                    text: "Purchase Order"
                    size_hint: 0.166,1
                    on_press: spaceholder.add_widget(pos)
                #Asset Assignment System
                Button:
                    id: butaas
                    text: "Asset Assignment"
                    size_hint: 0.166,1
                #Review and Revise System
                Button:
                    id: butrrs
                    text: "Review"
                    size_hint: 0.166,1
                #Administrative System
                Button:
                    id: butadm
                    text: "Administration"
                    size_hint: 0.166,1
                #Analytics and Reporting System
                Button:
                    id: butars
                    text: "Analytics"
                    size_hint: 0.166,1
                #Placeholder, possibly documentation
                Button:
                    id: butbut
                    text: "Placeholder"
                    size_hint: 0.166,1
                    
            Label:
                canvas.before:
                    Color:
                        rgba: 0.259, 0.643, 0.937, 1
                    Rectangle:
                        pos: self.pos
                        size: self.size
                size_hint: 1,0.005
                
            Widget:
                id: spaceholder

<PurchaseOrder>
    id: pos
    orientation: 'lr-tb'
    #Asset Details
    Label:
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: "Asset Requirements"
            Label:
                text: "Asset1: "
            TextInput:
                id: as1count
            Label:
                text: "Asset2: "
            TextInput:
                id: as2count
                
''')
 
 class MainMenu(Screen):
    pass
class PurchaseOrder(StackLayout):
    pass

class MainApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainMenu(name='mainmenu'))
        return sm

if __name__ == '__main__':
    MainApp().run()
 

PurchaseOrder-это класс, который я хотел бы добавить или удалить, так же, как классы, которые я намерен настроить для других параметров навигации. Я перепробовал несколько методов, но, думаю, мне чего-то не хватает. Либо меня бросают с «pos», не определенным, либо у «заполнителя» неправильные атрибуты, когда я пробовал разные комбинации.

Ответ №1:

Вы можете заставить это работать, изменив Purchase Order Button :

 on_press: spaceholder.add_widget(Factory.PurchaseOrder())
 

Для этого требуется дополнение к вашему kv импорту Factory :

 #:import Factory kivy.factory.Factory
 

Я бы рекомендовал использовать a Layout для вас spaceholder , чтобы воспользоваться их возможностями определения размеров и позиционирования. Например, использование AnchorLayout автоматически центрирует своего ребенка (но ограничивается одним ребенком). Подобный этому:

         AnchorLayout:
            id: spaceholder