#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