Вопрос Kivy Factory
что такое концепция фабрики в kivy
Ответ
Когда ключевое слово Factory
используется где-либо (например,Файл kv или скрипт Python) в вашем проекте автоматически зарегистрирует любой класс или модуль и создаст для них экземпляр.
Пример
В следующем примере показано использование Factory
в kv файл для регистрации и создания Popup
виджета, Hello .В скрипте Python нет определения класса Hello и определения метода debit()
.
main.py
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
Builder.load_string("""
#:import Factory kivy.factory.Factory
<Debit>:
Button:
text : 'popup'
size_hint : 0.2,0.2
on_press : Factory.Hello().open()
<Hello@Popup>:
title: 'Popup2'
auto_dismiss: False
BoxLayout:
orientation: 'vertical'
Label:
text: 'Hello Kivy'
Button:
text : 'Close Popup'
size_hint : 1,0.2
on_press : root.dismiss()
""")
class Debit(Widget):
pass
class MyPracticeApp(App):
def build(self):
return Debit()
if __name__ == "__main__":
MyPracticeApp().run()
Вопрос 1
Есть всплывающее окно кнопки, и когда я нажимаю эту кнопку, я вызываю функцию debit ().Внутри функции дебета я вызываю Hello (), но я не могу получить что-либо из этого класса.Что я делаю не так?
Пояснение
Вторая кнопка не отображается, поскольку в приложении не было инструкций о том, что делать с созданным объектом, Hello
, который содержитдочерний виджет, Button
.
Решение
Одним из решений является добавление нового объекта с использованием функции add_widget()
.
Snippets - Py
def debit(self):
return self.add_widget(Hello())
Вопрос 2
Всякий раз, когда я нажимаю на кнопку, я хочу новый экран, но без экранной навигации.Как мне это сделать?
Решение
Вы можете использовать виджет Kivy Popup
.
Пример
main.py
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.widget import Widget
from kivy.lang import Builder
Builder.load_string("""
<Debit>:
Button:
text : 'popup'
size_hint : 0.2,0.2
on_press : root.debit()
<Hello>:
title: 'Hello Popup2'
auto_dismiss: False
Button:
text : 'Close Popup'
size_hint : 0.2,0.2
on_press : root.dismiss()
""")
class Debit(Widget):
def debit(self):
return Hello().open()
class Hello(Popup):
pass
class MyPracticeApp(App):
def build(self):
return Debit()
if __name__ == "__main__":
MyPracticeApp().run()
Выход
![Popup](https://i.stack.imgur.com/Xq5Mt.png)